Android屏幕截图错误:RGBA覆盖BLOB格式缓冲区应具有height == width

问题描述

我正在尝试使用服务为Android设备(三星galaxy Tab S5e)截图。 我正在使用here中的代码

链接代码中,使用ImageReader.newInstance(mWidth,mHeight,PixelFormat.RGBA_8888,2);。请注意PixelFormat.RGBA_8888。现在,这将不允许我编译我的项目,并且遇到错误Error: Must be one of: ImageFormat.UNKNowN,ImageFormat.RGB_565... etc

所以我尝试将PixelFormat.RGBA_8888更改为ImageFormat.JPEG并进行编译。但是,我的应用现在崩溃,并显示以下消息:

RGBA覆盖BLOB格式缓冲区应具有height == width

我尝试将PixelFormat.RGBA_8888更改为0x40x1ImageFormat.RGB_565等。这样做通常会导致消息异常:

生产者输出缓冲区格式0x1与ImageReader的配置缓冲区格式0x4不匹配。

这与onImageAvailable(ImageReader reader)中描述的格式有所关联。

我看过following SO post,看来正确的格式是特定于设备的,但是我已经尝试了全部,错误是上述之一。

我全神贯注(而且我是Java / Android newb),所以真的可以使用一些帮助。

解决方法

创建图像阅读器如下,

 ImageReader imageReader =ImageReader.newInstance(width,height,PixelFormat.RGBA_8888,MAX_IMAGE_COUNT);

然后在图像可用侦听器上创建位图为,

          try {
                image = reader.acquireLatestImage();
                if (image != null && mImagesProduced == 0){
                    Image.Plane[] planes = image.getPlanes();
                    Buffer imageBuffer = planes[0].getBuffer().rewind();

                    int pixelStride = planes[0].getPixelStride();
                    int rowStride = planes[0].getRowStride();
                    int rowPadding = rowStride - pixelStride * width;

                    // create bitmap
                    bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride,Bitmap.Config.ARGB_8888);
                    bitmap.copyPixelsFromBuffer(imageBuffer);

                    saveImage(context,bitmap);
                }

希望它有效