// Get the Lab value
void CCalculate::RGB2Lab(float R, float G, float B,
float *L, float *a, float *b)
{
double X, Y, Z, fX, fY, fZ; X = 0.412453*R + 0.357580*G + 0.180423*B;
Y = 0.212671*R + 0.715160*G + 0.072169*B;
Z = 0.019334*R + 0.119193*G + 0.950227*B; X /= (255 * 0.950456);
Y /= 255;
Z /= (255 * 1.088754); if (Y > 0.008856)
{
fY = pow(Y, 1.0/3.0);
*L = (float)(116.0*fY - 16.0 + 0.5);
}
else
{
fY = 7.787*Y + 16.0/116.0;
*L = (float)(903.3*Y + 0.5);
} if (X > 0.008856)
fX = pow(X, 1.0/3.0);
else
fX = 7.787*X + 16.0/116.0; if (Z > 0.008856)
fZ = pow(Z, 1.0/3.0);
else
fZ = 7.787*Z + 16.0/116.0; *a = (float)(500.0*(fX - fY) + 0.5);
*b = (float)(200.0*(fY - fZ) + 0.5);}
void CCalculate::RGB2Lab(float R, float G, float B,
float *L, float *a, float *b)
{
double X, Y, Z, fX, fY, fZ; X = 0.412453*R + 0.357580*G + 0.180423*B;
Y = 0.212671*R + 0.715160*G + 0.072169*B;
Z = 0.019334*R + 0.119193*G + 0.950227*B; X /= (255 * 0.950456);
Y /= 255;
Z /= (255 * 1.088754); if (Y > 0.008856)
{
fY = pow(Y, 1.0/3.0);
*L = (float)(116.0*fY - 16.0 + 0.5);
}
else
{
fY = 7.787*Y + 16.0/116.0;
*L = (float)(903.3*Y + 0.5);
} if (X > 0.008856)
fX = pow(X, 1.0/3.0);
else
fX = 7.787*X + 16.0/116.0; if (Z > 0.008856)
fZ = pow(Z, 1.0/3.0);
else
fZ = 7.787*Z + 16.0/116.0; *a = (float)(500.0*(fX - fY) + 0.5);
*b = (float)(200.0*(fY - fZ) + 0.5);}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货