2012-12-07 38 views
1

我正在使用下面的代碼來獲取灰度圖像的R,G,B值(它們全都相同) 但輸出給了我負值。負灰度值 - 位圖

這是爲什麼?我完全困惑。

for (int i=0;i<bb.getWidth();i++){ 
          for (int j=0;j<bb.getHeight();j++){ 
            long temp=bb.getPixel(i, j); 
            int a=(int)temp; 
            ByteBuffer b = ByteBuffer.allocate(4); 
            b.putInt(a ); 
            byte[] result = b.array();          
            Log.d("gray value is=", String.valueOf((int)result[1])); 
           // Log.d("gray value is=", String.valueOf(getLastBytes(a))); 
          } 
         } 

這裏結果[1]應該對應於'R'值。那麼它是如何消極的?

+0

檢查結果變量的大小,灰度多年平均值有RGB其唯一的2維 – nayab

+0

@Nadosh這將如何幫助? –

+0

@Nadosh你錯誤地解釋了......在android中的灰度存儲方面,有8個字段......灰度圖像在存儲方面具有相等的R,G,B字節。例如。溫度有像133585214 –

回答

2

試試這個

 long temp=bb.getPixel(i, j); 
     R = Color.red(temp); 
     G = Color.green(temp); 
     B = Color.blue(temp); 
+0

Thanx!這只是這麼簡單:) –

2

這是因爲所有類型的改變,與此相關的鑄造,而且這些類型簽訂的事實。

首先,getPixel()的初始返回值是int(32位或4字節,ARGB一個字節)。把它放到很長的位置似乎是不必要的,因爲你只需將它重新放入int。但迄今爲止這麼好。

當你得到字節數組時,ARGB的四個字節是正確的,所以result[1]應該是Red值。但是,如果在日誌語句中將該字節隱式轉換爲int,則會發生問題。

由於int是四個字節長,並且兩個intbyte被簽名的類型,符號擴展適用於結果,即

  • 字節0x48將延伸到一個int 0x00000048
  • 字節0x88將延伸到一個int 0xFFFFFF88

因此,當您將結果打印到日誌時,它會將您的數據的十進制值解釋爲負數。不可否認,即使你沒有施放並只輸出byte的值,該類型仍然是有符號的(即它從-128到127而不是0到255,而0x88意味着-120),所以日誌輸出將是一樣。

如果要註銷實際0-255值,修改代碼以位掩碼的像素數據的int擊敗符號擴展:

int red = (int)(result[1] & 0xFF); 
Log.d("gray value is=", String.valueOf(red)); 
+0

非常感謝你...刪除了我所有的疑惑! :) –