我有文件“Image_RGB565.raw”,其中包含RGB565格式的图像缓冲区。我希望这个图像显示在ImageView中。没有额外的转换为RGB888的代码是否可能?
我试过
BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bitmap = BitmapFactory.decodeFile("Image_001_RGB565.raw");
但位图为空。
然后我也尝试使用bytearray加载
BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bitmap = BitmapFactory.decodeFile(decodeByteArray(data, 0, data.length, opt);
请指导我改正方向。我的图片尺寸为160x160。
答案 0 :(得分:6)
首先,您应避免将原始图像存储或传输到手机;最好将它们转换为PC上的压缩格式,如PNG或JPG,并将该图稿部署到设备上。
但是,如果由于某种不寻常的原因你真的想加载原始图像,这是一种方法:
1)创建一个Bitmap.Config.RGB_565
bitmap来包含您的图片。您必须知道原始图像的高度和宽度。
2)创建一个足够大小的ByteBuffer
来包含位图中的所有像素;图像的每个扫描线采用 stride 像素量,这可能超过图像的宽度。每条线上的额外填充是必要的。 (有时候,通过巧合,步幅与宽度相同 - 没有填充;这是不可靠的,总是考虑到步幅,你的补偿。)
使用ByteBuffers,了解读写偏移量非常重要。在您写入ByteBuffer之后,您flip
将其读取这些字节。
3)将文件中的原始像素读入您的ByteBuffer
,一次扫描一条扫描线,并在线之间留出适当的步幅。
4)使用Bitmap.copyPixelsFromBuffer()
。
5)弃掉ByteBuffer
答案 1 :(得分:2)
我是这样做的,而且很有效。
位图位图= Bitmap.createBitmap(captureWidth,captureHeight,Bitmap.Config.RGB_565);
ByteBuffer buffer = ByteBuffer.wrap(data);
bitmap.copyPixelsFromBuffer(缓冲液);