Umrechnung von Farbräumen

  • Moin,

    Kurz und bündig: Ich möchte RGB Farben in DIN99 Farben umrechnen.
    Das Problem ist dabei der Schritt über die LAB Farben.
    Die Berechnungen liefern bei mir falsche Ergebnisse.
    (Also habe ich irgendwo etwas misinterpretiert, oder mich vertippt)
    Falls jemand schonmal Funktionen für diese Umrechnungen umgesetzt hat wäre ich ihm sehr verbunden wenn er sie zur Verfügung stellen würde.

    http://www.subcolors.de/content/public/colorsystems/uni.html
    http://de.wikipedia.org/wiki/Lab-Farbraum

    Spoiler anzeigen
    [autoit]

    #include <Math.au3>

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

    Global $a[3]

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

    $a[0] = 0
    $a[1] = 0
    $a[2] = 1

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

    ;~ _Norm($a)

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

    _Print($a, 'RGB')

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

    Global $b = _RGBtoXYZ($a[0], $a[1], $a[2])

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

    _Print($b, 'XYZ')

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

    Global $c = _RGBtoHSV($a[0], $a[1], $a[2])

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

    _Print($c, 'HSV', '°%%')

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

    Global $d = _XYZtoLAB($b[0], $b[1], $b[2])

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

    ConsoleWrite('Für Blau (R=0, G=0, B=1) muss L=?, A=0, B=-90 herauskommen' & @CRLF)

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

    _Print($d, 'LAB')

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

    Func _XYZtoLAB($X, $Y, $Z)
    Local $Sum = Abs($X) + Abs($Y) + Abs($Z), $Xn = $X/$Sum, $Yn = $Y/$Sum, $Zn = $Z/$Sum
    Local $L = 116 *(($Y/$Yn)^(1/3))-16
    Local $A = 500 * (($X/$Xn)^(1/3) - ($Y/$Yn)^(1/3))
    Local $B = 200 * (($Y/$Yn)^(1/3)-($Z/$Zn)^(1/3))
    Local $aRet[3] = [$L, $A, $B]
    Return $aRet
    EndFunc

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

    Func _RGBtoHSV($R, $G, $B)
    Local $Min = _Min(_Min($R, $G), $B), $Max = _Max(_Max($R, $G), $B)
    Local $H = 0
    Switch $Max
    Case $Min
    Case $R
    $H = 60 * (($G-$B)/($Max-$Min))
    Case $G
    $H = 60 * (2+($B-$R)/($Max-$Min))
    Case $B
    $H = 60 * (4+($R-$G)/($Max-$Min))
    EndSwitch
    If $H < 0 Then $H += 360
    Local $S = 0
    If Not $Max = 0 Then $S = ($Max-$Min)/$Max
    Local $V = $Max
    Local $aRet[3] = [$H, $S * 100, $V * 100]
    Return $aRet
    EndFunc

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

    Func _RGBtoXYZ($R, $G, $B)
    Local $X = 0.4124564 * $R + 0.3575761 * $G + 0.1804375 * $B
    Local $Y = 0.2126729 * $R + 0.7151522 * $G + 0.0721750 * $B
    Local $Z = 0.0193339 * $R + 0.1191920 * $G + 0.9503041 * $B
    Local $aRet[3] = [$X, $Y, $Z]
    Return $aRet
    EndFunc

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

    Func _Norm(ByRef $a)
    Local $b = 255
    $a[0] /= $b
    $a[1] /= $b
    $a[2] /= $b
    EndFunc

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

    Func _Print($a, $s, $s2 = '')
    ConsoleWrite('+> ' & $s & ':' & @CRLF)
    For $i = 0 To 2 Step 1
    ConsoleWrite(StringMid($s, $i+1, 1) & ': ' & $a[$i] & ' ' & StringMid($s2, $i+1, 1) & @CRLF)
    Next
    ConsoleWrite(@CRLF)
    EndFunc

    [/autoit]


    .
    .
    lg
    Mars