使用Samsung S20将ImageProxy转换为Bitmap时,在CameraX中分析时出现绿色位图

5

我已经使用了下面的代码。但是当我使用imageproxy将位图转换为最新的智能手机,比如三星s20时,它显示出绿色的位图。

这个底部代码在过去的设备上运行良好,有人遇到类似问题吗?

输入图片说明

fun Image.toBitmap(): Bitmap {
val yBuffer = planes[0].buffer // Y
val uBuffer = planes[1].buffer // U
val vBuffer = planes[2].buffer // V

val ySize = yBuffer.remaining()
val uSize = uBuffer.remaining()
val vSize = vBuffer.remaining()

val nv21 = ByteArray(ySize + uSize + vSize)

//U and V are swapped
yBuffer.get(nv21, 0, ySize)
vBuffer.get(nv21, ySize, vSize)
uBuffer.get(nv21, ySize + vSize, uSize)

val yuvImage = YuvImage(nv21, ImageFormat.NV21, this.width, this.height, null)
val out = ByteArrayOutputStream()
yuvImage.compressToJpeg(Rect(0, 0, yuvImage.width, yuvImage.height), 50, out)
val imageBytes = out.toByteArray()
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
}

1
我对android-camerax一无所知,但似乎你在数组的列大小上出了些问题。请再次检查行、列、通道以及步幅。 - MeiH
嗨@You.Brighton,我在不同的设备上得到了相同的结果,您能否就此问题提供一些帮助? - Bhavnik
我在同一台设备上遇到了这个问题,但只出现在其中一个应用程序中。在另一个 Android 11 应用程序上运行正常。 - Richard Onslow Roper
4个回答

0
对我来说问题是不同的设备在分析视频时具有不同的速率。稍后会详细说明,但主要问题是,在使用转换后的位图之前,使用字节缓冲从imageProxy访问数据。ImageProxy对象似乎是硬编码的传递引用Java对象,这意味着即使通过状态提升或其他方式将该ImageProxy从分析器传递出去,如果在分析方法内修改其字节,则会影响传递的值。因此,在代码中的任何位置使用值之前,请务必调用
<yourImageProxyObject>.planes[index_used].buffer.rewind()

这会将光标移回到零位置,使读者能够访问正确的字节而不是随机的噪音。


0
如果您正在使用 camerax 库的 1.3.0 版本或更高版本,请尝试从 Android 官方文档 中使用 imageProxy.toBitmap() 方法。
如果您使用的是较低版本,请尝试以下代码。

val bitmap = ImageConvertUtils.getInstance().getUpRightBitmap(InputImage.fromMediaImage(image,imageProxy.imageInfo.rotationDegrees))


以下是谷歌示例的另一种选择。

BitmapUtils.java


0
val nv21 = ByteArray(ySize + uSize + vSize)

并非每个YUV_420_888缓冲区实际上都是NV21格式。您还需要处理其他格式,例如NV12、YU12和YV12。在相机示例Github存储库中有一个YUV到位图转换器示例,请尝试它,它应该可以正常工作。


谢谢你的回答。我找到了解决方案。那是分辨率问题。 - You.Brighton
有什么问题吗? - Richard Onslow Roper

0

我遇到了类似的问题。我首先尝试了一款低端安卓设备,然后使用了一款高端设备,但两者都遇到了同样的问题。

我尝试过以下方法:

  • 以RGB格式保存而非YUV格式
  • 将imageFormat从Nv21更改为YUV2
  • 尝试使用自定义函数从Nv21转换为其他格式
  • 将其转换为位图,然后再转换为[]byte

没有任何作用。在若干款三星、华为和LG不同品质和年龄的设备上仍能正常工作。

帖子链接:Image.Analyzer gives out unclear picture from camera on certain devices


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接