LAPTOP-SNT8I5JK\Boounion
2025-06-21 088edcedd822070b6df3599aa87e08bea25a251d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#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);
}