簡體   English   中英

java-將像素值轉換為0到255

[英]java - Converting Pixel values to 0 to 255

好的,我已經使用以下代碼從文件中提取了RGB值:

                    int r = cBuffer[1024*0+32*(j/32)+(j%32)] & 0xFF;
                    int g = cBuffer[1024*1+32*(j/32)+(j%32)] & 0xFF;
                    int b = cBuffer[1024*2+32*(j/32)+(j%32)] & 0xFF;

完成0xFF的“與”運算是因為我想將字節值轉換為無符號表示形式。

現在,我使用以下代碼形成實際像素:

int pixel = (r << 16) | (g << 8) | b;

現在的問題是當我打印( 使用SOP(pixel) )時,像素的值會得到如下數字:

Computed Pixel = -11119787
Computed Pixel = -13884637
Computed Pixel = -14081500
Computed Pixel = -12436417

我知道像素計算是正確的,因為使用這些值后得到的圖像是有效的。

現在我的問題是:

  • 為什么會有像素的任意值? 像素值應該在0到255之間嗎?
  • 給定rgb值,有什么辦法可以表示0到255之間的像素值? 那會是正確的表示嗎?

像素值是否應該在0到255之間?

否,您應該已經知道,因為您正在處理字節移位等問題,所以0-255將是無符號字節的值范圍,並且由於像素值通常由3個8位(即3字節)值組成,因此結果int絕對價值更高。

給定rgb值,有什么辦法可以表示0到255之間的像素值? 那會是正確的表示嗎?

不,如上所述,不能在0到255的范圍內表示24位像素值。通常應表示該范圍內的每個分量(r,g,b),即,一個像素將由3個值組成范圍0-255。

有一些表示可以將像素映射到0-255,但是您會丟失很多信息,因為您必須將其轉換為灰度或將rgb值“壓縮”為2或3位值,顯然不能容納8位值那么多的信息。

順便說一句,我不確定您的rgb-extraction例程是否正確或至少看起來很復雜(您是否檢查了值是否正確?)。 假設cBuffer是一個字節數組,表示未壓縮的32位顏色信息,則您可能會得到如下的rgb值:

//assuming the buffer to be in rgba format, i.e. 32-bit pixels with alpha information in the last byte
for( int i = 0; i < cBuffer.length; i+=4) {
  int r = cBuffer[i];
  int b = cBuffer[i + 1];
  int g = cBuffer[i + 2];
  int a = cBuffer[i + 3];

  //do whatever you want with the pixel
}

編輯:

根據您的評論,您希望獲得[0.0,1.0]范圍內的顏色值。 在這種情況下,您將獲得整數顏色值並將其除以最大顏色值(白色)。 假設您具有24位顏色(或32位argb並忽略了alpha分量),則可以執行以下操作:

int w = 255 << 16 | 255 << 8 | 255; //white = 0x00FFFFFF
int r = 255 << 16;  //red   = 0x00FF0000
int g = 255 << 8;   //green = 0x0000FF00
int b = 255;        //blue  = 0x000000FF

System.out.format( "white > int: %8d (real: %1.5f )\n", w, (double)w/w);
System.out.format( "red   > int: %8d (real: %1.5f )\n", r, (double)r/w);
System.out.format( "green > int: %8d (real: %1.5f )\n", g, (double)g/w);
System.out.format( "blue  > int: %8d (real: %1.5f )\n", b, (double)b/w);

輸出:

white > int: 16777215 (real: 1,00000 )
red   > int: 16711680 (real: 0,99609 )
green > int:    65280 (real: 0,00389 )
blue  > int:      255 (real: 0,00002 )

為什么會有像素的任意值? 像素值應該在0到255之間嗎?

  • 灰度圖像中的像素由1個通道表示,因此由1個字節表示,因此取值介於0到255之間。
  • 彩色圖像中的一個像素由3個通道(R,G,B(有時稱為第4個通道,稱為Alpha通道))表示,因此在圖像寬度上表示3個連續字節。 因此,這樣的像素不能用0到255之間的值表示。但是,三個通道(R,G,B)中每個通道的值都用0到255之間的值表示。

給定rgb值,有什么辦法可以表示0到255之間的像素值? 那會是正確的表示嗎?

就像我在上面第二點提到的那樣,您可以用0到255之間的值表示每個RGB通道/字節。假設您已讀取字節數組中的第一個像素(圖像的左上角)。

byte[] pixel = new byte[3];
/* code to read the pixel in this byte array */
int r = pixel[0] & 0xFF;
int g = pixel[1] & 0xFF;
int b = pixel[2] & 0xFF;

注意通道字節的“與”為0xFF(255)。 該操作使字節值變為無符號值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM