Ich hab jetzt BugFixs Umwandler RGB-XYZ benutzt und mit dem Array lässt es sich auch besser rechnen als mit den grässlichen Hexadezimal-Werten.
Nur besonders meine Umwandlung Hexadezimal in getrennte 0-255 Werte und zurück ist vermutlich ziemlich unprofessionell, da ich das über Umwandlung in Strings gemacht habe.
Spoiler anzeigen
$Gui=GUICreate('Farbübergang',400,100)
For $i=0 To 100
GUICtrlCreateLabel('',0,$i,400,1)
GUICtrlSetBkColor(-1,GetColorBetween(0xffffff,0x0000ff,$i))
Next
GUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
Until GUIGetMsg()=-3
Func GetColorBetween($Color1,$Color2,$Value,$Max=100)
;Umwandeln in XYZ
$Color1=String(Hex($Color1,6))
$Color2=String(Hex($Color2,6))
Dim $C1[3]
Dim $C2[3]
For $i=2 To 0 Step -1
$C1[$i]=StringRight($Color1,2)
$Color1=StringTrimRight($Color1,2)
Next
For $i=2 To 0 Step -1
$C2[$i]=StringRight($Color2,2)
$Color2=StringTrimRight($Color2,2)
Next
$Color1=_RGB_to_XYZ(Dec($C1[0]),Dec($C1[1]),Dec($C1[2]),1)
$Color2=_RGB_to_XYZ(Dec($C2[0]),Dec($C2[1]),Dec($C2[2]),1)
;Das eigentliche Rechnen
Dim $Diff[3]
For $i=0 To 2
$Diff[$i]=$Color2[$i]-$Color1[$i]
Next
Dim $NewColor[3]
For $i=0 To 2
$NewColor[$i]=$Color1[$i]+$Value*($Diff[$i]/$Max)
Next
;Zurück in RGB umwandeln
$NewColorRGB=_XYZ_to_RGB($NewColor[0],$NewColor[1],$NewColor[2],1)
$NewColorRGBString=""
For $i=0 To 2
$NewColorRGBString&=StringRight(String(Hex($NewColorRGB[$i])),2)
Next
Return "0x"&$NewColorRGBString
EndFunc
Func _RGB_to_XYZ($iR, $iG, $iB, $retType=0); 0=String, 1=Array
;https://autoit.de/index.php?page=Thread&threadID=16365
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
Funktioniert soweit aber.