photosho默认的转换条件为:srgb and gamma2.2, 以下代码在次条件下模拟!
rgb2lab(double R, double G, double B, double &Lab_L,double &Lab_a, double &Lab_b)
{
double X, Y, Z;
double r = R / 255.000; // rgb range: 0 ~ 1
double g = G / 255.000;
double b = B / 255.000;
// gamma 2.2
if ( r > 0.04045 )
r = pow(( r + 0.055 ) / 1.055, 2.4);
else
r = r / 12.92;
if ( g > 0.04045 )
g = pow(( g + 0.055 ) / 1.055, 2.4);
else
g = g / 12.92;
if ( b > 0.04045 )
b = pow(( b + 0.055 ) / 1.055, 2.4);
else
b = b / 12.92;
// sRGB
X = r * 0.436052025 + g * 0.385081593 + b * 0.143087414;
Y = r * 0.222491598 + g * 0.716886060 + b * 0.060621486;
Z = r * 0.013929122 + g * 0.097097002 + b * 0.714185470;
// XYZ range: 0~100
X = X * 100.000;
Y = Y * 100.000;
Z = Z * 100.000;
// Reference White Point
double ref_X = 96.4221;
double ref_Y = 100.000;
double ref_Z = 82.5211;
X = X / ref_X;
Y = Y / ref_Y;
Z = Z / ref_Z;
// Lab
if (X > 0.008856)
X = pow(X, 1/3.000);
else
X = ( 7.787 * X ) + ( 16 / 116.000 );
if (Y > 0.008856)
Y = pow(Y, 1/3.000);
else
Y = ( 7.787 * Y ) + ( 16 / 116.000 );
if (Z > 0.008856)
Z = pow(Z, 1/3.000);
else
Z = ( 7.787 * Z ) + ( 16 / 116.000 );
Lab_L = ( 116.000 * Y ) - 16.000;
Lab_a = 500.000 * ( X - Y );
Lab_b = 200.000 * ( Y - Z );
}