Android上的16位RAW RGB_565图像

时间:2013-07-24 16:40:54

标签: java android bitmap rgb 16-bit

我试图从嵌入式相机(datasheet here)获得一个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字节。

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

corrupted image

99%的时间。但是,我能够获得看起来像这样的未损坏的图像:

uncorrupted image

很少见。有没有人有任何关于为什么会这样的建议?非常感谢!

更新:

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

2 个答案:

答案 0 :(得分:0)

我认为问题是因为你的配置Bitmap.Config.RGB_565。 以下是Android文档的摘录

  

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

希望这有帮助

答案 1 :(得分:0)

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

结果是交换了每个像素的字节。即,将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

image 2