1

我正在尝试从嵌入式相机(此处的数据表)获取分辨率为 80 x 60 的 16 位彩色图像。我成功地从相机中获取了 9600 (80 * 60 * 16 / 8) 字节,但显示图像时出现问题。我正在使用以下代码将字节数组转换为位图:

bm = Bitmap.createBitmap(80, 60, Bitmap.Config.RGB_565);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(jpegBytes));

jpegBytes 是图像字节的数组,长度为 9600 字节。

现在,我得到的图像看起来像这样:

损坏的图像

99% 的时间。但是,我能够获得如下所示的未损坏图像:

未损坏的图像

非常稀有。有人对为什么会发生这种情况有任何建议吗?非常感谢!

更新:

似乎所有像素都在正确的位置,但它们的 RGB 值混合在一起。例如,两张照片之间的白色部分是相同的,因为 RGB 的顺序对于获得白色并不重要。但是,很明显颜色是混用的,因为红色椅子在损坏的图像中显示为蓝色,而蓝色背包在损坏的图像中显示为绿色

4

2 回答 2

0

我相信问题是因为您的配置 Bitmap.Config.RGB_565。以下是android文档的摘录

每个像素存储在 2 个字节上,仅对 RGB 通道进行编码:红色以 5 位精度存储(32 个可能值),绿色以 6 位精度存储(64 个可能值),蓝色以 5 位精度存储精确。此配置可能会产生轻微的视觉伪影,具体取决于源的配置。例如,如果没有抖动,结果可能会显示为绿色。为了获得更好的结果,应该应用抖动。当使用不需要高颜色保真度的不透明位图时,此配置可能很有用。

希望这可以帮助

于 2013-07-24T16:54:34.510 回答
0

将图像上传到手表时,我遇到了同样的问题。 图像1

原来每个像素的字节都被交换了。即0xF8 0x00加载的红色0x00 0xF8因此显示为蓝色阴影

val size = 115200   // (no of pixels * 2), 2 bytes per pixel (RGB_565)
val options = BitmapFactory.Options()
options.inPreferredConfig = Bitmap.Config.RGB_565
val image = BitmapFactory.decodeFile(File(this.cacheDir, "image.png").path, options)    // load image as bitmap
val buffer = ByteBuffer.allocate(size)
image.copyPixelsToBuffer(buffer)
val byteArray = ByteArray(size)
for (x in 0 until size){
    val y = if (x%2 == 0){ x+1 } else { x-1 }   // added this to swap adjacent bytes
    byteArray[x] = buffer[y]        //copy to byteArray while swapping adjacent bytes
}
// finally, send byteArray to watch

图 2

于 2020-12-16T18:08:57.130 回答