Можно рисовать на битмапе и юзать простой фильтр сглаживания
Вроде этого.
Код: Выделить всё
// простое сглаживание .... не "по Гаусу" но зато быстро.
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;
Clip.BeginUpdate(False);
for Y:=0 to pred(Clip.Height) do
begin
P0:=Clip.ScanLine[Y];
if Y-Amount<0 then P1:=Clip.ScanLine[Y] else P1:=Clip.ScanLine[Y-Amount]; {Y-Amount>0}
if Y+Amount<Clip.Height then P2:=Clip.ScanLine[Y+Amount] else P2:=Clip.ScanLine[Clip.Height-Y]; {Y+Amount>=Height}
for X:=0 to pred(Clip.Width) do
begin
if X-Amount<0 then CX:=X else CX:=X-Amount; {X-Amount>0}
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; {X+Amount>=Width}
Buf[2,0]:=P1[CX*3];
Buf[2,1]:=P1[CX*3+1];
Buf[2,2]:=P1[CX*3+2];
Buf[3,0]:=P2[CX*3];
Buf[3,1]:=P2[CX*3+1];
Buf[3,2]:=P2[CX*3+2];
P0[X*3]:=(Buf[0,0]+Buf[1,0]+Buf[2,0]+Buf[3,0]) shr 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;
Clip.EndUpdate(False);
end;
...или этого.
Код: Выделить всё
//******************************
//АнтиАляйзинг
procedure AntiAliasRect(var Clip: TBitmap; XOrigin,YOrigin,XFinal,YFinal: integer);
var Memo,X,Y: integer; (* Composantes primaires des points environnants *)
P0,P1,P2: PByteArray;
begin
if XFinal<XOrigin then
begin
Memo:=XOrigin;
XOrigin:=XFinal;
XFinal:=Memo;
end; (* Inversion des valeurs *)
if YFinal<YOrigin then
begin
Memo:=YOrigin;
YOrigin:=YFinal;
YFinal:=Memo;
end; (* si diff‚rence n‚gative*)
XOrigin:=Max(1,XOrigin);
YOrigin:=Max(1,YOrigin);
XFinal:=Min(Clip.Width-2,XFinal);
YFinal:=Min(Clip.Height-2,YFinal);
//Clip.PixelFormat:=pf24bit;
for Y:=YOrigin to YFinal do
begin
Clip.BeginUpdate(False);
P0:=Clip.ScanLine[Y-1];
P1:=Clip.ScanLine[Y];
P2:=Clip.ScanLine[Y+1];
for X:=XOrigin to XFinal do
begin
P1[X*3]:=(P0[X*3]+P2[X*3]+P1[(X-1)*3]+P1[(x+1)*3]) div 4;
P1[X*3+1]:=(P0[X*3+1]+P2[X*3+1]+P1[(X-1)*3+1]+P1[(X+1)*3+1]) div 4;
P1[X*3+2]:=(P0[X*3+2]+P2[X*3+2]+P1[(X-1)*3+2]+P1[(X+1)*3+2]) div 4;
end;
Clip.EndUpdate(False);
end;
end;