2016-04-23 12 views
0

Мне нужно преобразовать HSL цветовые значения RGB, или быть более точным HSL-значения в System.Drawing.Color объекта с 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. Это в основном означает:

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