算法如下(来自维基百科):
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:
实现代码如下(原创 = =):
输入:R,G,B (real类型)
输出:0~1之间的real类型数据,乘以360得角度值
function RGB2H(R:real;G:real;B:real):real;
var
mi:real;
ma:real;
del_R,del_G,del_B,del_Max:real;
H : real;
begin
R:=R/255;
G:=G/255;
B:=B/255;
mi:=Min(R,Min(G,B));
ma:=Max(R,Max(G,B));
del_Max:=Ma-Mi;
if(del_Max = 0) then
begin
H := 0;
end
else
begin
del_R := ((Ma-R/6.0)+(del_Max/2.0))/del_Max;
del_G := ((Ma-G/6.0)+(del_Max/2.0))/del_Max;
del_B := ((Ma-B/6.0)+(del_Max/2.0))/del_Max;
if R=Ma then begin H:=del_B-del_G; end
else if G=Ma then begin H:=(1.0/3.0)+del_R-del_B; end
else if B=Ma then begin H:=(2.0/3.0)+del_G-del_R; end
end;
if(H<0) then H:=H+1;
if(H>1) then H:=H-1;
RGB2H:=H;
end;
还需要这两个函数,本来在cpp的math.h里有的,delphi找不到,自己写
function Min(a:real;b:real):real;
begin
if a < b then
begin
Min := a;
end
else
begin
Min := b;
end;
end;
function Max(a:real;b:real):real;
begin
if a > b then
begin
Max := a;
end
else
begin
Max := b;
end;
end;
200字以内,仅用于支线交流,主线讨论请采用回复功能。