- Offizieller Beitrag
Hi,
mir sind gerade die Umrechnungsrichtlinien für Farbräume in die Hände gefallen.
Falls das mal jemand braucht, hab ich hier mal einige Umrechnungs-Funktionen erstellt.
Folgende Umrechnungen sind möglich:
_RGB_to_CMY
_CMY_to_RGB
_RGB_to_XYZ
_XYZ_to_RGB
_RGB_to_HunterLab
_HunterLab_to_RGB
_RGB_to_CIELab
_CIELab_to_RGB
_RGB_to_HSV
_HSV_to_RGB
_XYZ_to_HunterLab
_HunterLab_to_XYZ
_XYZ_to_CIELab
_CIELab_to_XYZ
Spoiler anzeigen
;=======================================================================
; einzig zu erklärender Parameter für alle Funktionen:
;
; $retType 0-Standard gibt Werte als Trennzeichnbasierter String zurück
; Trennzeichen ist das mit Opt('GUIDataSeparatorChar')
; definierte Zeichen (Standard '|')
; 1 gibt die Werte in einem Array zurück
;=======================================================================
#include-once
Func _RGB_to_CMY($iR, $iG, $iB, $retType=0)
If $retType <> 0 Then $retType = 1
Local $iC = Round(1 - ($iR / 255), 5)
Local $iM = Round(1 - ($iG / 255), 5)
Local $iY = Round(1 - ($iB / 255), 5)
If $retType Then
Local $Out[3] = [$iC,$iM,$iY]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iC & $delim & $iM & $delim & $iY
EndIf
Return $Out
EndFunc ;==>_RGB_to_CMY
Func _CMY_to_RGB($iC, $iM, $iY, $retType=0)
If $retType <> 0 Then $retType = 1
Local $iR = Int((1 - $iC) * 255)
Local $iG = Int((1 - $iM) * 255)
Local $iB = Int((1 - $iY) * 255)
If $retType Then
Local $Out[3] = [$iR,$iG,$iB]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iR & $delim & $iG & $delim & $iB
EndIf
Return $Out
EndFunc ;==>_CMY_to_RGB
Func _RGB_to_XYZ($iR, $iG, $iB, $retType=0); 0=String, 1=Array
If $iR < 0 Or $iR > 255 Or $iG < 0 Or $iG > 255 Or $iB < 0 Or $iB > 255 Then Return SetError(1,0,0)
If $retType <> 0 Then $retType = 1
Local $iX, $iY, $iZ
$iR /= 255
$iG /= 255
$iB /= 255
If $iR > 0.04045 Then
$iR = (($iR + 0.055 ) / 1.055 ) ^ 2.4
Else
$iR /= 12.92
EndIf
If $iG > 0.04045 Then
$iG = (($iG + 0.055 ) / 1.055 ) ^ 2.4
Else
$iG /= 12.92
EndIf
If $iB > 0.04045 Then
$iB = (($iB + 0.055 ) / 1.055 ) ^ 2.4
Else
$iB /= 12.92
EndIf
$iR *= 100
$iG *= 100
$iB *= 100
; Observer = 2°, Illuminant = D65
$iX = Round($iR * 0.4124 + $iG * 0.3576 + $iB * 0.1805, 3)
$iY = Round($iR * 0.2126 + $iG * 0.7152 + $iB * 0.0722, 3)
$iZ = Round($iR * 0.0193 + $iG * 0.1192 + $iB * 0.9505, 3)
If $retType Then
Local $Out[3] = [$iX,$iY,$iZ]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iX & $delim & $iY & $delim & $iZ
EndIf
Return $Out
EndFunc ;==>_RGB_to_XYZ
Func _XYZ_to_RGB($iX, $iY, $iZ, $retType=0)
If $retType <> 0 Then $retType = 1
Local $iR, $iG, $iB
$iX /= 100
$iY /= 100
$iZ /= 100
; Observer = 2°, Illuminant = D65
$iR = ($iX * 3.2406) + ($iY * -1.5372) + ($iZ * -0.4986)
$iG = ($iX * -0.9689) + ($iY * 1.8758) + ($iZ * 0.0415)
$iB = ($iX * 0.0557) + ($iY * -0.2040) + ($iZ * 1.0570)
If $iR > 0.0031308 Then
$iR = 1.055 * ($iR ^ (1/2.4)) - 0.055
Else
$iR *= 12.92
EndIf
If $iG > 0.0031308 Then
$iG = 1.055 * ($iG ^ (1/2.4)) - 0.055
Else
$iG *= 12.92
EndIf
If $iB > 0.0031308 Then
$iB = 1.055 * ($iB ^ (1/2.4)) - 0.055
Else
$iB *= 12.92
EndIf
$iR = Int($iR*255)
$iG = Int($iG*255)
$iB = Int($iB*255)
If $retType Then
Local $Out[3] = [$iR,$iG,$iB]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iR & $delim & $iG & $delim & $iB
EndIf
Return $Out
EndFunc ;==>_XYZ_to_RGB
Func _RGB_to_HunterLab($iR, $iG, $iB, $retType=0)
If $retType <> 0 Then $retType = 1
Local $aXYZ = _RGB_to_XYZ($iR, $iG, $iB, 1)
Local $Out = _XYZ_to_HunterLab($aXYZ[0], $aXYZ[1], $aXYZ[2])
If $retType Then
Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
Else
Return $Out
EndIf
EndFunc ;==>_RGB_to_HunterLab
Func _HunterLab_to_RGB($H_L, $H_a, $H_b, $retType=0)
If $retType <> 0 Then $retType = 1
Local $aXYZ = _HunterLab_to_XYZ($H_L, $H_a, $H_b, 1)
Local $Out = _XYZ_to_RGB($aXYZ[0], $aXYZ[1], $aXYZ[2])
If $retType Then
Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
Else
Return $Out
EndIf
EndFunc ;==>_HunterLab_to_RGB
Func _XYZ_to_HunterLab($iX, $iY, $iZ, $retType=0)
If $retType <> 0 Then $retType = 1
Local $H_L = Round(10 * Sqrt($iY), 3)
Local $H_a = Round(17.5 * (((1.02 * $iX) - $iY) / Sqrt($iY)), 3)
Local $H_b = Round(7 * (($iY - (0.847 * $iZ)) / Sqrt($iY)), 3)
If $retType Then
Local $Out[3] = [$H_L,$H_a,$H_b]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $H_L & $delim & $H_a & $delim & $H_b
EndIf
Return $Out
EndFunc ;==>_XYZ_to_HunterLab
Func _HunterLab_to_XYZ($H_L, $H_a, $H_b, $retType=0)
If $retType <> 0 Then $retType = 1
Local $iY = $H_L / 10
Local $iX = $H_a / 17.5 * $H_L / 10
Local $iZ = $H_b / 7 * $H_L / 10
$iY = Round($iY ^ 2, 3)
$iX = Round(($iX + $iY) / 1.02, 3)
$iZ = Round(-1 * ($iZ - ($iY)) / 0.847, 3)
If $retType Then
Local $Out[3] = [$iX,$iY,$iZ]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iX & $delim & $iY & $delim & $iZ
EndIf
Return $Out
EndFunc ;==>_HunterLab_to_XYZ
Func _XYZ_to_CIELab($iX, $iY, $iZ, $retType=0)
If $retType <> 0 Then $retType = 1
; Observer= 2°, Illuminant= D65
$iX /= 95.047
$iY /= 100
$iZ /= 108.883
If ($iX > 0.008856) Then
$iX = $iX ^ (1/3)
Else
$iX = (7.787 * $iX) + (16 / 116)
EndIf
If ($iY > 0.008856) Then
$iY = $iY ^ (1/3)
Else
$iY = (7.787 * $iY) + (16 / 116)
EndIf
If ($iZ > 0.008856) Then
$iZ = $iZ ^ (1/3)
Else
$iZ = (7.787 * $iZ) + (16 / 116)
EndIf
Local $CIE_L = Round((116 * $iY) - 16, 3)
Local $CIE_a = Round(500 * ($iX - $iY), 3)
Local $CIE_b = Round(200 * ($iY - $iZ), 3)
If $retType Then
Local $Out[3] = [$CIE_L,$CIE_a,$CIE_b]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $CIE_L & $delim & $CIE_a & $delim & $CIE_b
EndIf
Return $Out
EndFunc ;==>_XYZ_to_CIELab
Func _CIELab_to_XYZ($CIE_L, $CIE_a, $CIE_b, $retType=0)
If $retType <> 0 Then $retType = 1
Local $iY = ($CIE_L + 16) / 116
Local $iX = $CIE_a / 500 + $iY
Local $iZ = $iY - $CIE_b / 200
If ($iX^3 > 0.008856) Then
$iX = $iX ^ 3
Else
$iX = ($iX - 16 / 116) / 7.787
EndIf
If ($iY^3 > 0.008856) Then
$iY = $iY ^ 3
Else
$iY = ($iY - 16 / 116) / 7.787
EndIf
If ($iZ^3 > 0.008856) Then
$iZ = $iZ ^ 3
Else
$iZ = ($iZ - 16 / 116) / 7.787
EndIf
; Observer = 2°, Illuminant = D65
$iX = Round($iX * 95.047, 3)
$iY = Round($iY * 100.000, 3)
$iZ = Round($iZ * 108.883, 3)
If $retType Then
Local $Out[3] = [$iX,$iY,$iZ]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iX & $delim & $iY & $delim & $iZ
EndIf
Return $Out
EndFunc ;==>_CIELab_to_XYZ
Func _RGB_to_CIELab($iR, $iG, $iB, $retType=0)
If $retType <> 0 Then $retType = 1
Local $aXYZ = _RGB_to_XYZ($iR, $iG, $iB, 1)
Local $Out = _XYZ_to_CIELab($aXYZ[0], $aXYZ[1], $aXYZ[2])
If $retType Then
Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
Else
Return $Out
EndIf
EndFunc ;==>_RGB_to_CIELab
Func _CIELab_to_RGB($CIE_L, $CIE_a, $CIE_b, $retType=0)
If $retType <> 0 Then $retType = 1
Local $aXYZ = _CIELab_to_XYZ($CIE_L, $CIE_a, $CIE_b, 1)
Local $Out = _XYZ_to_RGB($aXYZ[0], $aXYZ[1], $aXYZ[2])
If $retType Then
Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
Else
Return $Out
EndIf
EndFunc ;==>_CIELab_to_RGB
Func _RGB_to_HSV($iR, $iG, $iB, $retType=0)
If $retType <> 0 Then $retType = 1
$iR /= 255
$iG /= 255
$iB /= 255
Local $Min = $iR
If $iG < $Min Then $Min = $iG
If $iB < $Min Then $Min = $iB
Local $Max = $iR
If $iG > $Max Then $Max = $iG
If $iB > $Max Then $Max = $iB
Local $Delta = $Max - $Min, $iH, $iS, $iV = $Max
If $Delta = 0 Then
$iH = 0
$iS = 0
Else
$iS = $Delta / $Max
Local $del_R = ((($Max - $iR ) / 6) + ($Max / 2 )) / $Max
Local $del_G = ((($Max - $iG ) / 6) + ($Max / 2 )) / $Max
Local $del_B = ((($Max - $iB ) / 6) + ($Max / 2 )) / $Max
If $iR = $Max Then
$iH = $del_B - $del_G
ElseIf $iG = $Max Then
$iH = 1 / 3 + $del_R - $del_B
Elseif $iB = $Max Then
$iH = 2 / 3 + $del_G - $del_R
EndIf
If $iH < 0 Then $iH += 1
If $iH > 1 Then $iH -= 1
EndIf
$iH = Round($iH, 4)
$iS = Round($iS, 4)
$iV = Round($iV, 4)
If $retType Then
Local $Out[3] = [$iH,$iS,$iV]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iH & $delim & $iS & $delim & $iV
EndIf
Return $Out
EndFunc ;==>_RGB_to_HSV
Func _HSV_to_RGB($iH, $iS, $iV, $retType=0)
If $retType <> 0 Then $retType = 1
Local $iR, $iG, $iB
If $iS = 0 Then
$iR = Int($iV * 255)
$iG = Int($iV * 255)
$iB = Int($iV * 255)
Else
$iH *= 6
If $iH = 6 Then $iH = 0
Local $i = Int($iH)
Local $1 = $iV * (1 - $iS)
Local $2 = $iV * (1 - $iS * ($iH - $i))
Local $3 = $iV * (1 - $iS * (1 - ($iH - $i)))
Switch $i
Case 0
$iR = $iV
$iG = $3
$iB = $1
Case 1
$iR = $2
$iG = $iV
$iB = $1
Case 2
$iR = $1
$iG = $iV
$iB = $3
Case 3
$iR = $1
$iG = $2
$iB = $iV
Case 4
$iR = $3
$iG = $1
$iB = $iV
Case Else
$iR = $iV
$iG = $1
$iB = $2
EndSwitch
$iR = Int($iR * 255)
$iG = Int($iG * 255)
$iB = Int($iB * 255)
EndIf
If $retType Then
Local $Out[3] = [$iR,$iG,$iB]
Else
Local $delim = Opt('GUIDataSeparatorChar')
Local $Out = $iR & $delim & $iG & $delim & $iB
EndIf
Return $Out
EndFunc ;==>_HSV_to_RGB