Javascript 十六进制到HunterLab颜色转换值

Javascript 十六进制到HunterLab颜色转换值,javascript,jquery,colors,hex,Javascript,Jquery,Colors,Hex,我必须将XYZ转换为HunterLab颜色。我已经使用这个网站计算()尝试了下面的代码。问题是我没有得到确切的输出值 在下面的小提琴中,我选择了这个十六进制颜色代码(“#e33054”)。我的HunterLab结果是43.6862,63.8433,16.6580 当我与这个站点()进行比较时,输出值(43.6863,63.8431,16.6536)稍有错误 我附上了easyrgb.com网站的截图。我使用了下图中的大部分X、Y、Z值。如果要显示正确的精确结果,需要使用哪些X、Y、Z值 $(d

我必须将XYZ转换为HunterLab颜色。我已经使用这个网站计算()尝试了下面的代码。问题是我没有得到确切的输出值

在下面的小提琴中,我选择了这个十六进制颜色代码(“#e33054”)。我的HunterLab结果是43.6862,63.8433,16.6580

当我与这个站点()进行比较时,输出值(43.6863,63.8431,16.6536)稍有错误

我附上了easyrgb.com网站的截图。我使用了下图中的大部分X、Y、Z值。如果要显示正确的精确结果,需要使用哪些X、Y、Z值

$(document).ready(function() {

function RGBtoXYZ(R, G, B)
{
    var_R = parseFloat( R / 255 )        
    var_G = parseFloat( G / 255 )        
    var_B = parseFloat( B / 255 )        

    if ( var_R > 0.04045 ) var_R = Math.pow(( ( var_R + 0.055 ) / 1.055 ), 2.4)
    else                   var_R = var_R / 12.92
    if ( var_G > 0.04045 ) var_G = Math.pow(( ( var_G + 0.055 ) / 1.055 ), 2.4)
    else                   var_G = var_G / 12.92
    if ( var_B > 0.04045 ) var_B = Math.pow(( ( var_B + 0.055 ) / 1.055 ), 2.4)
    else                   var_B = var_B / 12.92

    var_R = var_R * 100
    var_G = var_G * 100
    var_B = var_B * 100

    //Observer. = 2°, Illuminant = D65
    X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
    Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
    Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505
    return [X, Y, Z]
}

function XYZtoHunter(X, Y, Z) 
{
    var_Ka = ( 175.0 / 198.04 ) * ( 100.000 + 98.03894 )
    var_Kb = (  70.0 / 218.11 ) * ( 100.000 + 118.1045 )

    Hunter_L = 100.0 * Math.sqrt( Y / 100.000 )
    Hunter_a = var_Ka * ( ( ( X / 98.03894 ) - ( Y / 100.000 ) ) / Math.sqrt( Y / 100.000 ) )
    Hunter_b = var_Kb * ( ( ( Y / 100.000 ) - ( Z / 118.1045 ) ) / Math.sqrt( Y / 100.000 ) )
    return [Hunter_L, Hunter_a, Hunter_b]
}

$("#flat").spectrum({
        color: "#fff",
        showInput: true,
        preferredFormat: "hex6",

        change: function(color) {
      var xyz = color.toRgbString().replace('rgb(','');
            var xyzclr = xyz.replace(')','');
            var mystring = xyzclr;
            var splits = mystring.split(",");
      var bbb = RGBtoXYZ(splits[0], splits[1], splits[2]);
      var ccc = XYZtoHunter(bbb[0], bbb[1], bbb[2]);
      $(".hunterlb").text("Hunter Lab: " + ccc);
      }
      });

});

这可能与计算中的精度问题或各种矩阵和光源数据的四舍五入方式有关

作为参考,我使用#e33054获得CIE XYZ三刺激值,并使用 详情如下:

[0.343348156796269 0.190877270586848 0.102641996187028]
[95.045592705167152 100.000000000000000 108.905775075987847]
这与的[34.3357 19.0849 10.2616]不同

虽然这是一个有争议的实际问题,但实际上您有一个主要的实施问题,这也影响到您引用的网站,因为您得到的结果几乎相同:

假设您的十六进制值按照传递函数和您在
RGBtoXYZ
函数中使用的转换矩阵,使用sRGB颜色空间进行编码。sRGB使用D65作为具有CIE XYZ三刺激值的光源,如下所示:

[0.343348156796269 0.190877270586848 0.102641996187028]
[95.045592705167152 100.000000000000000 108.905775075987847]
但是,您的
XYZtoHunter
函数使用了不同的参考白点,接近C

[98.03894 100.000 118.1045]
这是不正确的,您可能需要使用与sRGB到CIE XYZ转换所用光源相同的光源,或者根据
XYZtoHunter
功能使用的光源对三刺激值进行颜色调整

我已经计算了不同光源下测试颜色对应的Hunter实验室值:

RGB:  [227.000000000000000 48.000000000000000 84.000000000000000]
XYZ:  [0.343348156796269 0.190877270586848 0.102641996187028]
A [46.504499644334125 64.843762706004426 10.523794703973838]
C [43.793566931997233 65.186253736429975 15.569392726793327]
D50 [44.346077037498887 68.520955438240733 13.605094920688586]
D60 [43.868910583037632 67.708490946827283 14.514756461641493]
D65 [43.688755978973106 67.215867228676174 14.862203270379064]
D75 [43.406074307560630 66.195808970976557 15.425166890191013]
F2 [44.802450532649551 68.731031818870903 12.746488963663195]
TL 4 [45.145148163779659 67.238144444096079 12.884252260395227]
UL 3000 [46.368214893847501 65.905510666492106 10.227507087643088]
以及获取这些值的代码:

将numpy导入为np
进口颜色
从color.notation.triplet导入十六进制到RGB
RGB=十六进制到RGB(“#e33054”)
打印('RGB:',np.圆形(RGB*255))
打印('XYZ:',color.sRGB_to_XYZ(RGB))
“名称”为“已排序的光源”(
颜色.HUNTERLAB_光源['cie_2_1931'].项目()):
XYZ=color.RGB_到XYZ(
RGB,
颜色.光源['cie_2_1931']['D65'],
颜色XYZ_至xy(光源XYZ_n),
color.sRGB_colorspace.RGB_到XYZ_矩阵,
解码\u cctf=color.sRGB\u colorspace.decoding\u cctf)
打印(名称,颜色.XYZ_至_Hunter_实验室(
XYZ*100,XYZ_n=光源.XYZ_n,K_ab=光源.K_ab))