Android 获取屏幕指定坐标的颜色
来源:互联网 发布:白贺翔 网络架构师 编辑:程序博客网 时间:2024/04/19 08:58
用到的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; @Override protected 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); } @Override public 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() { Point size = new Point(); DisplayMetrics metrics = new DisplayMetrics(); Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay(); defaultDisplay.getSize(size); defaultDisplay.getMetrics(metrics); final ImageReader imageReader = ImageReader.newInstance(size.x, size.y, PixelFormat.RGBA_8888, 1); mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture", size.x, size.y, metrics.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
阅读全文
0 0
- Android 获取屏幕指定坐标的颜色
- c#获取屏幕上某坐标点的颜色
- java获取屏幕上某坐标点的颜色
- Android获取点击屏幕的位置坐标
- AS3 利用获取指定有效颜色的方法来获取最亮颜色的坐标数值
- android获取屏幕坐标点
- android控件获取屏幕坐标
- 获取android屏幕坐标相关
- android: onKeyDown以及获取屏幕的点的坐标
- android 获取控件在屏幕里的坐标
- android view获取在屏幕上的绝对坐标
- Android 高德地图获取屏幕中心的经纬度坐标
- 获取鼠标在屏幕上的坐标和颜色值(RGB)
- 取Canvas指定坐标的颜色
- opengl 指定清除屏幕用的颜色
- Android获取view某个坐标的颜色值,更改状态栏颜色
- Android 屏幕坐标/视图坐标/布局坐标三者间的关系
- qt获取电脑的屏幕坐标
- NAND flash和NOR flash的区别详解
- LeetCode 746. Min Cost Climbing Stairs(动态规划)
- 图像分割(二)边界跟踪法
- Atcoder 500 Wide Flip 思维
- 我们常用的一些命令在cmd下显示不是内部命令,如何解决?
- Android 获取屏幕指定坐标的颜色
- [Java Swing图形界面开发与案例详解.pdf 免费下载
- caffe 加权交叉熵损失函数层(weighted sigmoid_cross_entropy_loss_layer)添加方法
- @result参数传递方法
- Android 8.0系统源码分析--应用进程启动过程分析
- logistic回归
- UDP实现的简易双向聊天功能
- 《块数据》.pdf 免费下载
- caffe-windows and ECO visual studio 工程配置及编译