繁体   English   中英

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

[英]Android: How to get pixels of a single channel 16bit PNG Bitmap

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

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

我使用BitmapFactory.decodeStream(<...data input stream...>);在android上读取了文件

我正确地通过getWidth()getHeight()获得图像的大小。

但是,当我循环遍历调用getPixel(i,j)的像素时getPixel(i,j)我获得了负值,例如:-16776192 -16250872 -16250872 -16250872 -16250872 -16249848 ....

相反,我期望一个介于0和65535之间的正值。

我发现二进制值-16250872是1111111111111111111111111111111111111111111000010000000100000001000

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

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

有没有办法以更优雅,更便携的方式完成这种转换?

注意:该文件不是彩色(RGBA)PNG,而是具有每个像素单个16位值的灰度PNG图像。

我使用本文中的注意事项自行找到了解决方案: Android:加载alpha蒙版位图

基本上,如果直接从位图工厂加载16位灰度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
          ...
    }

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

返回指定位置的颜色。 如果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] + ")";
}

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

希望这可以帮助! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM