Color.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:7k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit Color;
  2. interface
  3. uses
  4.   Classes,ComCtrls,Messages, Gauges,StdCtrls,StrUtils, ExtCtrls, SysUtils, Controls,
  5.   Windows, Graphics, Math, Forms;
  6. const
  7.    MaxPixelCount = 65536;
  8. type
  9.   PRGBTripleArray = ^TRGBTripleArray;
  10.   TRGBTripleArray = array[0..MaxPixelCount - 1] of TRGBTriple;
  11.   
  12.   function  ConvertBitmapToRTF(const Bitmap: TBitmap): string;
  13.   procedure HSLtoRGB(H, S, L: Double; var R, G, B: Integer);
  14.   procedure RGBtoHSL(R, G, B: Integer; var H, S, L: Double);
  15.   procedure ConvertBitmapToColor(DestBitmap:TBitmap;DestColor:TColor);
  16.   procedure ConvertBitmapToLighter(DestBitmap:TBitmap;FLightAdd:Integer);
  17. implementation
  18. {------------------------------------------------------------------------------}
  19. {将Bitmap转换为RTF格式}
  20. function ConvertBitmapToRTF(const Bitmap: TBitmap): string;
  21. var
  22.   bi, bb: string;
  23.   bis, bbs: Cardinal;
  24.   achar: string[2];
  25.   Buffer: string;
  26.   I: Integer;
  27. type
  28.   PWord = ^Word;
  29. begin
  30.   GetDIBSizes(Bitmap.Handle, bis, bbs);
  31.   SetLength(bi, bis);
  32.   SetLength(bb, bbs);
  33.   GetDIB(Bitmap.Handle, Bitmap.Palette, PChar(bi)^, PChar(bb)^);
  34.   SetLength(Buffer, (Length(bb) + Length(bi)) * 2);
  35.   i := 1;
  36.   for bis := 1 to Length(bi) do
  37.   begin
  38.     achar := IntToHex(Integer(bi[bis]), 2);
  39.     PWord(@Buffer[i])^ := PWord(@achar[1])^;
  40.     inc(i, 2);
  41.   end;
  42.   for bbs := 1 to Length(bb) do
  43.   begin
  44.     achar := IntToHex(Integer(bb[bbs]), 2);
  45.     PWord(@Buffer[i])^ := PWord(@achar[1])^;
  46.     inc(i, 2);
  47.   end;
  48.   Result := '{rtf1 {pictdibitmap ' + Buffer + ' }}';
  49. end;
  50. {------------------------------------------------------------------------------}
  51. {改变Bitmap的亮度}
  52. procedure ConvertBitmapToLighter(DestBitmap:TBitmap;FLightAdd:Integer);
  53. var
  54.    x, y, ScanlineBytes: integer;
  55.    p: prgbtriplearray;
  56.    RVALUE, bvalue, gvalue: integer;
  57.    hVALUE, sVALUE, lVALUE: Double;
  58. begin
  59.   if not DestBitmap.Empty then
  60.   begin
  61.     DestBitmap.PixelFormat:=pf24bit;
  62.     p := DestBitmap.ScanLine[0];
  63.     ScanlineBytes := integer(DestBitmap.ScanLine[1]) - integer(DestBitmap.ScanLine[0]);
  64.     for y := 0 to DestBitmap.Height - 1 do
  65.     begin
  66.       for x := 0 to DestBitmap.Width - 1 do
  67.       begin
  68.         RVALUE := p[x].rgbtRed;
  69.         gVALUE := p[x].rgbtGreen;
  70.         bVALUE := p[x].rgbtBlue;
  71.         RGBtoHSL(RVALUE, gVALUE, bVALUE, hVALUE, sVALUE, lVALUE);
  72.         lVALUE := min(100, lVALUE + FLightAdd);
  73.         HSLtorgb(hVALUE, sVALUE, lVALUE, rVALUE, gVALUE, bVALUE);
  74.         p[x].rgbtRed := RVALUE;
  75.         p[x].rgbtGreen := gVALUE;
  76.         p[x].rgbtBlue := bVALUE;
  77.       end;
  78.       inc(integer(p), ScanlineBytes);
  79.     end;
  80.   end;
  81. end;
  82. {------------------------------------------------------------------------------}
  83. {改变Bitmap的色调}
  84. procedure ConvertBitmapToColor(DestBitmap:TBitmap;DestColor:TColor);
  85. var
  86.    hexString:String;
  87.    x, y, ScanlineBytes: integer;
  88.    p: prgbtriplearray;
  89.    RVALUE, bvalue, gvalue: integer;
  90.    hVALUE, sVALUE, lVALUE: Double;
  91.    hNewVALUE, sNewVALUE, lNewVALUE  : Double;
  92. begin
  93.   if not DestBitmap.Empty then
  94.   begin
  95.     hexString:=IntToHex(DestColor,6);
  96.     RGBtoHSL(StrToInt('$'+Copy(hexString,5,2)), StrToInt('$'+Copy(hexString,3,2)), StrToInt('$'+Copy(hexString,1,2)), hNewVALUE, sNewVALUE, lNewVALUE);
  97.     DestBitmap.PixelFormat:=pf24bit;
  98.     p := DestBitmap.ScanLine[0];
  99.     ScanlineBytes := integer(DestBitmap.ScanLine[1]) - integer(DestBitmap.ScanLine[0]);
  100.     for y := 0 to DestBitmap.Height - 1 do
  101.     begin
  102.       for x := 0 to DestBitmap.Width - 1 do
  103.       begin
  104.         RVALUE := p[x].rgbtRed;
  105.         gVALUE := p[x].rgbtGreen;
  106.         bVALUE := p[x].rgbtBlue;
  107.         RGBtoHSL(RVALUE, gVALUE, bVALUE, hVALUE, sVALUE, lVALUE);
  108.         HSLtorgb(hNewVALUE, sNewVALUE, lVALUE, rVALUE, gVALUE, bVALUE);
  109.         p[x].rgbtRed := RVALUE;
  110.         p[x].rgbtGreen := gVALUE;
  111.         p[x].rgbtBlue := bVALUE;
  112.       end;
  113.       inc(integer(p), ScanlineBytes);
  114.     end;
  115.   end;
  116. end;
  117. {------------------------------------------------------------------------------}
  118. {hsl颜色空间到rgb空间的转换}
  119. procedure HSLtoRGB(H, S, L: Double; var R, G, B: Integer);
  120. var //类似于返回多个值的函数
  121.    Sat, Lum: Double;
  122. begin
  123.    R := 0;
  124.    G := 0;
  125.    B := 0;
  126.    if (H < 360) and (H >= 0) and (S <= 100) and (S >= 0) and (L <= 100) and (L
  127.       >=
  128.       0) then
  129.       begin
  130.          if H <= 60 then
  131.             begin
  132.                R := 255;
  133.                G := Round((255 / 60) * H);
  134.                B := 0;
  135.             end
  136.          else if H <= 120 then
  137.             begin
  138.                R := Round(255 - (255 / 60) * (H - 60));
  139.                G := 255;
  140.                B := 0;
  141.             end
  142.          else if H <= 180 then
  143.             begin
  144.                R := 0;
  145.                G := 255;
  146.                B := Round((255 / 60) * (H - 120));
  147.             end
  148.          else if H <= 240 then
  149.             begin
  150.                R := 0;
  151.                G := Round(255 - (255 / 60) * (H - 180));
  152.                B := 255;
  153.             end
  154.          else if H <= 300 then
  155.             begin
  156.                R := Round((255 / 60) * (H - 240));
  157.                G := 0;
  158.                B := 255;
  159.             end
  160.          else if H < 360 then
  161.             begin
  162.                R := 255;
  163.                G := 0;
  164.                B := Round(255 - (255 / 60) * (H - 300));
  165.             end;
  166.          Sat := Abs((S - 100) / 100);
  167.          R := Round(R - ((R - 128) * Sat));
  168.          G := Round(G - ((G - 128) * Sat));
  169.          B := Round(B - ((B - 128) * Sat));
  170.          Lum := (L - 50) / 50;
  171.          if Lum > 0 then
  172.             begin
  173.                R := Round(R + ((255 - R) * Lum));
  174.                G := Round(G + ((255 - G) * Lum));
  175.                B := Round(B + ((255 - B) * Lum));
  176.             end
  177.          else if Lum < 0 then
  178.             begin
  179.                R := Round(R + (R * Lum));
  180.                G := Round(G + (G * Lum));
  181.                B := Round(B + (B * Lum));
  182.             end;
  183.       end;
  184. end;
  185. {------------------------------------------------------------------------------}
  186. {RGB空间到HSL空间的转换}
  187. procedure RGBtoHSL(R, G, B: Integer; var H, S, L: Double);
  188. var
  189.    Delta: Double;
  190.    CMax, CMin: Double;
  191.    Red, Green, Blue, Hue, Sat, Lum: Double;
  192. begin
  193.    Red := R / 255;
  194.    Green := G / 255;
  195.    Blue := B / 255;
  196.    CMax := Max(Red, Max(Green, Blue));
  197.    CMin := Min(Red, Min(Green, Blue));
  198.    Lum := (CMax + CMin) / 2;
  199.    if CMax = CMin then
  200.       begin
  201.          Sat := 0;
  202.          Hue := 0;
  203.       end
  204.    else
  205.       begin
  206.          if Lum < 0.5 then
  207.             Sat := (CMax - CMin) / (CMax + CMin)
  208.          else
  209.             Sat := (cmax - cmin) / (2 - cmax - cmin);
  210.          delta := CMax - CMin;
  211.          if Red = CMax then
  212.             Hue := (Green - Blue) / Delta
  213.          else if Green = CMax then
  214.             Hue := 2 + (Blue - Red) / Delta
  215.          else
  216.             Hue := 4.0 + (Red - Green) / Delta;
  217.          Hue := Hue / 6;
  218.          if Hue < 0 then
  219.             Hue := Hue + 1;
  220.       end;
  221.    H := (Hue * 360);
  222.    S := (Sat * 100);
  223.    L := (Lum * 100);
  224. end;
  225. end.
  226.