Math TSLtoRGB颜色空间转换

Math TSLtoRGB颜色空间转换,math,color-space,Math,Color Space,有人知道RGBtoTSL的正确公式吗 维基百科说RGB和TSL之间的转换如下: 但是……维基百科上呈现的反向转换是不正确的。他们的回归公式给出的结果是不正确的 恢复转换的正确公式是什么?即:从TSL转换为RGB Serg,下面是我们尝试在Asm(RosAsm assembler)中使用revert操作的一些尝试:)示例 ;使用变量 [浮点数:0.29889531雷亚尔 浮点数:0.58662247雷亚尔 浮点数(蓝色)(M3:0.11448223雷亚尔) [Float_minusOneThir

有人知道RGBtoTSL的正确公式吗

维基百科说RGB和TSL之间的转换如下:

但是……维基百科上呈现的反向转换是不正确的。他们的回归公式给出的结果是不正确的

恢复转换的正确公式是什么?即:从TSL转换为RGB

Serg,下面是我们尝试在Asm(RosAsm assembler)中使用revert操作的一些尝试:)示例

;使用变量
[浮点数:0.29889531雷亚尔
浮点数:0.58662247雷亚尔
浮点数(蓝色)(M3:0.11448223雷亚尔)
[Float_minusOneThird:R$(-1/3)];玫瑰主义中的错误。它可以看到“-(1/3)”
[R1系数:R$0]
[G1系数:R$0]
[R因素:R$0]
[G因素:R$0]
[TmpFloat:R$0]
[Float_Var95:R$(9/5)]
[浮动汇率14:R$(1/4)]
[浮动汇率34:R$(3/4)]
[Float_VarOne2Pi:R$0.15915494309189533576888376337251436203459645740456448747];1/(2*pi)
[xFactor:R$0]
[系数:R$0]
[浮动一半:0.5雷亚尔]
[浮动汇率59:R$(5/9)]
[Float_var53平方根:R$0.74535599249992988030578895770920788480206119870508574756];sqrt(5)/3
[浮动三分之一:R$(1/3)]
[FloatTSLVar1:R$0.184413]
[FloatTSLVar2:R$0.4721403]
[浮动时间:R$0]
[浮动时间绿色:R$0]
[浮动时间:蓝色:R$0]
[浮动利率:6.28318530717958647692528676655900576834338798750211641948雷亚尔]
[浮动利率:5.0雷亚尔]
; -----------------------------------------------------------
过程RGBtoTSL2a:
参数@PixelSrc、@Tint、@Saturation、@Light
本地@TempRed、@tempfreen、@TempBlue、@TempCmax、@TempCmin、@TempDelta_Max、@TempVar
使用eax、ecx、esi、edi、edx、ebx
有限的
; RGB从0到255
; 发红
电影D@PixelSrc| movzx edi B$esi+ARGB.RedDis | lea ecxD@TempRed| mov D$ecx edi | mov eax edi
; 变绿
电影D@PixelSrc| movzx edi B$esi+ARGB.GreenDis | lea ecxD@TempGreen|移动数据$ecx edi |添加eax edi
; 变蓝
电影D@PixelSrc| movzx edi B$esi+ARGB.BlueDis | lea ecxD@TempBlue|移动数据$ecx edi |添加eax edi
如果eax=0
fldz
电影D@Light| fst R$esi
电影D@Saturation| fst R$esi
电影D@Tint| fstp R$esi
出口
结束(如有)
; 获取最小和最大RGB(仅获取最小/最大RGB以检查灰色
lea ebxD@TempCmin|移动日$ebx 0
leaeaxD@TempCmax| mov D$eax 0
调用GetRGB_MinMax esi、ebx、eax
;得到三角洲
;最大值=edx
;最小值=ecx
mov-edxD@TempCmax| lea eaxD@TempCmax| mov D$eax edx
mov-ecxD@TempCmin| lea eaxD@TempCmin| mov D$eax ecx
lea ebxD@TempDelta_Max| mov D$ebx 0;cmax cmin
mov-eaxD@TempCmax|子eaxD@TempCMin| mov D$ebx eax
;第一个计算灯光(标准化)
电影D@Light
菲尔德F@TempRed| fmul R$浮动_YIQ_Red _M1
菲尔德F@TempGreen| fmul R$Float_YIQ_Green_M2
faddp ST1 ST0
菲尔德F@TempBlue| fmul R$Float_YIQ_Blue_M3
faddp ST1 ST0 | fmul R$FloatOne | fstp R$esi
…如果D@TempDelta_Max=0;这是灰色的,没有色调,没有饱和度
fldz
电影D@Saturation| fst R$esi
电影D@Tint| fstp R$esi
其他的
;第二次计算饱和度
;找一个演员
电子数据交换D@TempVar
菲尔德F@TempRed| fiaddF@TempGreen| fiaddF@TempBlue| fistp F$edi
菲尔德F@TempRed| fidiv F$edi | fadd R$Float |三分之一| fstp R$rFactor
;得到gfactor
菲尔德F@TempGreen| fidiv F$edi | fadd R$Float |三分之一| fstp R$gFactor
电影D@Saturation
fld R$rFactor | fmul ST0 ST0
fld R$gFactor | fmul ST0 ST0
faddp ST1 ST0 | fmul R$浮动| Var95
fsqrt | fstp R$esi
第三种颜色
电影D@Tint
fldz | fstp R$esi
fld R$rFactor | fdiv R$gFactor | fstp R$TmpFloat
如果R$gFactor>R$Float\u为零,则Fpu
fld R$TmpFloat | fld1 | fpatan | fmul R$Float_VarOne2Pi | fadd R$Float_Var14 | fstp R$esi;产生弧度
如果R$gFactor
和还原函数

Proc TSLtoRGB2a:
    Arguments @Tint, @Saturation, @Light, @Red, @Green, @Blue
    Local @TempRed, @TempGreen, @TempBlue
    Uses eax, ecx, esi, edi, ebx


; check for light conditions
mov esi D@Light
Fpu_If R$esi = R$Float_Zero
    mov edi D@Red | mov D$edi 0
    mov edi D@Green | mov D$edi 0
    mov edi D@Blue | mov D$edi 0
    ExitP
Fpu_End_If

mov edi D@Saturation
mov esi D@Tint
;.Fpu_If_Or R$esi = R$Float_Zero, R$edi = R$Float_Zero ; Grey color found
; Not true. Tint = 0 not necessarily means grey. What means grey is 
; saturation = 0
; see Serg examples:(44, 22, 0) and (0, 32, 64)

.Fpu_If R$edi = R$Float_Zero ; Grey color found. Seems to be only this case for finding grey.
    mov ebx D@Light
    fld R$ebx | fst R$Float_TempRed | fst R$Float_TempGreen | fstp R$Float_TempBlue
    fld1 | fstp R$kFactor
.Fpu_Else
    ; compute -1 * cot(2*pi*Tint)
    fld R$esi
    fmul R$Float_Two_PI
    fptan
    fdivrp ST0 ST1
    fmul R$Float_Minus_one
    fstp R$xFactor

    fld1 | fld R$xFactor | fmul ST0 ST0 | fadd R$Float_One | fdivp ST0 ST1 | fmul R$Float_Five
    fsqrt | fmul R$Float_OneThird | fmul R$edi | fstp R$g1Factor
    Fpu_If R$esi > R$Float_Half
        fld R$g1Factor | fmul R$Float_Minus_One  | fstp R$g1Factor
    Fpu_End_If

    fld R$g1Factor | fmul R$xFactor | fstp R$r1Factor

    fld R$r1Factor | fadd R$Float_OneThird | fstp R$Float_TempRed
    fld R$g1Factor | fadd R$Float_OneThird | fstp R$Float_TempGreen
    fld1 | fsub R$Float_TempRed | fsub R$Float_TempGreen | fstp R$Float_TempBlue

    ; Compte KFactor
    mov ebx D@Light
    fld R$ebx
    fld R$Float_TempRed | fmul R$FloatTSLVar1
    fld R$Float_TempGreen | fmul R$FloatTSLVar2
    faddp ST1 ST0 | fadd R$Float_YIQ_Blue_M3
    fdivp ST1 ST0
    fstp R$kFactor

.Fpu_End_If

mov edi D@Red | fld R$kFactor | fmul R$Float_TempRed | fmul R$Float255 | fistp F$edi
If D$edi <s 0
    mov D$edi 0
Else_If D$edi > 255
    mov D$edi 255
End_If
mov edi D@Green | fld R$kFactor | fmul R$Float_TempGreen | fmul R$Float255 | fistp F$edi
If D$edi <s 0
    mov D$edi 0
Else_If D$edi > 255
    mov D$edi 255
End_If
mov edi D@Blue | fld R$kFactor | fmul R$Float_TempBlue | fmul R$Float255 | fistp F$edi
If D$edi <s 0
    mov D$edi 0
Else_If D$edi > 255 ; something still is incorrect.
                    ; See what happens when:
                    ; Tint = 0.85764542031
                    ; Saturation: 0.0315199340953953
                    ; Light = 0.8826082107058823529411764705882352941176

    mov D$edi 255
End_If

EndP
Proc TSLtoRGB2a:
参数@Tint、@Saturation、@Light、@Red、@Green、@Blue
本地@TempRed、@tempfreen、@TempBlue
使用eax、ecx、esi、edi、ebx
;检查光线条件
电影D@Light
如果R$esi=R$Float\U为零,则为Fpu
电子数据交换D@Red|移动数据$edi 0
电子数据交换D@Green|移动数据$edi 0
电子数据交换D@Blue|移动数据$edi 0
出口
Fpu\u结束\u如果
电子数据交换D@Saturation
电影D@Tint
.Fpu_如果_或R$esi=R$Float_Zero,R$edi=R$Float_Zero;找到灰色
;不正确。色调=0不一定表示灰色。灰色的含义是
;饱和=0
;参见Serg示例:(44,22,0)和(0,32,64)
.Fpu_,如果R$edi=R$Float_零,则为灰色。似乎只有在这种情况下才能找到灰色。
mov-ebxD@Light
fld R$ebx | fst R$浮动|临时红色| fst R$浮动|临时绿色| fstp R$浮动|临时蓝色
fld1 | fstp R$K系数
.Fpu_其他
;计算-1*cot(2*pi*Tint)
fld R$esi
fmul R$Float\u Two\u PI
fptan
fdivrp ST0 ST1
fmul R$Float_减去一
fstp R$xFactor
fld1 | fld R$X因子| fmul ST0 ST0 | fadd R$Float | fdivp ST0 ST1 | fmul R$Float | 5
fsqrt | fmul R$浮动|三分之一| fmul R$edi | fstp R$G1系数
如果R$esi>R$Float\U一半,则为Fpu
fld R$G1系数| fmul R$Float |一| fstp R$G1系数
Fpu\u结束\u如果
fld R$G1系数| fmul R$X系数| fstp R$R1系数
fld R$r1Factor | fadd R$Float |三分之一| fstp R$Float | TempRed
fld R$G1系数| fadd R$Float |三分之一| fstp R$Float |绿色
fld1 | fsub R$浮动|临时红色| fsub R$浮动|临时绿色| fstp R$浮动|临时蓝色
;补偿因子
mov-ebxD@Light
外汇储备R$ebx
fld R$Float|U TempRed | fmul R$FloatTSLVar1
fld R$Float|U TEMPGREN | fmul R$FloatTSLVar2
faddp ST1 ST0 | fadd R$浮动_YIQ_Blue_M3
fdivp ST1 ST0
fstp R$kFactor
.Fpu_End_如果
电子数据交换D@Red| fld R$K因子| fmul R$Float | fmul R$Float 255 | fistp F$edi
如果D$edi 255
移动数据$edi 255
结束(如有)
电子数据交换D@Green| fld R$kFactor | fmul R$Float | U TempGreen | fmul R$Float 255 | fistp F$edi
如果D$edi 255
移动数据$edi 255
结束(如有)
电子数据交换D@Blue| fld R$K系数|
Proc TSLtoRGB2a:
    Arguments @Tint, @Saturation, @Light, @Red, @Green, @Blue
    Local @TempRed, @TempGreen, @TempBlue
    Uses eax, ecx, esi, edi, ebx


; check for light conditions
mov esi D@Light
Fpu_If R$esi = R$Float_Zero
    mov edi D@Red | mov D$edi 0
    mov edi D@Green | mov D$edi 0
    mov edi D@Blue | mov D$edi 0
    ExitP
Fpu_End_If

mov edi D@Saturation
mov esi D@Tint
;.Fpu_If_Or R$esi = R$Float_Zero, R$edi = R$Float_Zero ; Grey color found
; Not true. Tint = 0 not necessarily means grey. What means grey is 
; saturation = 0
; see Serg examples:(44, 22, 0) and (0, 32, 64)

.Fpu_If R$edi = R$Float_Zero ; Grey color found. Seems to be only this case for finding grey.
    mov ebx D@Light
    fld R$ebx | fst R$Float_TempRed | fst R$Float_TempGreen | fstp R$Float_TempBlue
    fld1 | fstp R$kFactor
.Fpu_Else
    ; compute -1 * cot(2*pi*Tint)
    fld R$esi
    fmul R$Float_Two_PI
    fptan
    fdivrp ST0 ST1
    fmul R$Float_Minus_one
    fstp R$xFactor

    fld1 | fld R$xFactor | fmul ST0 ST0 | fadd R$Float_One | fdivp ST0 ST1 | fmul R$Float_Five
    fsqrt | fmul R$Float_OneThird | fmul R$edi | fstp R$g1Factor
    Fpu_If R$esi > R$Float_Half
        fld R$g1Factor | fmul R$Float_Minus_One  | fstp R$g1Factor
    Fpu_End_If

    fld R$g1Factor | fmul R$xFactor | fstp R$r1Factor

    fld R$r1Factor | fadd R$Float_OneThird | fstp R$Float_TempRed
    fld R$g1Factor | fadd R$Float_OneThird | fstp R$Float_TempGreen
    fld1 | fsub R$Float_TempRed | fsub R$Float_TempGreen | fstp R$Float_TempBlue

    ; Compte KFactor
    mov ebx D@Light
    fld R$ebx
    fld R$Float_TempRed | fmul R$FloatTSLVar1
    fld R$Float_TempGreen | fmul R$FloatTSLVar2
    faddp ST1 ST0 | fadd R$Float_YIQ_Blue_M3
    fdivp ST1 ST0
    fstp R$kFactor

.Fpu_End_If

mov edi D@Red | fld R$kFactor | fmul R$Float_TempRed | fmul R$Float255 | fistp F$edi
If D$edi <s 0
    mov D$edi 0
Else_If D$edi > 255
    mov D$edi 255
End_If
mov edi D@Green | fld R$kFactor | fmul R$Float_TempGreen | fmul R$Float255 | fistp F$edi
If D$edi <s 0
    mov D$edi 0
Else_If D$edi > 255
    mov D$edi 255
End_If
mov edi D@Blue | fld R$kFactor | fmul R$Float_TempBlue | fmul R$Float255 | fistp F$edi
If D$edi <s 0
    mov D$edi 0
Else_If D$edi > 255 ; something still is incorrect.
                    ; See what happens when:
                    ; Tint = 0.85764542031
                    ; Saturation: 0.0315199340953953
                    ; Light = 0.8826082107058823529411764705882352941176

    mov D$edi 255
End_If

EndP
function rgbFromTsl(T, S, L) {
    if (arguments.length == 1) {
        T = arguments[0][0];
        S = arguments[0][1];
        L = arguments[0][2];
    }

    if (L == 0)
        return [0, 0, 0];

    var r1, g1, x;
    var r, g, b;

    // For T == 0 reverse solution is not unique
    // and we use a trick with "negative zero" to distinguish them
    if (isNegativeZero(T)) {
        g1 = 0;
        r1 = -Math.sqrt(5.0) / 3.0 * S;

    }
    else if (T == 0) {
        g1 = 0;
        r1 = Math.sqrt(5.0) / 3.0 * S;
    }
    else {

        x = -1.0 / Math.tan(2 * Math.PI * T);
        g1 = Math.sqrt(5.0 / (1 + x * x)) / 3.0 * S;
        if (T > 0.5)
            g1 = -g1;
        r1 = x * g1;
    }
    r = r1 + 1.0 / 3;
    g = g1 + 1.0 / 3;
    b = (1 - r - g);
    var k = L / (0.185 * r + 0.473 * g + 0.114);
    return [k * r, k * g, k * b];
}