捕获的Android camera2 YUV 2048x1536图像被拉伸不是预览

问题描述

我正在尝试捕获YUV图像,但是被拉长了。我正在按照https://github.com/googlearchive/android-Camera2Basic使用Android Camera2。 Android SDK是28。

当我使用ImageReader从setonImageAvailableListener()方法中捕获YUV 2048x1536中的摄像机帧时,我面临一种奇怪的行为。捕获范围很广:

YUV 2048x1536 stretched

我做什么:

pictureImageReader.setonImageAvailableListener(
            reader -> {
              Image image = reader.acquireLatestimage();
              if(image != null){
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] bytes = new byte[buffer.capacity()];
                buffer.get(bytes);
                Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes,bytes.length,null);
                image.close();
              }
            },mBackgroundHandler);

要将图像转换为位图,我使用了以下How to convert android.media.Image to bitmap object?

Image image = reader.acquireLatestimage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);
Bitmap bitmapImage = BitmapFactory.decodeByteArray(bytes,null);

但是,如果我更改分辨率,则捕获效果很好(YUV 960x720):

YUV 960x720 ok

我不知道为什么扩展YUV 2048x1536中的捕捉而在YUV 960x720中不是吗?唯一的变化是分辨率

谢谢

解决方法

设备是否在其流配置图中将2048x1536实际列出为受支持的大小?有时,摄像头设备会接受它们未列出的分辨率,但无法正确输出。

如果列出了该尺寸,那么很遗憾,这可能只是该设备的相机实现上的错误。

(此外,您似乎正在捕获JPEG图像,而不是未压缩的YUV,但这不一定很重要)。