Android 获取屏幕指定坐标的颜色
2017-12-24 13:04
3059 查看
用到的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/#readmehttps://developer.android.com/reference/android/media/ImageReader.html#getSurface()
https://www.jianshu.com/p/d7eb518195fd
相关文章推荐
- android获取UI控件在屏幕上的坐标
- android控件获取屏幕坐标
- android: onKeyDown以及获取屏幕的点的坐标
- Android屏幕长宽以及控件坐标获取
- 精确获取屏幕尺寸 判断是否是平板 文字根据状态更改颜色 android:textColor 背景色根据状态更改颜色 android:backgroup 启动APK的默认Activit
- android获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- android 获取屏幕宽高 和 获取控件坐标
- Android 高德地图获取屏幕中心的经纬度坐标
- android: onKeyDown以及获取屏幕的点的坐标
- Android利用adb shell命令获取屏幕的点击坐标之横屏竖屏的区别
- android 获取控件在屏幕里的坐标
- Android 获取屏幕事件的坐标
- android 百度地图 marker固定在屏幕中心,动态获取可移动地图的中心坐标
- Android中获取屏幕X,Y轴坐标
- Android获取View 的坐标和屏幕高度、状态栏高度、标题栏高度
- android获取控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- C#简单获取屏幕鼠标坐标点颜色方法介绍
- android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度
- android 获取控件在屏幕中的位置(坐标)
- 获取鼠标在屏幕上的坐标和颜色值(RGB)