• 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
    [autoit]


    ;=======================================================================
    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]