2016-04-23 13 views
0

の色値をRGBに変換するか、より正確にはSystem.Drawing.ColorオブジェクトのHSL値をPowershellに変換する必要があります。 他の言語ではいくつか解決策があります(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として知られています。それは基本的に意味します

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

インラインHue2Rgb機能が大幅に計算を変更する2つのタイプミスがあるのあなたの翻訳:

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 
} 

となりPowerShellでそう

if(statement){ 
    someValue 
} else { 
    anotherValue 
} 

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

ですから度(色相)およびパーセント(彩度+輝度)として、あなたの入力値を渡したい場合は、あなた」:あなたは、元のスクリプトのコメントを見ている場合、入力値について210 0と1の間の相対値への変換を処理する必要があるでしょう:

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

    # rest of script 
} 

最後に、あなたは実際のColorオブジェクトを返すためにColor.FromArgb()を使用することができます。

$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

関連する問題