2016-04-23 60 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