Android 获取屏幕指定坐标的颜色

来源:互联网 发布:白贺翔 网络架构师 编辑:程序博客网 时间:2024/04/19 08:58

用到的API

  • MediaProjectionManager
  • MediaProjection
  • VirtualDisplay
  • ImageReader

原理:利用Android系统提供的投影功能把屏幕投影到ImageReader中,通过ImageReader获取到Bitmap,调用BitmapgetPixel(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
原创粉丝点击