2013-03-14 12 views
12

Mam problemy z konwersji kolorów z RGB do przestrzeni LAB Należy prosto do przodu za pomocą formuł z here, tylko ja dostaję z powrotem niewłaściwych wartościRGB do XYZ i kolorów LAB konwersji

  • RGB = 56,79,132

  • X = 8,592

  • Y = 8,099
  • Z = 22.940

i CIE L * ab jak

  • L * 34,188
  • a * 8,072
  • b * -32,478

to jest kod; ale nie widzę, gdzie idę źle. Być może ze względu na zmienne punkty, takie jak ten fella przede mną. Dziękuję Ci.

// user colour 
var Red = 56; 
var Green = 79; 
var Blue = 132; 

// user colour converted to XYZ space 
XYZ = RGBtoXYZ(Red,Green,Blue) 
var colX = XYZ[0]; 
var colY = XYZ[1]; 
var colZ = XYZ[2]; 

// alert(XYZ) 

LAB = XYZtoLAB(colX, colY, colZ) 

alert(LAB) 

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

    if (var_R > 0.04045) var_R = ((var_R + 0.055)/1.055)^2.4 
    else     var_R = var_R/12.92 
    if (var_G > 0.04045) var_G = ((var_G + 0.055)/1.055)^2.4 
    else     var_G = var_G/12.92 
    if (var_B > 0.04045) var_B = ((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 XYZtoLAB(x, y, z) 
{ 
    var ref_X = 95.047; 
    var ref_Y = 100.000; 
    var ref_Z = 108.883; 

    var_X = x/ref_X   //ref_X = 95.047 Observer= 2°, Illuminant= D65 
    var_Y = y/ref_Y   //ref_Y = 100.000 
    var_Z = z/ref_Z   //ref_Z = 108.883 

    if (var_X > 0.008856) var_X = var_X^(1/3) 
    else     var_X = (7.787 * var_X) + (16/116) 
    if (var_Y > 0.008856) var_Y = var_Y^(1/3) 
    else     var_Y = (7.787 * var_Y) + (16/116) 
    if (var_Z > 0.008856) var_Z = var_Z^(1/3) 
    else     var_Z = (7.787 * var_Z) + (16/116) 

    CIE_L = (116 * var_Y) - 16 
    CIE_a = 500 * (var_X - var_Y) 
    CIE_b = 200 * (var_Y - var_Z) 

return [CIE_L, CIE_a, CIE_b] 
} 

Odpowiedz

15

jestem całkiem pewny ^ jest bitowe xor w JavaScript nie operator moc. Myślę, że Math.pow jest tym, czego szukasz.

0

function xyzc(c){return ((c/255)>0.04045)?Math.pow((((c/255)+0.055)/1.055),2.4)*100:(c/255)/12.92*100;}

Linia ta będzie konwertować kanał RGB do XYZ

Powiązane problemy