hsl中h的调整? 现在网上关于饱和度、明度等的调整的介绍很多;没看到关于色调(色相、色度)的调整,在photoshop中可以全图调整,也可以调整为某一颜色; 哪位大虾有这方面的资料或想法,请说一说。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 估计你也是想实现类似MSN,QQ更换色调和亮度的功能。上网搜索了N久没找到,偶然在同事给我的一个代码中找到了。贴给你吧:{------------------------------------------------------------------------------}{hsl颜色空间到rgb空间的转换}procedure HSLtoRGB(H, S, L: Double; var R, G, B: Integer);var //类似于返回多个值的函数 Sat, Lum: Double;begin R:= 0; G:= 0; B:= 0; if (H < 360) and (H >= 0) and (S <= 100) and (S >= 0) and (L <= 100) and (L >= 0) then begin if H <= 60 then begin R:= 255; G:= Round((255 / 60) * H); B:= 0; end else if H <= 120 then begin R:= Round(255 - (255 / 60) * (H - 60)); G:= 255; B:= 0; end else if H <= 180 then begin R:= 0; G:= 255; B:= Round((255 / 60) * (H - 120)); end else if H <= 240 then begin R:= 0; G:= Round(255 - (255 / 60) * (H - 180)); B:= 255; end else if H <= 300 then begin R:= Round((255 / 60) * (H - 240)); G:= 0; B:= 255; end else if H < 360 then begin R:= 255; G:= 0; B:= Round(255 - (255 / 60) * (H - 300)); end; Sat:= Abs((S - 100) / 100); R:= Round(R - ((R - 128) * Sat)); G:= Round(G - ((G - 128) * Sat)); B:= Round(B - ((B - 128) * Sat)); Lum:= (L - 50) / 50; if Lum > 0 then begin R:= Round(R + ((255 - R) * Lum)); G:= Round(G + ((255 - G) * Lum)); B:= Round(B + ((255 - B) * Lum)); end else if Lum < 0 then begin R:= Round(R + (R * Lum)); G:= Round(G + (G * Lum)); B:= Round(B + (B * Lum)); end; end;end;{------------------------------------------------------------------------------}{RGB空间到HSL空间的转换}procedure RGBtoHSL(R, G, B: Integer; var H, S, L: Double);var Delta: Double; CMax, CMin: Double; Red, Green, Blue, Hue, Sat, Lum: Double;begin Red := R / 255; Green:= G / 255; Blue := B / 255; CMax:= Max(Red, Max(Green, Blue)); CMin:= Min(Red, Min(Green, Blue)); Lum:= (CMax + CMin) / 2; if CMax = CMin then begin Sat:= 0; Hue:= 0; end else begin if Lum < 0.5 then Sat:=(CMax - CMin) / (CMax + CMin) else Sat:=(cmax - cmin) / (2 - cmax - cmin); delta:= CMax - CMin; if Red = CMax then Hue:= (Green - Blue) / Delta else if Green = CMax then Hue:= 2 + (Blue - Red) / Delta else Hue:= 4.0 + (Red - Green) / Delta; Hue:= Hue / 6; if Hue < 0 then Hue:= Hue + 1; end; H:= (Hue * 360); S:= (Sat * 100); L:= (Lum * 100);end;主要就是这两个函数。进行RGB和HSL空间转换的。实现整体换色调的方法就是: 对于图片上的每一点,先计算出它的HSL值(假设为H1, S1, L1)。 然后,计算出需要更换的颜色的HSL值(假设为H2, S2, L2)。 最后,根据需要更换的颜色的H(H2),S(S2)和原来点的L(L1)值,重新计算出RGB值。伪代码:(自己写写就理解了,就不贴源代码了) RGBToHSL(GetRValue(), GetGValue(), GetBValue(), H1, S1, L1); for 图片上的每一点 do begin clrSrc:= 像素点(X, Y)的RGB值; RGBToHSL(GetRValue(clrSrc), GetGValue(clrSrc), GetBValue(clrSrc), H1, S1, L1); HSLToRGB(H2, S2, L1, R, G, B); 像素点(X, Y)的RGB值 = RGB(R, G, B); end; hue的范围是0-360,分别是代表的是7种、还是8种颜色?这我忘了这是针对TImage进行的颜色hsl变换在gdi+中又如何设置呢?用矩阵吗? 找了下,不只跟h,s,l,里面还要处理Alpha也就是说,要看图像是多少位图的,谢谢上面两位。每个位图的处理方式基本不一样。当然,最好的就是先转换成24位图的,再处理 将panel创建在StringGrid后,滚动条滚动时产生的问题。 好久没有在CSDN冒泡了,***送分*** delphi7控件代码分析中遇到的困惑! 怎样在dbgrid表里做这种编辑字段???? 离开 论坛 散分【八】 怎么通过DBGRID把图片存储到表格中? delphi6的问题 解决者有分 关于 object pascal 的一些概念性问题,急! 如何传递一个TComponen给DLL?? 有谁知道bupack控件的注册码吗? 求一个sql语句!!着急!!在线等!! 将两条select语句的查询结果显示在一个DBGrid中~大家有方法没?
贴给你吧:
{------------------------------------------------------------------------------}
{hsl颜色空间到rgb空间的转换}
procedure HSLtoRGB(H, S, L: Double; var R, G, B: Integer);
var //类似于返回多个值的函数
Sat, Lum: Double;
begin
R:= 0;
G:= 0;
B:= 0; if (H < 360) and (H >= 0) and (S <= 100) and (S >= 0) and (L <= 100) and
(L >= 0) then
begin
if H <= 60 then
begin
R:= 255;
G:= Round((255 / 60) * H);
B:= 0;
end
else if H <= 120 then
begin
R:= Round(255 - (255 / 60) * (H - 60));
G:= 255;
B:= 0;
end
else if H <= 180 then
begin
R:= 0;
G:= 255;
B:= Round((255 / 60) * (H - 120));
end
else if H <= 240 then
begin
R:= 0;
G:= Round(255 - (255 / 60) * (H - 180));
B:= 255;
end
else if H <= 300 then
begin
R:= Round((255 / 60) * (H - 240));
G:= 0;
B:= 255;
end
else if H < 360 then
begin
R:= 255;
G:= 0;
B:= Round(255 - (255 / 60) * (H - 300));
end; Sat:= Abs((S - 100) / 100);
R:= Round(R - ((R - 128) * Sat));
G:= Round(G - ((G - 128) * Sat));
B:= Round(B - ((B - 128) * Sat)); Lum:= (L - 50) / 50;
if Lum > 0 then
begin
R:= Round(R + ((255 - R) * Lum));
G:= Round(G + ((255 - G) * Lum));
B:= Round(B + ((255 - B) * Lum));
end
else if Lum < 0 then
begin
R:= Round(R + (R * Lum));
G:= Round(G + (G * Lum));
B:= Round(B + (B * Lum));
end;
end;
end;{------------------------------------------------------------------------------}
{RGB空间到HSL空间的转换}
procedure RGBtoHSL(R, G, B: Integer; var H, S, L: Double);
var
Delta: Double;
CMax, CMin: Double;
Red, Green, Blue, Hue, Sat, Lum: Double;
begin
Red := R / 255;
Green:= G / 255;
Blue := B / 255; CMax:= Max(Red, Max(Green, Blue));
CMin:= Min(Red, Min(Green, Blue)); Lum:= (CMax + CMin) / 2; if CMax = CMin then
begin
Sat:= 0;
Hue:= 0;
end
else begin
if Lum < 0.5 then
Sat:=(CMax - CMin) / (CMax + CMin)
else
Sat:=(cmax - cmin) / (2 - cmax - cmin); delta:= CMax - CMin; if Red = CMax then
Hue:= (Green - Blue) / Delta
else if Green = CMax then
Hue:= 2 + (Blue - Red) / Delta
else
Hue:= 4.0 + (Red - Green) / Delta; Hue:= Hue / 6;
if Hue < 0 then
Hue:= Hue + 1;
end; H:= (Hue * 360);
S:= (Sat * 100);
L:= (Lum * 100);
end;主要就是这两个函数。进行RGB和HSL空间转换的。
实现整体换色调的方法就是:
对于图片上的每一点,先计算出它的HSL值(假设为H1, S1, L1)。
然后,计算出需要更换的颜色的HSL值(假设为H2, S2, L2)。
最后,根据需要更换的颜色的H(H2),S(S2)和原来点的L(L1)值,重新计算出RGB值。伪代码:(自己写写就理解了,就不贴源代码了) RGBToHSL(GetRValue(), GetGValue(), GetBValue(), H1, S1, L1); for 图片上的每一点 do
begin
clrSrc:= 像素点(X, Y)的RGB值; RGBToHSL(GetRValue(clrSrc), GetGValue(clrSrc), GetBValue(clrSrc), H1, S1, L1);
HSLToRGB(H2, S2, L1, R, G, B); 像素点(X, Y)的RGB值 = RGB(R, G, B);
end;
这是针对TImage进行的颜色hsl变换
在gdi+中又如何设置呢?用矩阵吗?
也就是说,要看图像是多少位图的,谢谢上面两位。
每个位图的处理方式基本不一样。
当然,最好的就是先转换成24位图的,再处理