2016-04-23 15 views
0

Ich muss HSL Farbwerte zu RGB konvertieren, oder genauer HSL-Werte zu einem System.Drawing.Color Objekt mit Powershell. Es gibt ein paar Lösungen in anderen Programmiersprachen (wie LINK). Aber während es einfach aussieht, kann ich es nicht in Powershell konvertieren.Powershell: HSL zu 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

"Ich kann es nicht in Powershell konvertieren" - was hast du bisher versucht? Wie wird es Ihren Erwartungen nicht gerecht? –

+0

Die Beispielfunktion in der Antwort, mit der Sie verlinkt haben, funktioniert einwandfrei, wenn sie auf PowerShell portiert wurde. Btw –

+0

Ja, vergessen Sie den Code. :) Ich hatte Zweifel an ein paar Zeilen und eine Zeile konnte ich gar nicht übersetzen (siehe Code). Hauptsächlich weiß ich nicht, was einige der Betreiber meinen. – Moss

Antwort

1

Beginnen wir mit der Zeile beginnen werden Sie Probleme haben bei der Übersetzung:

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

Dieses Konstrukt:

statement ? someValue : anotherValue; 

als ternary operation bekannt. Im Grunde bedeutet es:

if(statement){ 
    someValue 
} else { 
    anotherValue 
} 

So in Powershell, die wird:

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

Ihre Übersetzung der Inline Hue2Rgb Funktion hat zwei Fehler, die sich stark um die Berechnung ändern:

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 
} 

In Bezug auf die Eingangswerte, wenn man sich die Kommentare in Originalschrift einen Blick:

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

Also, wenn Sie Ihre Eingabewerte als Grad (Farbton) und Prozente (Sättigung + Luminanz) übergeben wollen, können Sie‘ ll hat eine Umwandlung in einen relativen Wert zu handhaben zwischen 0 und 1:

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

    # rest of script 
} 

Schließlich können Sie Color.FromArgb() verwenden, um ein tatsächliches Color Objekt zurückgeben:

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

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

hinzugefügt, siehe oben. Aber das Ergebnis ist völlig falsch. – Moss

+1

Sie haben die dazugehörige Parameterdokumentation beim Kopieren des Beispiels nicht wirklich gelesen, oder? :) –

+0

bekomme immer noch ungültige Werte: -546 -954 -138 den Code aktualisiert – Moss