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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       DynamicSkinForm                                             }
  5. {       Version 4.98                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2002 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. unit spEffBmp;
  15. {$P+,S-,W-,R-}
  16. {$WARNINGS OFF}
  17. {$HINTS OFF}
  18. interface
  19. uses Graphics, Windows;
  20. type
  21.   TFColor = record
  22.     b, g, r: Byte;
  23.   end;
  24.   PFColor = ^TFColor;
  25.   TLine = array[0..0] of TFColor;
  26.   PLine = ^TLine;
  27.   TspEffectBmp = class(TObject)
  28.   private
  29.     procedure SetPixel(x,y: Integer; Clr: Integer);
  30.     function GetPixel(x,y: Integer): Integer;
  31.     procedure SetLine(y: Integer; Line: Pointer);
  32.     function GetLine(y:Integer): Pointer;
  33.   public
  34.     Handle, Width, Height, Size: Integer;
  35.     Bits: Pointer;
  36.     BmpHeader: TBITMAPINFOHEADER;
  37.     BmpInfo: TBITMAPINFO;
  38.     constructor Create(cx, cy: Integer);
  39.     constructor CreateFromhWnd(hBmp: Integer);
  40.     constructor CreateCopy(hBmp: TspEffectBmp);
  41.     destructor  Destroy; override;
  42.     property Pixels[x,y: Integer]: Integer read GetPixel write SetPixel;
  43.     property ScanLines[y:Integer]: Pointer read GetLine write SetLine;
  44.     procedure GetScanLine(y: Integer; Line:Pointer);
  45.     procedure Resize(Dst: TspEffectBmp);
  46.     procedure Draw(hDC, x, y: Integer);
  47.     procedure Stretch(hDC, x, y, cx, cy: Integer);
  48.     procedure DrawRect(hDC, hx, hy, x, y, cx, cy: Integer);
  49.     procedure CopyRect(BMP: TspEffectBmp; Rct:TRect; StartX, StartY: Integer);
  50.     procedure MorphRect(BMP: TspEffectBmp; Kf: Double; Rct: TRect;
  51.                         StartX, StartY: Integer);
  52.     procedure Morph(BMP: TspEffectBmp; Kf: Double);
  53.     procedure MorphHGrad(BMP: TspEffectBMP; Kf: Double);
  54.     procedure MorphVGrad(BMP: TspEffectBMP; Kf: Double);
  55.     procedure MorphGrad(BMP: TspEffectBMP; Kf: Double);
  56.     procedure MorphLeftGrad(BMP: TspEffectBMP; Kf: Double);
  57.     procedure MorphRightGrad(BMP: TspEffectBMP; Kf: Double);
  58.     procedure MorphLeftSlide(BMP: TspEffectBMP; Kf: Double);
  59.     procedure MorphRightSlide(BMP: TspEffectBMP; Kf: Double);
  60.     procedure MorphPush(BMP: TspEffectBMP; Kf: Double);
  61.     procedure ChangeBrightness(Kf: Double);
  62.     procedure ChangeDarkness(Kf: Double);
  63.     procedure GrayScale;
  64.     procedure SplitBlur(Amount: Integer);
  65.     procedure Mosaic(ASize: Integer);
  66.     procedure Invert;
  67.     procedure AddColorNoise(Amount: Integer);
  68.     procedure AddMonoNoise(Amount: Integer);
  69.     procedure Rotate90_1(Dst: TspEffectBmp);
  70.     procedure Rotate90_2(Dst: TspEffectBmp);
  71.   end;
  72.   PEfBmp = ^TspEffectBmp;
  73. implementation
  74. uses Forms;
  75. procedure CheckRGB(var r, g, b: Integer);
  76. begin
  77.   if r > 255 then r := 255 else if r < 0 then r := 0;
  78.   if g > 255 then g := 255 else if g < 0 then g := 0;
  79.   if b > 255 then b := 255 else if b < 0 then b := 0;
  80. end;
  81. procedure TspEffectBmp.SetPixel(x, y: Integer; Clr:Integer);
  82. begin
  83.   CopyMemory(
  84.     Pointer(Integer(Bits) + (y * (Width mod 4)) + (((y * Width) + x) * 3)), @Clr, 3);
  85. end;
  86. function TspEffectBmp.GetPixel(x,y:Integer):Integer;
  87. begin
  88.   CopyMemory(
  89.     @Result,
  90.     Pointer(Integer(Bits) + (y * (Width mod 4)) + (((y * Width) + x) * 3)), 3);
  91. end;
  92. procedure TspEffectBmp.SetLine(y:Integer;Line:Pointer);
  93. begin
  94.   CopyMemory(
  95.     Pointer(Integer(Bits) + (y*(Width mod 4)) + ((y * Width) * 3)), Line, Width * 3);
  96. end;
  97. function TspEffectBmp.GetLine(y:Integer):Pointer;
  98. begin
  99.   Result := Pointer(Integer(Bits) + (y * (Width mod 4)) + ((y * Width) * 3));
  100. end;
  101. procedure TspEffectBmp.GetScanLine(y:Integer;Line:Pointer);
  102. begin
  103.   CopyMemory(
  104.     Line,
  105.     Pointer(Integer(Bits) + (y * (Width mod 4)) + ((y * Width) * 3)), Width * 3);
  106. end;
  107. constructor TspEffectBmp.Create(cx,cy:Integer);
  108. begin
  109.   Width := cx;
  110.   Height := cy;
  111.   Size := ((Width * 3) + (Width mod 4)) * Height;
  112.   with BmpHeader do
  113.   begin
  114.     biSize := SizeOf(BmpHeader);
  115.     biWidth := Width;
  116.     biHeight := -Height;
  117.     biPlanes := 1;
  118.     biBitCount := 24;
  119.     biCompression := BI_RGB;
  120.   end;
  121.   BmpInfo.bmiHeader := BmpHeader;
  122.   Handle := CreateDIBSection(0, BmpInfo, DIB_RGB_COLORS, Bits, 0, 0);
  123. end;
  124. constructor TspEffectBmp.CreateFromhWnd(hBmp:Integer);
  125. var
  126.   Bmp: TBITMAP;
  127.   hDC: Integer;
  128. begin
  129.   hDC := CreateDC('DISPLAY', nil, nil, nil);
  130.   SelectObject(hDC, hBmp);
  131.   GetObject(hBmp, SizeOf(Bmp), @Bmp);
  132.   Width := Bmp.bmWidth;
  133.   Height := Bmp.bmHeight;
  134.   Size := ((Width * 3) + (Width mod 4)) * Height;
  135.   with BmpHeader do
  136.   begin
  137.     biSize := SizeOf(BmpHeader);
  138.     biWidth := Width;
  139.     biHeight := -Height;
  140.     biPlanes := 1;
  141.     biBitCount := 24;
  142.     biCompression := BI_RGB;
  143.   end;
  144.   BmpInfo.bmiHeader := BmpHeader;
  145.   Handle := CreateDIBSection(0, BmpInfo, DIB_RGB_COLORS, Bits, 0, 0);
  146.   GetDIBits(hDC, hBmp, 0, Height, Bits, BmpInfo, DIB_RGB_COLORS);
  147.   DeleteDC(hDC);
  148. end;
  149. constructor TspEffectBmp.CreateCopy(hBmp:TspEffectBmp);
  150. begin
  151.   BmpHeader := hBmp.BmpHeader;
  152.   BmpInfo := hBmp.BmpInfo;
  153.   Width := hBmp.Width;
  154.   Height := hBmp.Height;
  155.   Size := ((Width * 3) + (Width mod 4)) * Height;
  156.   Handle := CreateDIBSection(0, BmpInfo, DIB_RGB_COLORS, Bits, 0 , 0);
  157.   CopyMemory(Bits, hBmp.Bits, Size);
  158. end;
  159. procedure TspEffectBmp.Stretch(hDC,x,y,cx,cy:Integer);
  160. begin
  161.   StretchDiBits(hDC,
  162.                 x, y, cx, cy,
  163.                 0, 0, Width, Height,
  164.                 Bits,
  165.                 BmpInfo,
  166.                 DIB_RGB_COLORS,
  167.                 SRCCOPY);
  168. end;
  169. procedure TspEffectBmp.Draw(hDC,x,y:Integer);
  170. begin
  171.   SetDIBitsToDevice(hDC,
  172.                     x, y, Width, Height,
  173.                     0, 0, 0, Height,
  174.                     Bits,
  175.                     BmpInfo,
  176.                     DIB_RGB_COLORS);
  177. end;
  178. procedure TspEffectBmp.DrawRect(hDC,hx,hy,x,y,cx,cy:Integer);
  179. begin
  180.   StretchDiBits(hDC,
  181.                 hx, hy + cy - 1, cx,-cy + 1,
  182.                 x, Height - y, cx, -cy + 1,
  183.                 Bits,
  184.                 BmpInfo,
  185.                 DIB_RGB_COLORS,
  186.                 SRCCOPY);
  187. end;
  188. procedure TspEffectBmp.Resize(Dst:TspEffectBmp);
  189. var
  190.   xCount, yCount, x,y: Integer;
  191.   xScale, yScale: Double;
  192. begin
  193.   xScale := (Dst.Width-1) / Width;
  194.   yScale := (Dst.Height-1) / Height;
  195.   for y := 0 to Height-1 do
  196.   for x := 0 to Width-1 do
  197.     begin
  198.       for yCount := 0 to Round(yScale) do
  199.       for xCount := 0 to Round(xScale) do
  200.         Dst.Pixels[Round(xScale * x) + xCount, Round(yScale * y) + yCount] := Pixels[x,y];
  201.     end;
  202. end;
  203. procedure TspEffectBmp.Morph(BMP: TspEffectBmp; Kf: Double);
  204. var
  205.   x, y, r, g, b: Integer;
  206.   Line, L: PLine;
  207. begin
  208.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  209.   if kf < 0 then kf := 0;
  210.   if kf > 1 then kf := 1;
  211.   GetMem(Line, Width * 3);
  212.   for y := 0 to Height - 1 do
  213.   begin
  214.     GetScanLine(y,Line);
  215.     L := BMP.ScanLines[y];
  216.     for x := 0 to Width - 1 do
  217.     begin
  218.       r := Round(Line^[x].r * (1 - kf) + L^[x].r * kf);
  219.       g := Round(Line^[x].g * (1 - kf) + L^[x].g * kf);
  220.       b := Round(Line^[x].b * (1 - kf) + L^[x].b * kf);
  221.       CheckRGB(r, g, b);
  222.       Line^[x].r := r;
  223.       Line^[x].g := g;
  224.       Line^[x].b := b;
  225.     end;
  226.     ScanLines[y] := Line;
  227.   end;
  228.   FreeMem(Line, Width * 3);
  229. end;
  230. procedure TspEffectBmp.MorphRect(BMP: TspEffectBmp; Kf: Double;
  231.                                  Rct: TRect;
  232.                                  StartX, StartY: Integer);
  233. var
  234.   x,y, x1,y1, r, g, b : Integer;
  235.   Line, L: PLine;
  236. begin
  237.   if kf < 0 then kf := 0;
  238.   if kf > 1 then kf := 1;
  239.   GetMem(Line,Width*3);
  240.   y1 := StartY;
  241.   for y := Rct.Top to Rct.Bottom - 1 do
  242.   begin
  243.     GetScanLine(y,Line);
  244.     L := BMP.ScanLines[y1];
  245.     x1 := StartX;
  246.     for x := Rct.Left to Rct.Right - 1 do
  247.     begin
  248.       r := Round(Line^[x].r * (1 - kf) + L^[x1].r * kf);
  249.       g := Round(Line^[x].g * (1 - kf) + L^[x1].g * kf);
  250.       b := Round(Line^[x].b * (1 - kf) + L^[x1].b * kf);
  251.       CheckRGB(r, g, b);
  252.       Line^[x].r := r;
  253.       Line^[x].g := g;
  254.       Line^[x].b := b;
  255.       Inc(x1);
  256.     end;
  257.     ScanLines[y] := Line;
  258.     Inc(y1);
  259.   end;
  260.   FreeMem(Line, Width * 3);
  261. end;
  262. procedure TspEffectBmp.CopyRect(BMP: TspEffectBmp; Rct: TRect;
  263.                                 StartX, StartY:Integer);
  264. var
  265.   x,y,x1,y1: Integer;
  266.   Line, L: PLine;
  267. begin
  268.   GetMem(Line,Width*3);
  269.   y1 := StartY;
  270.   if Rct.Right > Width - 1 then Rct.Right := Width - 1;
  271.   if Rct.Bottom > Height - 1 then Rct.Bottom := Height - 1;
  272.   for y := Rct.Top to Rct.Bottom do
  273.   begin
  274.     GetScanLine(y,Line);
  275.     L := BMP.ScanLines[y1];
  276.     x1 := StartX;
  277.     for x := Rct.Left to Rct.Right do
  278.     begin
  279.       Line^[x] := L^[x1];
  280.       Inc(x1);
  281.     end;
  282.     ScanLines[y] := Line;
  283.     Inc(y1);
  284.   end;
  285.   FreeMem(Line, Width * 3);
  286. end;
  287. procedure TspEffectBmp.MorphHGrad;
  288. var
  289.   x, y, r, g, b: Integer;
  290.   Line, L: PLine;
  291.   kf1: Double;
  292.   step: Double;
  293.   f : Double;
  294.   p1, p2: Integer;
  295.   Offset: Integer;
  296. begin
  297.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  298.   GetMem(Line,Width * 3);
  299.   Offset := Round(Width * kf);
  300.   f := (Width - Offset) div 2;
  301.   if f <> 0
  302.   then
  303.     Step := 1 / f
  304.   else
  305.     Step := 1;
  306.   p1 := Width div 2 - Offset div 2;
  307.   if p1 < 0 then p1 := 0;
  308.   p2 := Width div 2 + Offset div 2;
  309.   if p2 > Width - 1 then p2 := Width - 1;
  310.   for y := 0 to Height - 1 do
  311.   begin
  312.     GetScanLine(y, Line);
  313.     L := BMP.ScanLines[y];
  314.     for x := p1 to p2 do
  315.     begin
  316.       Line^[x].r := L^[x].r;
  317.       Line^[x].g := L^[x].g;
  318.       Line^[x].b := L^[x].b;
  319.      end;
  320.      ScanLines[y] := Line;
  321.    end;
  322.   for y := 0 to Height - 1 do
  323.   begin
  324.     GetScanLine(y,Line);
  325.     L := BMP.ScanLines[y];
  326.     kf1 := 0;
  327.     for x := p1 downto 0 do
  328.     begin
  329.       r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
  330.       g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
  331.       b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
  332.       CheckRGB(r, g, b);
  333.       Line^[x].r := r;
  334.       Line^[x].g := g;
  335.       Line^[x].b := b;
  336.       kf1 := kf1 + Step;
  337.       if kf1 > 1 then kf1 := 1;
  338.      end;
  339.      ScanLines[y] := Line;
  340.    end;
  341.    for y := 0 to Height - 1 do
  342.    begin
  343.      GetScanLine(y,Line);
  344.      L := BMP.ScanLines[y];
  345.      kf1 := 0;
  346.      for x := p2 to Width - 1 do
  347.      begin
  348.        r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
  349.        g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
  350.        b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
  351.        CheckRGB(r, g, b);
  352.        Line^[x].r := r;
  353.        Line^[x].g := g;
  354.        Line^[x].b := b;
  355.        kf1 := kf1 + Step;
  356.        if kf1 > 1 then kf1 := 1;
  357.      end;
  358.      ScanLines[y] := Line;
  359.    end;
  360.   FreeMem(Line, Width * 3);
  361. end;
  362. procedure TspEffectBmp.MorphVGrad;
  363. var
  364.   x, y, r, g, b: Integer;
  365.   Line, L: PLine;
  366.   kf1: Double;
  367.   step: Double;
  368.   f : Double;
  369.   p1, p2: Integer;
  370.   Offset: Integer;
  371. begin
  372.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  373.   GetMem(Line, Width * 3);
  374.   Offset := Round(Height * kf);
  375.   f := (Height - 1 - Offset) div 2;
  376.   if f <> 0
  377.   then
  378.     Step := 1 / f
  379.   else
  380.     Step := 0;
  381.   p1 := Height div 2 - Offset div 2;
  382.   if p1 < 0 then p1 := 0;
  383.   p2 := Height div 2 + Offset div 2;
  384.   if p2 > Height - 1 then p2 := Height - 1;
  385.   for y := p1 to p2 do
  386.   begin
  387.     GetScanLine(y, Line);
  388.     L := BMP.ScanLines[y];
  389.     for x := 0 to Width - 1 do
  390.     begin
  391.       Line^[x].r := L^[x].r;
  392.       Line^[x].g := L^[x].g;
  393.       Line^[x].b := L^[x].b;
  394.      end;
  395.      ScanLines[y] := Line;
  396.    end;
  397.   kf1 := 0;
  398.   for y := p1 downto 0 do
  399.   begin
  400.     GetScanLine(y,Line);
  401.     L := BMP.ScanLines[y];
  402.     for x := 0 to Width - 1 do
  403.     begin
  404.       r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
  405.       g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
  406.       b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
  407.       CheckRGB(r, g, b);
  408.       Line^[x].r := r;
  409.       Line^[x].g := g;
  410.       Line^[x].b := b;
  411.      end;
  412.      ScanLines[y] := Line;
  413.      kf1 := kf1 + Step;
  414.      if kf1 > 1 then kf1 := 1;
  415.    end;
  416.    kf1 := 0;
  417.    for y := p2 to Height - 1 do
  418.    begin
  419.      GetScanLine(y,Line);
  420.      L := BMP.ScanLines[y];
  421.      for x := 0 to Width - 1 do
  422.      begin
  423.        r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
  424.        g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
  425.        b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
  426.        CheckRGB(r, g, b);
  427.        Line^[x].r := r;
  428.        Line^[x].g := g;
  429.        Line^[x].b := b;
  430.      end;
  431.      ScanLines[y] := Line;
  432.      kf1 := kf1 + Step;
  433.      if kf1 > 1 then kf1 := 1;
  434.    end;
  435.   FreeMem(Line, Width * 3);
  436. end;
  437. procedure TspEffectBmp.MorphGrad;
  438. begin
  439.   if Width >= Height
  440.   then MorphHGrad(BMP, kf)
  441.   else MorphVGrad(BMP, kf);
  442. end;
  443. procedure TspEffectBmp.MorphLeftGrad;
  444. var
  445.   x, y, r, g, b: Integer;
  446.   Line, L: PLine;
  447.   kf1: Double;
  448.   step: Double;
  449.   f : Integer;
  450. begin
  451.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  452.   GetMem(Line, Width * 3);
  453.   f := Round(Width * kf);
  454.   if f < 1 then f := 1;
  455.   if f > Width - 1 then f := Width - 1;
  456.   if f > 0
  457.   then
  458.     Step := 1 / f
  459.   else
  460.     Step := 1;
  461.   for y := 0 to Height - 1 do
  462.   begin
  463.     GetScanLine(y,Line);
  464.     L := BMP.ScanLines[y];
  465.     kf1 := 0;
  466.     for x := 0 to f do
  467.     begin
  468.       r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
  469.       g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
  470.       b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
  471.       CheckRGB(r, g, b);
  472.       Line^[x].r := r;
  473.       Line^[x].g := g;
  474.       Line^[x].b := b;
  475.       kf1 := kf1 + Step;
  476.       if kf1 > 1 then kf1 := 1;
  477.      end;
  478.      ScanLines[y] := Line;
  479.    end;
  480.   FreeMem(Line, Width * 3);
  481. end;
  482. procedure TspEffectBmp.MorphRightGrad;
  483. var
  484.   x, y, r, g, b: Integer;
  485.   Line, L: PLine;
  486.   kf1: Double;
  487.   step: Double;
  488.   f : Integer;
  489. begin
  490.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  491.   GetMem(Line, Width * 3);
  492.   f := Width - Round(Width * kf);
  493.   if f < 0 then f := 0;
  494.   if f > Width - 1 then f := Width - 1;
  495.   if Width - f > 0
  496.   then
  497.     Step := 1 / (Width - f)
  498.   else
  499.     Step := 1;
  500.   for y := 0 to Height - 1 do
  501.   begin
  502.     GetScanLine(y,Line);
  503.     L := BMP.ScanLines[y];
  504.     kf1 := 0;
  505.     for x := Width - 1 downto f do
  506.     begin
  507.       r := Round(Line^[x].r * kf1 + L^[x].r * (1 - kf1));
  508.       g := Round(Line^[x].g * kf1 + L^[x].g * (1 - kf1));
  509.       b := Round(Line^[x].b * kf1 + L^[x].b * (1 - kf1));
  510.       CheckRGB(r, g, b);
  511.       Line^[x].r := r;
  512.       Line^[x].g := g;
  513.       Line^[x].b := b;
  514.       kf1 := kf1 + Step;
  515.       if kf1 > 1 then kf1 := 1;
  516.      end;
  517.      ScanLines[y] := Line;
  518.    end;
  519.   FreeMem(Line, Width * 3);
  520. end;
  521. procedure TspEffectBmp.MorphPush(BMP: TspEffectBMP; Kf: Double);
  522. var
  523.   x, y, x1: Integer;
  524.   Line, L: PLine;
  525.   f : Integer;
  526. begin
  527.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  528.   GetMem(Line, Width * 3);
  529.   f := Round(Width * kf);
  530.   if f < 0
  531.   then f := 0
  532.   else if f > Width - 1 then f := Width - 1;
  533.   for y := 0 to Height - 1 do
  534.   begin
  535.     GetScanLine(y,Line);
  536.     L := BMP.ScanLines[y];
  537.     for x := Width - 1 downto f do
  538.     begin
  539.       x1 := x - f - 1;
  540.       if x1 < 0 then x1 := 0;
  541.       Line^[x].r := Line^[x1].r;
  542.       Line^[x].g := Line^[x1].g;
  543.       Line^[x].b := Line^[x1].b;
  544.      end;
  545.      ScanLines[y] := Line;
  546.    end;           
  547.   for y := 0 to Height - 1 do
  548.   begin
  549.     GetScanLine(y,Line);
  550.     L := BMP.ScanLines[y];
  551.     x1 := Width - f - 1;
  552.     if x1 < 0 then x1 := 0;
  553.     for x := 0 to f do
  554.     begin
  555.       Line^[x].r := L^[x1].r;
  556.       Line^[x].g := L^[x1].g;
  557.       Line^[x].b := L^[x1].b;
  558.       inc(x1);
  559.       if x1 > Width - 1 then x1 := Width - 1;
  560.     end;
  561.     ScanLines[y] := Line;
  562.   end;
  563.   FreeMem(Line, Width * 3);
  564. end;
  565. procedure TspEffectBmp.MorphLeftSlide;
  566. var
  567.   x, y, x1: Integer;
  568.   Line, L: PLine;
  569.   f : Integer;
  570. begin
  571.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  572.   GetMem(Line, Width * 3);
  573.   f := Round(Width * kf);
  574.   if f < 1 then f := 1;
  575.   if f > Width - 1 then f := Width - 1;
  576.   for y := 0 to Height - 1 do
  577.   begin
  578.     GetScanLine(y,Line);
  579.     L := BMP.ScanLines[y];
  580.     x1 := Width - 1 - f;
  581.     if x1 < 0 then x1 := 0;
  582.     for x := 0 to f - 1 do
  583.     begin
  584.       inc(x1);
  585.       if x1 > Width -1 then x1 := Width - 1;
  586.       Line^[x].r := L^[x1].r;
  587.       Line^[x].g := L^[x1].g;
  588.       Line^[x].b := L^[x1].b;
  589.     end;
  590.     ScanLines[y] := Line;
  591.   end;
  592.   FreeMem(Line, Width * 3);
  593. end;
  594. procedure TspEffectBmp.MorphRightSlide;
  595. var
  596.   x, y, x1: Integer;
  597.   Line, L: PLine;
  598.   f : Integer;
  599. begin
  600.   if (BMP.Width <> Width) or (BMP.Height <> Height) then Exit;
  601.   GetMem(Line, Width * 3);
  602.   f := Round(Width * kf);
  603.   if f < 1 then f := 1;
  604.   if f > Width - 1 then f := Width - 1;
  605.   for y := 0 to Height - 1 do
  606.   begin
  607.     GetScanLine(y,Line);
  608.     L := BMP.ScanLines[y];
  609.     x1 := Width - 1 - f;
  610.     if x1 < 0 then x1 := 0;
  611.     for x := 0 to f - 1 do
  612.     begin
  613.       inc(x1);
  614.       if x1 > Width -1 then x1 := Width - 1;
  615.       Line^[x1].r := L^[x].r;
  616.       Line^[x1].g := L^[x].g;
  617.       Line^[x1].b := L^[x].b;
  618.     end;
  619.     ScanLines[y] := Line;
  620.   end;
  621.   FreeMem(Line, Width * 3);
  622. end;
  623. destructor TspEffectBmp.Destroy;
  624. begin
  625.   DeleteObject(Handle);
  626.   inherited;
  627. end;
  628. procedure TspEffectBmp.ChangeBrightness(Kf: Double);
  629. var
  630.   x, y, r, g, b: Integer;
  631.   Line: PLine;
  632. begin
  633.   if Kf < 0 then Kf := 0 else if Kf > 1 then Kf := 1;
  634.   GetMem(Line, Width * 3);
  635.   for y := 0 to Height - 1 do
  636.   begin
  637.     GetScanLine(y, Line);
  638.     for x := 0 to Width - 1 do
  639.     begin
  640.       r := Round(Line^[x].r * (1 - Kf) + 255 * Kf);
  641.       g := Round(Line^[x].g * (1 - Kf) + 255 * Kf);
  642.       b := Round(Line^[x].b * (1 - Kf) + 255 * Kf);
  643.       CheckRGB(r, g, b);
  644.       Line^[x].r := r;
  645.       Line^[x].g := g;
  646.       Line^[x].b := b;
  647.     end;
  648.     ScanLines[y] := Line;
  649.   end;
  650.   FreeMem(Line, Width * 3);
  651. end;
  652. procedure TspEffectBmp.Invert;
  653. var
  654.   x, y, r, g, b: Integer;
  655.   Line: PLine;
  656. begin
  657.   GetMem(Line, Width * 3);
  658.   for y := 0 to Height - 1 do
  659.   begin
  660.     GetScanLine(y, Line);
  661.     for x := 0 to Width - 1 do
  662.     begin
  663.       r := not Line^[x].r;
  664.       g := not Line^[x].g;
  665.       b := not Line^[x].b;
  666.       CheckRGB(r, g, b);
  667.       Line^[x].r := r;
  668.       Line^[x].g := g;
  669.       Line^[x].b := b;
  670.     end;
  671.     ScanLines[y] := Line;
  672.   end;
  673.   FreeMem(Line, Width * 3);
  674. end;
  675. procedure TspEffectBmp.ChangeDarkness(Kf: Double);
  676. var
  677.   x, y, r, g, b: Integer;
  678.   Line: PLine;
  679. begin
  680.   if Kf < 0 then Kf := 0 else if Kf > 1 then Kf := 1;
  681.   GetMem(Line, Width * 3);
  682.   for y := 0 to Height - 1 do
  683.   begin
  684.     GetScanLine(y, Line);
  685.     for x := 0 to Width - 1 do
  686.     begin
  687.       r := Round(Line^[x].r * (1 - Kf));
  688.       g := Round(Line^[x].g * (1 - Kf));
  689.       b := Round(Line^[x].b * (1 - Kf));
  690.       CheckRGB(r, g, b);
  691.       Line^[x].r := r;
  692.       Line^[x].g := g;
  693.       Line^[x].b := b;
  694.     end;
  695.     ScanLines[y] := Line;
  696.   end;
  697.   FreeMem(Line, Width * 3);
  698. end;
  699. procedure TspEffectBmp.GrayScale;
  700. var
  701.   x, y: Integer;
  702.   Line: PLine;
  703.   Gray: Byte;
  704. begin
  705.   GetMem(Line, Width * 3);
  706.   for y := 0 to Height - 1 do
  707.   begin
  708.     GetScanLine(y, Line);
  709.     for x := 0 to Width - 1 do
  710.     begin
  711.       Gray := Round(Line^[x].r * 0.3 + Line^[x].g * 0.59 + Line^[x].b * 0.11);
  712.       if Gray > 255 then Gray := 255 else if Gray < 0 then Gray := 0;
  713.       Line^[x].r := Gray;
  714.       Line^[x].g := Gray;
  715.       Line^[x].b := Gray;
  716.     end;
  717.     ScanLines[y] := Line;
  718.   end;
  719.   FreeMem(Line, Width * 3);
  720. end;
  721. procedure TspEffectBmp.SplitBlur(Amount: Integer);
  722. var
  723.   cx, x, y: Integer;
  724.   L, L1, L2: PLine;
  725.   Buf: array[0..3] of TFColor;
  726.   Tmp: TFColor;
  727. begin
  728.   if Amount = 0 then Exit;
  729.   for y := 0 to Height-1 do
  730.   begin
  731.     L := ScanLines[y];
  732.     if y - Amount < 0
  733.     then L1:=ScanLines[y]
  734.     else L1:=ScanLines[y - Amount];
  735.     if y + Amount < Height
  736.     then L2:=ScanLines[y + Amount]
  737.     else L2:=ScanLines[Height - y];
  738.     for x := 0 to Width - 1 do
  739.     begin
  740.       if x - Amount < 0 then cx := x else cx := x - Amount;
  741.       Buf[0] := L1[cx];
  742.       Buf[1] := L2[cx];
  743.       if x + Amount < Width then cx := x + Amount else cx := Width - x;
  744.       Buf[2] := L1^[cx];
  745.       Buf[3] := L2^[cx];
  746.       Tmp.r := (Buf[0].r + Buf[1].r + Buf[2].r + Buf[3].r) div 4;
  747.       Tmp.g := (Buf[0].g + Buf[1].g + Buf[2].g + Buf[3].g) div 4;
  748.       Tmp.b := (Buf[0].b + Buf[1].b + Buf[2].b + Buf[3].b) div 4;
  749.       L^[x] := Tmp;
  750.     end;
  751.   end;
  752. end;
  753. procedure TspEffectBmp.Mosaic(ASize: Integer);
  754. var
  755.   x, y, i, j : Integer;
  756.   L1, L2: PLine;
  757.   r, g, b : Byte;
  758. begin
  759.   y := 0;
  760.   repeat
  761.     L1 := Scanlines[y];
  762.     x := 0;
  763.     repeat
  764.       j := 1;
  765.       repeat
  766.       L2 := Scanlines[y];
  767.       x := 0;
  768.       repeat
  769.         r := L1[x].r;
  770.         g := L1[x].g;
  771.         b := L1[x].b;
  772.         i:=1;
  773.        repeat
  774.        L2[x].r := r;
  775.        L2[x].g := g;
  776.        L2[x].b := b;
  777.        inc(x);
  778.        inc(i);
  779.        until (x >= Width) or (i > ASize);
  780.       until x >= Width;
  781.       inc(j);
  782.       inc(y);
  783.       until ( y >= Height) or (j > ASize);
  784.     until (y >= Height) or (x >= Width);
  785.   until y >= Height;
  786. end;
  787. procedure TspEffectBmp.AddMonoNoise(Amount:Integer);
  788. var
  789.   x,y,r,g,b,z: Integer;
  790.   Line: PLine;
  791. begin
  792.   GetMem(Line, Width * 3);
  793.   for y := 0 to Height - 1 do
  794.   begin
  795.     GetScanLine(y,Line);
  796.     for x:=0 to Width-1 do
  797.     begin
  798.       z := Random(Amount) - Amount div 2;
  799.       r := Line^[x].r + z;
  800.       g := Line^[x].g + z;
  801.       b := Line^[x].b + z;
  802.       CheckRGB(r, g, b);
  803.       Line^[x].r := r;
  804.       Line^[x].g := g;
  805.       Line^[x].b := b;
  806.     end;
  807.     ScanLines[y] := Line;
  808.   end;
  809.   FreeMem(Line, Width * 3);
  810. end;
  811. procedure TspEffectBmp.AddColorNoise(Amount:Integer);
  812. var
  813.   x,y,r,g,b: Integer;
  814.   Line: PLine;
  815. begin
  816.   GetMem(Line, Width * 3);
  817.   for y := 0 to Height - 1 do
  818.   begin
  819.     GetScanLine(y,Line);
  820.     for x:=0 to Width-1 do
  821.     begin
  822.       r := Line^[x].r + (Random(Amount) - (Amount div 2));
  823.       g := Line^[x].g + (Random(Amount) - (Amount div 2));
  824.       b := Line^[x].b + (Random(Amount) - (Amount div 2));
  825.       CheckRGB(r, g, b);
  826.       Line^[x].r := r;
  827.       Line^[x].g := g;
  828.       Line^[x].b := b;
  829.     end;
  830.     ScanLines[y] := Line;
  831.   end;
  832.   FreeMem(Line, Width * 3);
  833. end;
  834. procedure TspEffectBmp.Rotate90_1(Dst: TspEffectBmp);
  835. var
  836.   x, y: Integer;
  837. begin
  838.   for y := 0 to Height - 1 do
  839.   for x := 0 to Width - 1 do
  840.     Dst.Pixels[y, Width - 1 - x] := Pixels[x, y];
  841. end;
  842. procedure TspEffectBmp.Rotate90_2(Dst: TspEffectBmp);
  843. var
  844.   x, y: Integer;
  845. begin
  846.   for y := 0 to Height - 1 do
  847.   for x := 0 to Width - 1 do
  848.     Dst.Pixels[Height - 1 - y, x] := Pixels[x, y];
  849. end;
  850. end.