Java 中 RGB 整數表示
一、簡介
RGB 顏色模型廣泛應用於各種應用和設備,因為它與電子顯示器的工作方式非常吻合。 RGB 中的「R」代表紅色,「G」代表綠色,「B」代表藍色。以不同強度組合這三種原色可以產生廣譜的顏色。
在包括 Java 在內的程式語言中,常見做法是將 RGB 顏色表示為單一整數,將三個顏色分量(有時還包括 alpha(透明度)分量)打包到 32 位元整數中。
在本教程中,我們將研究在這些表示之間移動的方法。
2. RGB整數表示
在 RGB 顏色的 32 位元整數表示中,每個顏色分量通常會分配 8 位元。最高 8 位元通常用於 Alpha 通道(代表透明度),其次是紅色、綠色和藍色。結構如下:
- 位 24-31:阿爾法 (A)
- 位 16-23:紅色 (R)
- 位 8-15:綠色 (G)
- 位 0-7:藍色 (B)
3. RGB到整數的轉換
我們可以透過將各個分量位元移到所需的位置來創建表示 (A)RGB 顏色的整數:
int alpha = 255; // Fully opaque
int red = 100;
int green = 150;
int blue = 200;
int argb = (alpha << 24) | (red << 16) | (green << 8) | blue;
如果我們在不需要透明度的環境中工作,我們可能會想省略 Alpha 通道:
int rgb = (red << 16) | (green << 8) | blue;
3.1.夾緊轉換
利用這些知識,我們可以寫一個接受 RGB 值並傳回整數表示的函數。首先,我們可以實現箝位,將輸入值限制在適當的範圍內。在處理顏色轉換時,將值完全保持在所需的範圍內非常方便:
int clamp(int value, int min, int max) {
return Math.max(min, Math.min(max, value));
}
接下來,讓我們實作一個函數,該函數將使用clamp
函數將 RGB 值轉換為整數:
int rgbToInt(<span class="hljs-type">int</span> alpha, int red, int green, int blue) {
alpha = clamp(alpha, <span class="hljs-number">0</span>, <span class="hljs-number">255</span>);
red = clamp(red, 0, 255);
green = clamp(green, 0, 255);
blue = clamp(blue, 0, 255);
return (alpha << <span class="hljs-number">24</span>) | (red << 16) | (green << 8) | blue;
}
我們也可以實作沒有 alpha 通道的版本:
int rgbToInt(int red, int green, int blue) {
red = clamp(red, 0, 255);
green = clamp(green, 0, 255);
blue = clamp(blue, 0, 255);
return (red << 16) | (green << 8) | blue;
}
最後,我們可以使用建立的函數來轉換 RGB 值:
assertEquals(0x00ABCDEF, rgbToInt(171, 205, 239))
4. RGB 到整數的轉換
從整數表示中提取 RGB 分量就像移位以將所需部分移至最低 8 位,然後屏蔽掉冗餘的較高位一樣簡單。例如,要提取紅色通道,我們需要將整數值右移 16 位元:
int red = (argb >> 16)
現在,最低 8 位元代表我們的紅色值,但我們仍然需要屏蔽其餘部分。我們可以透過使用位元and
運算子來做到這一點:
int red = (argb >> 16) & 0xFF;
我們可以將 0xFF 數字(十進制 255)視為一個位元掩碼,前 8 位元等於 1,其餘所有位元等於 0。因此,與and
運算子結合使用,它將丟棄除前 8 位元之外的所有位元位。我們可以用類似的方式提取其餘的 RGB 分量:
int alpha = (argb >> 24) & 0xFF;
int red = (argb >> 16) & 0xFF;
int green = (argb >> 8) & 0xFF;
int blue = argb & 0xFF;
5. 顏色變換
我們可以在各種變換中使用RGB顏色表示,讓RGB顏色表示更實用。
5.1.亮度調節
調整亮度涉及縮放 RGB 分量。因為 Alpha 通道與亮度無關,所以我們不會對其進行縮放:
float scale = 0.8f; // darken by 20%
red = (int)(red * scale);
green = (int)(green * scale);
blue = (int)(blue * scale);
int newArgb = (alpha << 24) | (red << 16) | (green << 8) | blue;
5.2.灰階轉換
為了執行灰階轉換,我們將所有三個顏色分量設定為相同的值。我們可以使用原始顏色的加權平均值:
int average = (int)(red * 0.299 + green * 0.587 + blue * 0.114);
int grayscaleArgb = (alpha << 24) | (average << 16) | (average << 8) | average;
與前面的範例類似,Alpha 通道不受影響,因為它不包含顏色資訊。我們透過對每個顏色分量使用不同的權重來獲得不同的結果。
5.3.顏色反轉
我們也可以透過翻轉 RGB 分量來反轉顏色。為此,我們需要從 255 中減去每個顏色分量的值:
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
int invertedArgb = (alpha << 24) | (red << 16) | (green << 8) | blue;
六、總結
在本文中,我們學習如何使用位元運算在 RGB 和整數表示之間移動。我們也研究瞭如何將 RGB 表示用於各種顏色轉換的範例。
與往常一樣,本教程中顯示的所有程式碼範例都可用 在 GitHub 上。與往常一樣,本教程中顯示的所有程式碼範例都可用 在 GitHub 上。