![](/img/trans.png)
[英]How to get the pixel values of an image in the range 0-255 in android
[英]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之間?
否,您應該已經知道,因為您正在處理字節移位等問題,所以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之間嗎?
給定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.