现在网上关于饱和度、明度等的调整的介绍很多;没看到关于色调(色相、色度)的调整,在photoshop中可以全图调整,也可以调整为某一颜色;
  哪位大虾有这方面的资料或想法,请说一说。谢谢!

解决方案 »

  1.   

    估计你也是想实现类似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;
      

  2.   

    hue的范围是0-360,分别是代表的是7种、还是8种颜色?这我忘了
    这是针对TImage进行的颜色hsl变换
    在gdi+中又如何设置呢?用矩阵吗?
      

  3.   

    找了下,不只跟h,s,l,里面还要处理Alpha
    也就是说,要看图像是多少位图的,谢谢上面两位。
    每个位图的处理方式基本不一样。
    当然,最好的就是先转换成24位图的,再处理