將 RGB 值轉換為 HSV,代表著從三個介於 0 到 255 的整數通道出發,重新表示為以角度為單位的色相角,加上飽和度與明度的百分比。色相精準定位色盤上的位置——紅色位於 0°、綠色位於 120°、藍色位於 240°——飽和度描述顏色遠離灰軸的距離,而明度則對應最強的標準化通道。RGB 透過加性的紅、綠、藍數量來描述顏色,但 HSV 則將同一組三元組重新整理,圍繞著通常更便於調整、選取與編寫腳本的屬性。每個 8 位元的 sRGB 輸入,必定會產生介於 [0, 360) 範圍的色相、[0, 1] 的飽和度,以及 [0, 1] 的明度。轉換流程是將每個通道除以 255,找出最大值與最小值,再依據哪個通道最大套用分段公式。消色差顏色——黑、白與所有中性灰——會產生 0 的飽和度,以及未定義的色相,多數實作會將其回報為預設的 0°。一旦理解這個轉換方式,你就能在僅支援 RGB 的影像資料、選色器、腳本 API,以及 CSS 友善的表示式之間移動顏色,不必再親手重寫數學運算。

HSV 為 RGB 帶來什麼
RGB 與 HSV 是同一個 sRGB 色彩立方體的兩套座標系統,但兩者暴露了不同的控制方式。使用 RGB,你可以直接調整三盞光,這呼應了螢幕實際混合顏色的方式,也對應 8 位元影像資料的儲存方式。使用 HSV,你可以繞著色盤旋轉、將顏色推離灰色,並朝最亮的光提亮——這正是設計師思考調色時的常見方式。色相軸是一個單一數值,依序走過紅、黃、綠、青、藍、洋紅,再回到紅,橫跨 360 度,因此你只要改變一個值,就能動畫跑過整道彩虹。飽和度軸讓同一組十六進位色碼呈現淡色調或鮮明的品牌色,不必個別觸碰通道。明度軸是最亮通道的標準化結果,因此提高它,即使有兩個通道偏暗,仍能改變視覺亮度。
這種重新整理在從單一起始色彩衍生調色盤的腳本、暴露 HSV 色盤的繪圖工具,以及希望使用者不必思考 (180, 50, 60) 與 (200, 60, 50) 之間差異就能挑選色調的介面中相當實用。由於轉換是確定性的,同一組 RGB 三元組必定產生同一組 HSV 三元組,這正是此格式在色彩命名、佈景主題變數與共用設計 token 上實用的原因。許多設計軟體中的選色器會同時顯示 HSV 三元組與 RGB 讀數,正是為了讓設計師能將色相與飽和度當作獨立維度來編輯。
RGB 轉 HSV 計算的內部原理
這個轉換包含三個步驟:標準化、找出極值,然後依據最大通道評估分段色相。首先,每個整數通道除以 255,使它落在 0 與 1 之間。明度分量等於這三個標準化通道的最大值。飽和度分量等於最大值與最小值的差除以最大值,但當最大值為 0 時,飽和度定義為 0。色相分量則依據哪個通道是最大值,從六個公式中挑選一個,而任何中間出現的負值會透過加 360 來回繞,使最終角度落在 [0, 360) 範圍。
你可以用一個範例看到公式的運作。取 RGB(200, 100, 50)。標準化後,通道變為 R = 0.7843、G = 0.3922、B = 0.1961。最大值是 R = 0.7843,最小值是 B = 0.1961,兩者之差為 0.5882。因此明度等於 0.7843,顯示為 78.43%,飽和度等於 0.5882 ÷ 0.7843,化簡為 0.75,顯示為 75.00%。因為 R 是最大值,色相公式為 60 × ((G − B) ÷ delta),得到 60 × (0.1961 ÷ 0.5882) = 60 × 0.3333 = 20.00°。完整轉換為 HSV(20.00°, 75.00%, 78.43%),這與你在 RGB to HSV Converter 輸入那些通道所得到的結果一致。
Android Color 文件是這些範圍的權威參考來源:色相至少為 0 且嚴格小於 360,飽和度與明度落在 [0, 1],而上述公式正是所有相容函式庫所採用的內容。R 的 grDevices rgb2hsv 實作對一般 8 位元 sRGB 輸入也遵循相同慣例,這也是 JavaScript 瀏覽器計算器能在同一輸入上與桌面統計工具相符的原因。
色盤上的色相角度
| 色相(角度) | 命名參考 |
|---|---|
| 0° | 紅色 |
| 60° | 黃色 |
| 120° | 綠色 |
| 180° | 青色 |
| 240° | 藍色 |
| 300° | 洋紅 |
| 360° 繞回 0° | 回到紅色 |
這六個錨點是 Android 文件與 R 的 rgb2hsv 常式都用來驗證色相計算的參考點,當你懷疑公式產生錯誤角度時,能夠用肉眼快速做一次健全性檢查。
使用瀏覽器工具將 RGB 值轉換為 HSV
如果不想自己寫公式來進行單次轉換,RGB to HSV Converter 會在瀏覽器本地端執行相同的計算:
- 將紅、綠、藍通道以介於 0 到 255 之間的整數輸入。小數值、空欄位、負數,或任何大於 255 的值都會明確產生錯誤,而不是悄悄被四捨五入或截斷。
- 選擇 Convert to HSV。結果面板會以角度顯示色相,並以百分比顯示飽和度與明度,同時附上標準化的 HSV 表示法、來源 HEX 色碼,以及該顏色的即時色塊。
- 將 HSV 輸出與目的端預期的尺度進行比對——角度與百分比、0 到 1 的小數範圍,或緊湊的整數範圍——然後複製你需要的數值。
由於輸入在轉換後仍然可見,你可以變更單一通道,觀察色相、飽和度與明度各自如何反應。在綠色與藍色不動的情況下提高紅色,會使色相滑向 0°;而均勻降低三個通道,則會將明度壓向 0%,卻不影響色相角度。這種反覆比對是使用轉換器勝過單次公式的主要優勢——多數調色盤調整涉及兩到三次小幅微調,而非一次全局變更,能夠並列比較才能讓數學保持誠實。
為你的目的端選擇正確的 HSV 尺度
實際軟體中常見三種 HSV 尺度,彼此並不能互換:
| 尺度 | 色相範圍 | 飽和度 | 明度 | 典型情境 |
|---|---|---|---|---|
| 角度與百分比 | 0° – 360°(0 不含) | 0% – 100% | 0% – 100% | Android Color、CSS 選色器、設計工具 |
| 0 到 1 小數 | 0 – <1 圈 | 0.0 – 1.0 | 0.0 – 1.0 | JavaScript 數學 API、使用 hue_norm 的 NumPy、多數腳本工具組 |
| 緊湊整數範圍 | 0 – 179(OpenCV)或 0 – 255 | 0 – 255 | 0 – 255 | 色相可容納於單一 8 位元通道的影像處理 |
瀏覽器轉換器刻意輸出角度與百分比,因為這與 Android 文件一致。轉換器顯示為 80.90% 的飽和度,在 0 到 1 的 API 中對應 0.809,而不是整數 80,除非目的端明確以百分比編碼。具體體到 OpenCV,色相通常回傳於 [0, 179],代表角度值在儲存前會先除以 2——請參考 Convert RGB to HSV in OpenCV: Match the Exact HSV Scale,取得來回轉換時的精確重新縮放方式。
如果目的端實際上預期的是 HSL 而非 HSV,請勿將明度分量重新標示為亮度。HSL 的亮度是標準化後最大值與最小值的平均,而 HSV 的明度是最大通道——兩者對同一 RGB 輸入的反應方向並不相同。請使用專門的 HSL 計算器或程式路徑來進行該轉換。HSV 讀數也無法說明可感知的可讀性,因此若你的目標是取得一對可及性的前景與背景組合,請將轉換後的 HEX 送入對比檢查工具,而非假設飽和度或明度數字即代表足夠的對比。
灰階與超出範圍輸入的行為
消色差輸入——也就是紅、綠、藍相等的所有顏色,包含純黑、純白與中間灰——會使最大值與最小值之間的差為 0,因此飽和度為 0。色相在這種情況下沒有視覺意義,Android 的 colorToHSV 所採用的標準慣例是回報預設的 0°。瀏覽器轉換器遵循此慣例,顯示 0° 並搭配飽和度 0.00%,使輸出與任何相容繪圖函式庫在同一組 RGB 三元組下所呈現的內容保持一致。
超出範圍的處理是嚴格而非寬容的。誤打成 256 不會變成 255,128.5 不會被四捨五入為 129,空欄位也不會被視為 0。每個輸入都必須是介於 0 到 255 之間(含端點)的有限整數;任何其他情況都會明確拋出錯誤,使錯誤一目了然,而非被默默吸收。當來源是 8 位元 RGB 色碼時,這種嚴格邊界特別有價值,因為它能避免單一格的誤差輸入,把一種顏色變成看起來合理但視覺上不同的另一種顏色。
最後,請記得 HSV 轉換描述的是單一不透明顏色。Alpha 超出範疇;透明度並不會改變三個底層通道的 RGB 至 HSV 計算。若下游工具需要可及性檢查用的感知結果,請將轉換後的 HEX 對實際背景執行對比檢查,而非使用抽象的 HSV 讀數。至於反向問題——將 HSV 值轉回整數 RGB——請參考 How to Convert HSV to RGB in Roblox Studio,或目標平台中等同的 HSV 轉 RGB 常式,因為瀏覽器工具僅處理正向方向。