簡體   English   中英

了解 BufferedImage.getRGB 輸出值

[英]Understanding BufferedImage.getRGB output values

我使用此方法獲取圖像中像素的整數值:

int colour = img.getRGB(x, y);

然后我打印出這些值,我看到黑色像素對應於“-16777216”之類的值,一種藍色對應於“-16755216”之類的東西,等等。有人可以解釋一下這個值背后的邏輯嗎?

RGB int顏色在其位中包含顏色的紅、綠、藍分量。 您必須查看其二進制或十六進制表示,而不是將其視為整數(而不是查看其十進制表示)。

一個int有 32 位,3x8 = 24 用於以以下格式存儲 RGB 分量(每個 8 位):

               2          1          0
bitpos      32109876 54321098 76543210
------   --+--------+--------+--------+
bits     ..|RRRRRRRR|GGGGGGGG|BBBBBBBB|

您可以使用位掩碼提取或設置組件:

int color = img.getRGB(x, y);

// Components will be in the range of 0..255:
int blue = color & 0xff;
int green = (color & 0xff00) >> 8;
int red = (color & 0xff0000) >> 16;

如果顏色還具有 alpha 分量(透明度)ARGB,則它獲取最后剩余的 8 位。

           3          2          1          0
bitpos    10987654 32109876 54321098 76543210
------   +--------+--------+--------+--------+
bits     |AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBB|

和價值:

int alpha = (color & 0xff000000) >>> 24; // Note the >>> shift
                                         // required due to sign bit

alpha 值為 255 表示顏色完全不透明,值為 0 表示顏色完全透明。

你的顏色:

你的顏色是color = -16755216 ,它有:

blue : 240         // Strong blue
green:  85         // A little green mixed in
red  :   0         // No red component at all
alpha: 255         // Completely opaque

getRGB(int x, int y)返回位置(x,y)處的顏色像素值。
您誤解了返回的值。
它是二進制格式。 像 11...11010101,它作為 int 值提供給你。
如果您想獲得該值的 RGB(即紅色、綠色、藍色)分量,請使用 Color 類。 例如

Color mycolor = new Color(img.getRGB(x, y));

然后,您可以使用getRed()getGreen()getBlue()getAlpha()獲取紅色、綠色或藍色值。 然后這些方法將以熟悉的格式返回一個int值,其值為0 < value < 255

int red = mycolor.getRed();

如果您不想使用Color類,則需要使用按位運算來獲取其值。

查看ColorModel.getRgb實現

589  public int getRGB(int pixel) {
590        return (getAlpha(pixel) << 24)
591             | (getRed(pixel) << 16)
592             | (getGreen(pixel) << 8)
593             | (getBlue(pixel) << 0);
594   }

在文檔中解釋

返回默認 RGB 顏色模型 (TYPE_INT_ARGB) 中的整數像素 [...]

所以你得到 8 位 alpha 通道,8 位紅色,8 位綠色,8 位藍色。

檢查值的一種簡單(且緩慢的方法)是使用new java.awt.Color(colour, true); 然后調用吸氣劑。

或者您可以將該值打印為無符號的 32 位十六進制值: Integer.toString(colour, 16) 輸出的每兩個字符將是 ARGB 集的一部分。

實際上,您可以通過Integer.toBinaryString(-16755216) 將int 轉換為二進制字符串,即11111111000000000101010111110000。它由4 個字節組成:alpha、red、green、blue。 這些值是未預乘的,這意味着任何透明度都單獨存儲在 alpha 分量中,而不是存儲在顏色分量中。 組件存儲如下 (alpha << 24) | (紅色<<16) | (綠色 << 8) | 藍色。 每個組件的范圍在 0..255 之間,0 表示該組件沒有貢獻,255 表示 100% 貢獻。 因此,不透明黑色將是 0xFF000000(100% 不透明,但沒有來自紅色、綠色或藍色的貢獻),不透明白色將是 0xFFFFFFFF。

暫無
暫無

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

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