Android ImageReader.acquireLatestImage returns invalid JPG

前端 未结 6 905
悲&欢浪女
悲&欢浪女 2020-12-01 13:21

I am using Android ImageReader class to receive Bitmaps from MediaProjection.createVirtualDisplay method.

My code so far looks like this:

mProjectio         


        
6条回答
  •  再見小時候
    2020-12-01 14:17

    I tried to use many example code. But none of those codes are working. I mixed those codes myself. And I created working sample code.

        final DisplayMetrics dm = getResources().getDisplayMetrics();
        mImageReader = ImageReader.newInstance(dm.widthPixels, dm.heightPixels, PixelFormat.RGBA_8888, 1);
        mProjection.createVirtualDisplay("screen-mirror", dm.widthPixels, dm.heightPixels, dm.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), vdCallback, mHandler);
        mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Image image = reader.acquireLatestImage();
                if (image == null){
                    return;
                }
                final Image.Plane[] planes = image.getPlanes();
                final ByteBuffer buffer = planes[0].getBuffer();
                int offset = 0;
                int pixelStride = planes[0].getPixelStride();
                int rowStride = planes[0].getRowStride();
                int rowPadding = rowStride - pixelStride * dm.widthPixels;
                // create bitmap
                Bitmap bitmap = Bitmap.createBitmap(dm.widthPixels+rowPadding/pixelStride, dm.heightPixels, Bitmap.Config.ARGB_8888);
                bitmap.copyPixelsFromBuffer(buffer);
                imageView.setImageBitmap(bitmap);
                image.close();
            }
        }, mHandler);
    

提交回复
热议问题