Android位图使用8位像素代替32位像素?

3
我有一些原始图片文件(灰度传感器数据),每个字节都是一个像素的灰度值。因此,所有像素都是8位值。在我的本地代码中,我处理这些(原始)字节(图像处理),然后将字节数组传递给Java虚拟机,并使用DirectByteBuffer(Java-NIO)。
在我的Java代码中,我想在ImageView中绘制图像数据。因此,我使用位图将我的图像数据放入其中。以下是我在Java端执行的操作:
// getLeftImageData() is the native function that returns the
// DirectByteBuffer with the imagedata to be drawn. Each Byte
// is one pixel value.
IntBuffer leftImageData = getLeftImageData().asIntBuffer();
int[] arrayL = new int[leftImageData.remaining()];
leftImageData.get(arrayL);
Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bmpL = Bitmap.createBitmap(1920/4, 1080/4, conf);
bmpL.setPixels(arrayL, 0, 1920, 0, 0, 1920/4, 1080/4);
ImageView imageL = (ImageView)findViewById(R.id.imageLeft);
imageL.setImageBitmap(bmpL);

这是我的问题。目前一切都很好,但是:setPixels()方法需要一个int数组,其中每个int值必须是一个像素值。因此,我将DirectByteBuffer视为IntBuffer(使用asIntBuffer()方法)。但这并不是我想要的,因为现在4个像素(= 4个字节)被合并为一个整数像素值。你明白我的意思吗?没有办法使用字节数组设置位图的像素。你只能传递一个整数数组。所以我必须修改我的字节数组(当然还要将其增加到原始大小的4倍),才能以32位整数格式拥有我的8位值。

你有什么想法,如何在Android ImageView中显示图像数据而无需修改字节数组吗?也许有一种方法可以不使用位图等东西...? 我对Android非常陌生。


你需要将 每像素1字节 转换为 每像素4字节 的数据吗?你可以在每个字节的右侧填充三个0字节。 - S.D.
是的,但那样我就必须修改/增加数组大小,这非常耗费时间和内存。我正在寻找另一种方法,而不必修改数组。 - mschoenebeck
1
制作符合Android标准的位图的示例,从灰度图像此处获取。 - Seva Alekseyev
@mschoenebeck,setPixels() 是在 Bitmap 中本地实现的,因此没有覆盖它以使用 1bpp 数组的机会。唯一的解决方案是创建另一个数组,正如其他人所指出的那样。 - S.D.
1个回答

0

看这里:在Android中将byte[]渲染为位图,并根据您的问题进行调整。

以防万一,ARGB_8888表示每个像素的每个通道(alpha、red、green、blue)为1字节,幸运的是等于32位。


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