如何将RGB565缓冲区加载到ImageView

7

我有一个名为"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");

但是位图为空(null)。

我之后也尝试了使用字节数组加载

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);

请指导我正确的方向。我的图像尺寸为160x160。

2个回答

7

首先,您应该避免将原始图像存储或传输到手机上;最好在电脑上将它们转换为压缩格式,如PNG或JPG,并将该艺术作品部署到设备上。

但是,如果由于某种不寻常的原因,您确实想要加载原始图像,则可以采用以下方法:

1)创建一个Bitmap.Config.RGB_565位图以包含您的图像。您必须知道原始图像的高度和宽度。

2)创建一个足够大的ByteBuffer,以包含位图中的所有像素;每个图像的扫描线需要一定量的步幅像素,这可能比图像的宽度更多。每行的这个额外填充是必需的。(有时幸运的是步幅与宽度相同-没有填充;但不能依赖此情况,总是考虑步幅进行偏移。)

使用ByteBuffer时,了解读取和写入偏移量非常重要。在向ByteBuffer中写入数据后,需要flip以读取这些字节。
3)一次一个扫描线地从文件中读取原始像素到您的ByteBuffer中,并在行之间使用适当的跨距间隔。
4)使用Bitmap.copyPixelsFromBuffer()
5)丢弃ByteBuffer

你好威尔,按照你的建议,我成功地显示了图片。非常感谢。 - JRC
@JRC 很高兴能帮助到你;请将答案标记为“已接受”,并给我一些积分! - Will

2

我是这样做的,它有效。

Bitmap bitmap = Bitmap.createBitmap(captureWidth, captureHeight, Bitmap.Config.RGB_565);

ByteBuffer buffer = ByteBuffer.wrap(data);

bitmap.copyPixelsFromBuffer(buffer);


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