【问题标题】:Android Bitmap 8-bit pixels instead of 32-bit ones?Android Bitmap 8 位像素而不是 32 位像素?
【发布时间】:2013-05-22 17:12:58
【问题描述】:

我有一些原始图片文件(灰度传感器数据),其中每个字节都是一个像素灰度值。所以所有像素都是 8 位值。在我的本机代码中,我处理那个(原始)字节(图像处理),然后,我使用 DirectByteBuffer (Java-NIO) 将字节数组传递给 Java-VM。

在我的 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 倍的原始大小)才能使我的 8 位值采用 32 位整数格式。

您有什么想法,我如何在 android ImageView 中显示图像数据而无需修改字节数组?也许有一种不使用位图或其他东西的方法..?顺便说一句,我对 android 很陌生。

【问题讨论】:

  • 您需要1 byte pre-pixel4 byte per-pixel 的数据翻译吗?您可以在每个字节的右侧填充三个字节的 0。
  • 是的,但是我将不得不修改/增加数组大小,这是非常耗时和内存昂贵的。我正在寻找另一种无需修改数组的方法。
  • 从灰度图像here制作Android兼容位图的示例。
  • @mschoenebeck setPixels() if Bitmap 是本机实现的,因此没有机会覆盖它以使用 1bpp 数组。唯一的解决方案是创建另一个数组,正如其他人指出的那样。

标签: java android bitmap


【解决方案1】:

看看这里:Render a byte[] as Bitmap in Android 并根据您的问题进行调整。

为了以防万一,ARGB_8888 表示每个通道 1 个字节(alpha、红色、绿色、蓝色)1 个像素,很高兴等于 32 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 2022-01-02
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2011-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多