Android:如何获取单通道16位PNG位图的像素

时间:2012-05-20 01:08:09

标签: java android bitmap png 16-bit

我有一个用python PIL创建的png文件,其中包含一个高度图(正值)。

格式为:16bit的单通道(灰度级),因此每像素16位。

我用BitmapFactory.decodeStream(<...data input stream...>);

读取了android上的文件

我通过getWidth()getHeight()正确获取了图片的大小。

然而,当我循环调用getPixel(i,j)的像素时,我得到负值,如:-16776192 -16250872 -16250872 -16250872 -16250872 -16249848 ....

相反,我期望0到65535之间的正值。

我发现二进制值-16250872是1111111111111111111111111111111111111111000010000000100000001000

这表明信息依赖于前16个最低有效位。

我尝试使用getPixel(i,j)&0xffff并获得了合理的值,但是我不确定结束语:我应该翻转2个提取的字节吗?

有没有办法以更优雅和便携的方式进行此转换?

注意:文件不是彩色(RGBA)PNG,而是灰度级PNG图像,每个像素只有一个16位值。

2 个答案:

答案 0 :(得分:3)

我自己找到了一个解决方案,使用了这篇文章中的考虑: Android: loading an alpha mask bitmap

基本上,如果从位图工厂直接加载16位greylevel PNG,则像素格式将不正确。您需要使用RGBA 32位颜色格式将像素格式设置为ARGB_8888。然后你必须使用getPixel(i,j)获取所有像素,并使用0xffff屏蔽整数值。通过这种方式,您将获得预期的16位值。

这是我使用的代码的一部分:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig= Bitmap.Config.ARGB_8888;
Bitmap bmp=BitmapFactory.decodeStream(entity.getContent(),null,opt);
int W=bmp.getWidth();
int H=bmp.getHeight();
int px;
for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++)
    {
          px= bmp.getPixel(j, i)&0x0000ffff;//in px you will find a value between 0 and 65535
          ...
    }

答案 1 :(得分:0)

我假设您尝试获取图像中像素的RGB。如果这是正确的,那么你会发现以下内容很有帮助。

  

返回指定位置的Color。如果x或y超出界限(分别为负数或> = =宽度或高度),则抛出异常。

这是Bitmap.getPixel();

的引用

您需要做什么才能将其打印出来以便人类可读。我已经用android编程,但没有用android完成这个。我在我的一个程序中使用了以下函数。

public static int[] getRGBValue(BufferedImage bi, int x, int y) {
    int argb = bi.getRGB(x, y);
    int rgb[] = new int[] {
            (argb >> 16) & 0xff, // red
            (argb >>  8) & 0xff, // green
            (argb      ) & 0xff, // blue
    };
    return rgb;
}

public static String getStringOfRGB(int[] value) {
    return "Color: (" + value[0] + ", " + value[1] + ", " + value[2] + ")";
}

我不知道你想要做什么,所以上面的代码不会回答你的问题...但是应该帮助你找到你想要使用像素数据的答案。

希望这有帮助! :)