procedure Effect_GaussianBlur(Amount:integer;Picture:TBitmap);

var BB:TBitmap;

begin

BB :=TBitmap.Create;

BB.PixelFormat :=pf24bit;

BB.Assign(Picture.Bitmap);

GaussianBlur(BB,Amount);

Picture.Bitmap.Assign(BB);

BB.Free;

end;

procedure GaussianBlur(var clip:TBitmap;Amount:integer);

var

i:integer;

begin

for i:=Amount downto 0 do

SplitBlur(clip,3);

end;

procedure SplitBlur(var clip:TBitmap;Amount:integer);

var

p0,p1,p2:PByteArray;

cx,x,y:integer;

Buf:array[0..3,0..2] of byte;

begin

if Amount=0 then Exit;

for y:=0 to clip.Height-1 do

begin

if y-Amount<0 then

p1:=clip.Scanline[y]

else

p1:=clip.Scanline[y-Amount];

if y+Amount<clip.Height then

p2:=clip.Scanline[y+Amount]

else

p2:=clip.Scanline[clip.Height-y]

for x:=0 to clip.Width-1 do

begin

if x-Amount<0 then cx:=x;

Buf[0,0]:=p1[cx*3];

Buf[0,1]:=p1[cx*3+1];

Buf[0,2]:=p1[cx*3+2];

Buf[1,0]:=p2[cx*3];

Buf[1,1]:=p2[cx*3+1];

Buf[1,2]:=p2[cx*3+2];

if x+Amount<clip.Width then

cx:=x+Amount

else

cx:=clip.Width-x;

Buf[2,0]:=p1[cx*3];

Buf[2,1]:=p1[cx*3+1];

Buf[2,2]:=p1[cx*3+2];

Buf[3,0]:=p1[cx*3];

Buf[3,1]:=p1[cx*3+1];

Buf[3,2]:=p1[cx*3+2];

p0[x*3+1]:=(Buf[0,1]+Buf[1,1]+Buf[2,1]+Buf[3,1]) shr 2;

p0[x*3+2]:=(Buf[0,2]+Buf[1,2]+Buf[2,2]+Buf[3,2]) shr 2;

end;

end;

end;