2012-05-20 154 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