C# 将实验室颜色存储为整数

C# 将实验室颜色存储为整数,c#,serialization,colors,rgb,C#,Serialization,Colors,Rgb,当使用RGB值时,.NET内置了将其从整数转换为整数的方法,并且将颜色转换为整数非常简单。有没有办法将实验室颜色存储为整数?与RGB不同,实验室颜色值可以为负值。如果可以避免的话,我不想将颜色存储在RGB中并在运行时转换它们,因为我不需要RGB值。因此,正在使用旧的2度观察者和CIE标准光源D65->CIELAB进行的转换是RGB->XYZ。下面给出的代码(R,G,B假设在[0,1]中)作为参考 考虑到这些从RGB中每个通道8位开始的变换,L*的范围是[01100],a*(-85.9297.96

当使用RGB值时,.NET内置了将其从整数转换为整数的方法,并且将颜色转换为整数非常简单。有没有办法将实验室颜色存储为整数?与RGB不同,实验室颜色值可以为负值。如果可以避免的话,我不想将颜色存储在RGB中并在运行时转换它们,因为我不需要RGB值。

因此,正在使用旧的2度观察者和CIE标准光源D65->CIELAB进行的转换是RGB->XYZ。下面给出的代码(R,G,B假设在[0,1]中)作为参考

考虑到这些从RGB中每个通道8位开始的变换,L*的范围是[01100],a*(-85.9297.96],b*(-107.54,94.20)。这些值是近似值。理论上,a*和b*是无界的,但你会发现一些地方讨论+-128、+-110等的限制。我的建议是简单地对每个值求和128,乘以100,然后四舍五入到整数(对于颜色来说应该足够精确)。任何给定的L*a*b三元组都可以用一个16位无符号整数表示。您可以将它们打包成一个64位整数。解包后,您将从每个值中减去128。如果您可以保留三个有符号短整数,事情就会简单得多

def rgb_xyz(r, g, b): # 2o. D65
    triple = [r, g, b]

    v, d = 0.04045, 12.94
    for i, c in enumerate(triple):
        triple[i] = 100 * (c / d if c <= v else ((c + 0.055)/1.055)**2.4)

    multipliers = (
            (0.4124, 0.3576, 0.1805),
            (0.2126, 0.7152, 0.0722),
            (0.0193, 0.1192, 0.9505))

    x, y, z = [sum(row[i] * triple[i] for i in range(3))
            for row in multipliers]
    return x, y, z

def xyz_cielab(x, y, z):
    triple = [x, y, z]

    t0, a, b = 0.008856, 7.787, 16/116.
    ref = (95.047, 100.0, 108.883)
    for i, c in enumerate(triple):
        triple[i] /= ref[i]
        c = triple[i]
        triple[i] = c ** (1/3.) if c > t0 else a * c + b

    l = 116 * triple[0] - 16
    a = 500 * (triple[0] - triple[1])
    b = 200 * (triple[1] - triple[2])
    return l, a, b
defrgb_xyz(r,g,b):#2o.D65
三重=[r,g,b]
v、 d=0.04045,12.94
对于枚举中的i,c(三重):
三重[i]=100*(如果c t0为其他a*c+b,则c/d
l=116*三重[0]-16
a=500*(三重[0]-三重[1])
b=200*(三重[1]-三重[2])
返回l、a、b

负整数也是整数,为什么这对你来说是个问题?实际问题是你得到的是实数,而不是整数,对吗?你当然可以从中得到整数,只需将实数乘以某个值,比如100,然后截断,然后接受你失去了一些精度。如果有RGB->CIELAB pu,我会感到惊讶依赖于整数域,精度与使用reals的域相同。最后,有很多方法可以从RGB转换为CIELAB,因为您来自一个设备相关的空间,并将进入一个独立的空间。我想您可能误解了,或者我没有正确解释。我已将RGB转换为实验室值。如何存储这些v例如,对于以后的检索,XML文件中的值?对于RGB,我将使用此
((r&0x0ff)您是说您也将代表RGB的压缩整数转换为压缩整数中的CIELAB?看起来您不知道颜色空间相关和独立于设备之间的转换。若要提供任何帮助,您需要显示您的转换过程。我将RGB->XYZ转换为XYZ->LAB,如本文所述转换如下我已经用已知的结果测试了值。我现在有了一个LAB结构(带有双L、双a、双B字段)。这就是我目前正在做的。有没有一种方法可以将它保存为一个整数值,就像我可以使用RGB结构一样,接受较小的精度损失?感谢可能在某个时候,我会检查您使用的这些转换在CIELab中获得的值的范围,并在截断之前建议一些实际的乘法值。然后我我会将此作为答案发布。