2017-09-12 140 views
1

我已閱讀HSLRGB算法在wikipedia。我瞭解它並可以使用它進行轉換。不過,我遇到另一種算法here,數學是「解釋」here瞭解HSL到RGB顏色空間轉換算法

的算法是:

//H, S and L input range = 0 ÷ 1.0 
//R, G and B output range = 0 ÷ 255 

if (S == 0) 
{ 

    R = L * 255 
    G = L * 255 
    B = L * 255 
} 
else 
{ 
    if (L < 0.5) var_2 = L * (1 + S) 
    else   var_2 = (L + S) - (S * L) 

    var_1 = 2 * L - var_2 

    R = 255 * Hue_2_RGB(var_1, var_2, H + (1/3)) 
    G = 255 * Hue_2_RGB(var_1, var_2, H) 
    B = 255 * Hue_2_RGB(var_1, var_2, H - (1/3)) 
} 

Hue_2_RGB(v1, v2, vH)    //Function Hue_2_RGB 
{ 
    if (vH < 0) vH += 1 
    if(vH > 1) vH -= 1 
    if ((6 * vH) < 1) return (v1 + (v2 - v1) * 6 * vH) 
    if ((2 * vH) < 1) return (v2) 
    if ((3 * vH) < 2) return (v1 + (v2 - v1) * ((2/3) - vH) * 6) 
    return (v1) 
} 

我試過數學以下,但我想不出它。它是如何工作的?

+0

這是從圓柱座標系轉換爲笛卡爾座標系。您可以創建包含飽和度和亮度(與顏色無關)的幫助變量'var_1'和'var_2'。然後將它們轉換爲RGB空間中的顏色值,具體取決於色調。 – igrinis

回答

1

第一部分if (S == 0)是針對沒有飽和度的情況,這意味着它是一片灰色。您設置亮度,將RGB設置爲該灰度級,然後完成。

如果不是這種情況,那麼我們就需要進行棘手的部分:

我們將用var_1var_2爲臨時值,只是爲了使代碼更易讀。如果亮度等於或大於0.5(50%),則var_2 =亮度+飽和度 - 亮度x飽和度。如果亮度小於0.5(50%),則var_2 =亮度x(1.0+飽和度。這就是else部分:

if (L < 0.5) var_2 = L * (1 + S) 
else   var_2 = (L + S) - (S * L) 

然後我們做:

var1 = 2 x Luminance – var_2 

這將是以後有用

現在我們需要另一個THR就色相而言,每個顏色通道都有臨時變量。對於Red,我們增加了0.333(代碼中的H + (1/3)),對於Green我們什麼都不做,對於Blue,我們從它減去0.333(H + (1/3))。該節奏值在Hue_2_RGB()中被稱爲vH(值Hue)。

現在每個顏色通道將被分開處理,因此三個函數調用。有四個公式可以應用於顏色通道。每個顏色通道只能「使用」一個公式。

哪一個?這取決於Hue的價值(vH)。

順便說一下,vH的值必須標準化,因此如果它是負值,我們加1,或者如果它大於1,我們從中減1,以使vH位於[0,1]。

  1. 如果6×VH越小則如圖1所示,彩色信道= VAR_1 +(VAR_2 - VAR_1)×6×VH
  2. 如果2×VH越小則如圖1所示,彩色信道= VAR_2
  3. 如果3×VH越小則如圖2所示,顏色通道= VAR_1 +(VAR_2 - VAR_1) X(0.666 - VH)×6
  4. 否則,顏色信道= VAR_1

對於R = 255 * Hue_2_RGB(var_1, var_2, H + (1/3)),顏色通道將是這紅色, 在代碼中命名爲R

+1

我得到了算法的工作原理,我只是不明白算法是如何從數學公式中形成的。儘管經過幾天的努力,我現在確實瞭解它。謝謝! – userx01