2016-04-23 63 views
0

我需要HSL顏色值轉換爲RGB,或與Powershell的更精確HSL值到System.Drawing.Color對象。 在其他程序中有幾種解決方案 - 語言在那裏(如LINK)。但雖然看起來很簡單,但我沒有把它轉換成Powershell。Powershell的:HSL爲RGB

Function HSLtoRGB ($H,$S,$L) { 
    $H = [double]($H/360) 
    $S = [double]($S/100) 
    $L = [double]($L/100) 

    if ($s -eq 0) { 
     $r = $g = $b = $l 
    } 
    else { 
     if ($l -lt 0.5){ 
      $q = $l * (1 + $s) 
     } 
     else { 
      $q = $l + $s - $l * $s 
     } 
     $p = (2 * $L) - $q 
     $r = (Hue2rgb $p $q ($h + 1/3)) 
     $g = (Hue2rgb $p $q $h) 
     $b = (Hue2rgb $p $q ($h - 1/3)) 
    } 

    $r = [Math]::Round($r * 255) 
    $g = [Math]::Round($g * 255) 
    $b = [Math]::Round($b * 255) 

return ($r,$g,$b) 
} 


function Hue2rgb ($p, $q, $t) { 
    if ($t -lt 0) { $t++ } 
    if ($t -gt 0) { $t-- } 
    if ($t -lt 1/6) { return ($p + ($q + $p) * 6 * $t) } 
    if ($t -lt 1/2) { return $q }  
    if ($t -lt 2/3) { return ($p + ($q - $p) * (2/3 - $t) * 6) } 
    return $p 
} 


HSLtoRGB 63 45 40  # result should be R 145 G 148 B 56 
+0

「我沒有把它轉換成Powershell」 - 你到目前爲止嘗試過什麼?它不符合你的期望? –

+0

您鏈接到的答案中的示例函數在移植到PowerShell btw時工作得很好 –

+0

是的,忘記了代碼。 :)我有幾條線和一條我根本無法翻譯的疑惑(見代碼)。主要是我不知道一些運營商的意思。 – Moss

回答

1

讓我們開始與您遇到麻煩翻譯線:

$q = l < 0.5 ? l * (1 + s) : l + s - l * s; #could not translate this line 

此構造:

statement ? someValue : anotherValue; 

稱爲ternary operation。它主要是指:

if(statement){ 
    someValue 
} else { 
    anotherValue 
} 

因此在PowerShell中變成:

$q = if($l -lt 0.5){ 
    $l * (1 + $s) 
} else { 
    $l + $s - $l * $s 
} 

你的內聯Hue2Rgb功能的翻譯有兩個錯別字,極大地改變了計算:

function Hue2rgb ($p, $q, $t) { 
    if ($t -lt 0) { $t++ } 
    if ($t -gt 0) { $t-- } # This condition should be ($t -gt 1) 
    if ($t -lt 1/6) { return ($p + ($q + $p) * 6 * $t) } # The innermost calculation should be ($q - $p) not ($q + $p) 
    if ($t -lt 1/2) { return $q }  
    if ($t -lt 2/3) { return ($p + ($q - $p) * (2/3 - $t) * 6) } 
    return $p 
} 

關於輸入值,如果你看看在原劇本的評論:

* Assumes h, s, and l are contained in the set [0, 1] and 
* returns r, g, and b in the set [0, 255]. 

所以,如果你想通過你的輸入值作爲度(色調)和百分比(飽和度+亮度),你」將不得不處理0和1之間的轉換,以一個相對值:

Function HSLtoRGB ($H,$S,$L) { 
    $H = [double]($H/360) 
    $S = [double]($S/100) 
    $L = [double]($L/100) 

    # rest of script 
} 

最後,您可以使用Color.FromArgb()返回實際Color對象:

$r = [Math]::Round($r * 255) 
$g = [Math]::Round($g * 255) 
$b = [Math]::Round($b * 255) 

return [System.Drawing.Color]:FromArgb($r,$g,$b) 
+0

補充說,見上文。但結果是完全錯誤的。 – Moss

+1

複製示例時,您沒有真正閱讀隨附的參數文檔,是嗎? :) –

+0

仍然會得到無效值:-546 -954 -138 更新了代碼 – Moss