Android 获取屏幕指定坐标的颜色
用到的API
MediaProjectionManager
MediaProjection
VirtualDisplay
ImageReader
原理:利用Android系统提供的投影功能把屏幕投影到ImageReader
中,通过ImageReader
获取到Bitmap
,调用Bitmap
的getPixel(x, y)
方法获取到指定坐标的颜色。
代码
创建虚拟显示器
private static final int REQUEST_MEDIA_PROJECTION = 1;private MediaProjectionManager mMediaProjectionManager;private MediaProjection mMediaProjection;private VirtualDisplay mVirtualDisplay; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);assert mMediaProjectionManager != null;startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(),REQUEST_MEDIA_PROJECTION);}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_MEDIA_PROJECTION) {if (resultCode != Activity.RESULT_OK) {Log.i(TAG, "User cancelled");Toast.makeText(this, "User cancelled!", Toast.LENGTH_SHORT).show();return;}Log.i(TAG, "Starting screen capture");mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);setUpVirtualDisplay();}}private void setUpVirtualDisplay() {DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getRealMetrics(dm);ImageReader imageReader = ImageReader.newInstance(dm.widthPixels, dm.heightPixels, PixelFormat.RGBA_8888, 1);mMediaProjection.createVirtualDisplay("ScreenCapture",dm.widthPixels, dm.heightPixels, dm.densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,imageReader.getSurface(), null, null);GBData.reader = imageReader;}
获取指定坐标的颜色
public class GBData {private static final String TAG = "GBData";static ImageReader reader;private static Bitmap bitmap;public static int getColor(int x, int y) {if (reader == null) {Log.w(TAG, "getColor: reader is null");return -1;}Image image = reader.acquireLatestImage();if (image == null) {if (bitmap == null) {Log.w(TAG, "getColor: image is null");return -1;}return bitmap.getPixel(x, y);}int width = image.getWidth();int height = image.getHeight();final Image.Plane[] planes = image.getPlanes();final ByteBuffer buffer = planes[0].getBuffer();int pixelStride = planes[0].getPixelStride();int rowStride = planes[0].getRowStride();int rowPadding = rowStride - pixelStride * width;if (bitmap == null) {bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);}bitmap.copyPixelsFromBuffer(buffer);image.close();return bitmap.getPixel(x, y);}
}
在代码中使用
int color = GBData.getColor(x,y)
参考
- https://github.com/googlesamples/android-ScreenCapture/#readme
- https://developer.android.com/reference/android/media/ImageReader.html#getSurface()
- https://www.jianshu.com/p/d7eb518195fd
Android 获取屏幕指定坐标的颜色相关推荐
- Android 获取屏幕指定坐标的颜色——“按键精灵”基础
原理:借助Android系统提供的ImageReader读取当前屏幕,然后转化为Bitmap对象,Bitmap像素宽高正好和当前屏幕一致,然后调用Bitmap中的getPixel(x, y)方法获取目 ...
- c语言 获取 屏幕 像素坐标和颜色,在屏幕上获取颜色和绝对坐标,方便地选择像素...
问题 我寻找一个工具,可以让我选择屏幕上的像素,并获得RGB颜色和绝对(x,y)的位置. ubuntu有没有什么类似的东西? 答案1 最合适的是,一个Windows的小工具ColorPix (通过wi ...
- python 获取屏幕颜色_Python3 获取手机屏幕指定坐标点的 RGBA 和 16 进制颜色
# -*- coding: utf-8 -*- # @file: test.py # @author: xiaoxiao # @date : 2019/8/14 from PIL import Ima ...
- android 获取屏幕的宽高
今天,讲讲android如何获取屏幕的宽高. // 通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); getWindowManag ...
- android获取键盘状态,Android获取屏幕方向及键盘状态的小例子
Android获取屏幕方向及键盘状态的小例子 复制代码 代码如下: Configuration config = getResources().getConfiguration(); if (conf ...
- android获取屏幕像素密度DPI、density、屏幕宽高
获取手机屏幕像素密度 dpi DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDe ...
- Android 获取屏幕尺寸与密度
遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适.有的同事提出了依据分辨率来区分不同的屏幕,但是单WVGA就支持好 ...
- android获取导航栏宽高,Android获取屏幕的宽高度、状态栏、标题栏、导航栏、编辑区域高度...
目录 0.相关文章: 1.获取屏幕款高度 代码: /** * 获取屏幕宽度 * * @param context 上下文对象 * @return int */ public static int ge ...
- Android 获取屏幕尺寸(设备对角线的英寸数)
使用屏幕的实际的宽高,根据勾股定理来计算设备的尺寸. 由于Android系统版本的不同和有的设备具有虚拟按键,需要根据不同的SDK的版本使用不同的方法来获取屏幕的实际宽高. 计算方法: Math.sq ...
最新文章
- ICLR 2020 | 如何解决图像分类中的类别不均衡问题?不妨试试分开学习表征和分类器...
- ES学习笔记之-AvgAggregation的实现过程分析
- Android Full-Disk Encryption
- python零基础系统学习教程之Python 变量类型
- MongoDB在linux下的启动
- P2805 [NOI2009]植物大战僵尸
- 虎牙tv是用php写的吗,huya虎牙php_麦麦同学
- 汇川技术小型PLC梯形图编程系列教程(1)小型PLC型号H123U简介
- 谷歌查排名php,谷歌排名检查:PHP函数来获得googlerank关键词 | LsevenTT博客-站群哥...
- 秋天的第一杯奶茶刷屏互联网,其背后又蕴含着哪些营销逻辑呢?
- Maven Helper 插件介绍
- Windows基础 加固
- 4PCS、super4PCS粗配准算法理解
- JIRA实践系列-JIRA与teambition对接指南
- 【GANs学习笔记】(十八)LAPGAN、ProGAN、SRGAN
- android 红包功能,[原创]实现某app的抢红包功能
- ASP.NET常见命名空间及其功能描述
- 一起学Netty(六)之 TCP粘包拆包场景
- 导出浏览器cookie
- 字符串替换c语言you替代we,字符串替换_无以伦比的暖阳的技术博客_51CTO博客
热门文章
- Matlab 学习网站总结
- 足球经理 2018 for Mac(体育类模拟经营游戏)
- myeclipse的An internal error occurred during: “Initialize Control Control“错误!!!
- 知识源于生活而高于生活
- 【区块链技术工坊47期】众享比特:区块链医疗方案和分布式认证系统
- 行为层(JavaScript)
- ThinkPad E440 Ubuntu 无线驱动总是掉线的问题
- 本地配置iis信息服务器,如何配置本地IIS服务器.doc
- 正则表达式 分割地址 获取省市区详细地址
- selenium自动化之iframe弹窗操作实例