xamarin YUV420888 OnImageAvailable在Y缓冲区返回错误图像

gj3fmq9x  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(114)

我在Xamarin.Forms Android应用程序中使用YUV420888开发了一个图像处理器。
相同的代码可以在Android 10华为P20上运行,但不能在Sonim XP10 Android 12上运行:

var buffer = image.GetPlanes()[0].Buffer;
var bytes = new byte[buffer.Capacity()];
buffer.Get(bytes);

在Sonim上,我得到的图像不是清晰图像,而是以下图像:
From Sonimm XP10 Android 12
在华为P20上一切正常:
From Huawei P20
有人知道为什么我在索尼姆的形象不好吗?
谢谢大家!

######## 精度:

当我创建imageReader示例时,我使用以下代码:

var map = (StreamConfigurationMap)characteristics.Get(CameraCharacteristics.ScalerStreamConfigurationMap);

Size[] sizeList = map.GetOutputSizes((int)ImageFormatType.Yuv420888);
foreach (var size in sizeList)
{
    if (size.Width == 1280 && size.Height < 1280)
    {
        idealPhotoSize = size;
        break;
    }
}
imageReader = ImageReader.NewInstance(idealPhotoSize.Width, idealPhotoSize.Height, ImageFormatType.Yuv420888, 3);

所以我确定宽度是1280高度是960。
因此宽度= 1280;高度= 960;
当我通过OnImageAvailable(ImageReader阅读器)接收图像并通过以下代码获取图像时:

image = reader.AcquireLatestImage();

从Sonim中,图像指示宽度1280和高度960的良好大小,但缓冲区为1 474 304字节。
从华为P20,图像表明宽度1280和高度960的良好大小与1 228 800字节的缓冲区.
因此,似乎Android 12/10或相机设备不工作的方式相同.

sd2nnvve

sd2nnvve1#

好的,
我解决了我的问题。我误解了YUV和RowStride。
因为我处理了所有字节数组而没有检查RowStride,所以导致了该行为。
所以我必须读取每一行,只取对应于图像宽度的字节。
对于P20,RowStride与宽度完全对应,在这种情况下,我必须获取Planes()[0]的所有字节数组。Buffer
对于Sonim,RowStride是1536,因此我必须解析bytes数组,以便只获取每行的前1280个字节。

相关问题