我试图从嵌入式相机(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字节。
现在,我的图像看起来像这样:
99%的时间。但是,我能够获得看起来像这样的未损坏的图像:
很少见。有没有人有任何关于为什么会这样的建议?非常感谢!
更新:
似乎所有像素都在正确的位置,但是它们的RGB值混合在一起。例如,两张照片之间的白色部分是相同的,因为RGB的顺序无关紧要白色。然而,很明显颜色是混合的,因为红色椅子在损坏的图像中显示为蓝色,蓝色背包在损坏的图像中显示为绿色
答案 0 :(得分:0)
我认为问题是因为你的配置Bitmap.Config.RGB_565。 以下是Android文档的摘录
每个像素存储在2个字节上,只有RGB通道被编码:红色以5位精度(32个可能值)存储,绿色以6位精度存储(64个可能值),蓝色存储为5位精度。此配置可能会产生轻微的视觉瑕疵,具体取决于源的配置。 例如,如果没有抖动,结果可能会显示绿色。为了获得更好的结果,应该应用抖动。当使用不需要高色彩保真度的不透明位图时,此配置可能很有用。
希望这有帮助
答案 1 :(得分:0)
结果是交换了每个像素的字节。即,将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