2012-05-20 33 views
0

我有一个用python PIL创建的包含高度图(正值)的png文件。Android:如何获得单个通道的像素16位PNG位图

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

我在Android上阅读文件与BitmapFactory.decodeStream(<...data input stream...>);

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

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

相反,我希望在0正值和65535

我发现,值-16250872二进制是1111111111111111111111111111111111111111000010000000100000001000

这表明信息依赖于所述第一至少16位显著。

我尝试getPixel(i,j)&0xffff我得到了一个合理的值,但我不知道endianess:我应该翻转2个提取的字节?

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

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

+0

你得到否定的原因是因为它是一个包装的价值。例如:白色(255,255,255,255)将打包为11111111 11111111 11111111 11111111 –

+1

是的,我知道。例如,在一个32bpp像素的RGBA位图中,像素被存储为4个字节(0到255之间的值),打包成一个32位整数。不过,我有一个16 bpp,单通道PNG与单色通道(灰色级别)。获得该价值的正确方法是什么? – alexroat

回答

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

你是救世主!谢谢! – Sucho

0

我假设你试图获得图像中的像素的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] + ")"; 
} 

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

希望这会有所帮助! :)

+0

谢谢你的答案Zeveso。然而,我并不是想要获得RGB值,而是获得像素的单个灰度值。我有PNG单通道,每像素16位。在该像素中,存在0和2^16-1(65535)之间的单个高度值。 – alexroat