Types/LightScript.Color/RGBToHSL.ps1

param(
# The red part
[Parameter(Mandatory=$true,Position=0)]
[Alias('R')]
[Byte]
$Red,

# The green part
[Parameter(Mandatory=$true,Position=1)]
[Alias('G')]
[Byte]
$Green,

# The blue part
[Parameter(Mandatory=$true,Position=2)]
[Alias('B')]
[Byte]
$Blue
)

[float]$PercentRed = $Red / 255
[float]$PercentGreen = $Green / 255
[float]$PercentBlue = $Blue / 255

$min = $max = $PercentRed
foreach ($_ in $PercentGreen, $PercentBlue) {
    if ($_ -lt $min) { $min = $_ }
    if ($_ -ge $max) { $max = $_ }
}

$Luminance = ($min + $max)  / 2
$delta = $max - $min
    
if (-not $delta) {
    $hue = $saturation = 0                 
} else {
    $saturation = $delta
    $saturation /= (1 - [Math]::Abs(((2 * $Luminance) -1)))
      
    $hue =  
        if ($Max -eq $PercentRed){
            ($PercentGreen - $PercentBlue)/$delta % 6      
        } elseif ($max -eq $PercentGreen) {
            (($PercentBlue - $PercentRed)/ $delta) + 2
        } else {                
            (($PercentRed - $PercentGreen)/ $delta) + 4
        }
}
$hue*=60
if ($hue -gt 360) { $hue -= 360 } 
if ($hue -lt 0) { $hue = 360 + $hue } 
[PSCustomObject][Ordered]@{Hue = $hue;Saturation = $saturation;Luminance = $Luminance}