#include "stdafx.h" #include "ColorTransfer.h" CColorTransfer::CColorTransfer() { } CColorTransfer::~CColorTransfer() { } COLORREF CColorTransfer::ApproximateColor(COLORREF crScr, double diff) { double h, s, l; RGB2HSL(crScr, h, s, l); l -= diff; return HSL2RGB(h, s, l); } void CColorTransfer::RGB2HSL(COLORREF color, double &H, double &S, double &L) { double R, G, B, Max, Min, del_R, del_G, del_B, del_Max; R = GetRValue(color) / 255.0; //Where RGB values = 0 ¡Â 255 G = GetGValue(color) / 255.0; B = GetBValue(color) / 255.0; Min = min(R, min(G, B)); //Min. value of RGB Max = max(R, max(G, B)); //Max. value of RGB del_Max = Max - Min; //Delta RGB value L = (Max + Min) / 2.0; if (del_Max == 0) { // This is a gray, no chroma... // H = 2.0/3.0; //WindowsÏÂSֵΪ0ʱ£¬HֵʼÖÕΪ160£¨2/3*240£© H = 0; //HSL results = 0 ¡Â 1 S = 0; } else { //Chromatic data... if (L < 0.5) { S = del_Max / (Max + Min); } else { S = del_Max / (2 - Max - Min); } del_R = (((Max - R) / 6.0) + (del_Max / 2.0)) / del_Max; del_G = (((Max - G) / 6.0) + (del_Max / 2.0)) / del_Max; del_B = (((Max - B) / 6.0) + (del_Max / 2.0)) / del_Max; if (R == Max) { H = del_B - del_G; } else if (G == Max) { H = (1.0 / 3.0) + del_R - del_B; } else if (B == Max) { H = (2.0 / 3.0) + del_G - del_R; } if (H < 0) { H += 1; } if (H > 1) { H -= 1; } } } COLORREF CColorTransfer::HSL2RGB(double H, double S, double L) { double R, G, B; double var_1, var_2; if (S == 0) { // HSL values = 0 ¡Â 1 R = L * 255.0; //RGB results = 0 ¡Â 255 G = L * 255.0; B = L * 255.0; } else { if (L < 0.5) { var_2 = L * (1 + S); } else { var_2 = (L + S) - (S * L); } var_1 = 2.0 * L - var_2; R = 255.0 * Hue2RGB(var_1, var_2, H + (1.0 / 3.0)); G = 255.0 * Hue2RGB(var_1, var_2, H); B = 255.0 * Hue2RGB(var_1, var_2, H - (1.0 / 3.0)); } return RGB(R, G, B); } double CColorTransfer::Hue2RGB(double v1, double v2, double vH) { if (vH < 0) { vH += 1; } if (vH > 1) { vH -= 1; } if (6.0 * vH < 1) { return v1 + (v2 - v1) * 6.0 * vH; } if (2.0 * vH < 1) { return v2; } if (3.0 * vH < 2) { return v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0; } return (v1); }