Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Antialiasing   Найти похожие ветки 

 
Барковъ   (2008-01-04 13:50) [0]

type

PixArray = Array [0..2] of Byte;

....

procedure Antialiasing(Bitmap: TBitmap; Rect: TRect; Percent: Integer);
var
 pix, prevscan, nextscan, hpix: ^PixArray;
 l, p: Integer;
 R, G, B: Integer;
 R1, R2, G1, G2, B1, B2: Byte;
begin
 Bitmap.PixelFormat := pf24bit;
 with Bitmap.Canvas do
 begin
   Brush.Style := bsclear;
   for l := Rect.Top to Rect.Bottom - 1 do
   begin
     pix:= Bitmap.ScanLine[l];
     if l <> Rect.Top then prevscan := Bitmap.ScanLine[l-1]
     else prevscan := nil;
     if l <> Rect.Bottom - 1 then nextscan := Bitmap.ScanLine[l+1]
     else nextscan := nil;

     for p := Rect.Left to Rect.Right - 1 do
     begin
       R1 := pix^[2];
       G1 := pix^[1];
       B1 := pix^[0];

       if p <> Rect.Left then
       begin
         //Pixel links
         //Pixel left

         hpix := pix;
         dec(hpix);
         R2 := hpix^[2];
         G2 := hpix^[1];
         B2 := hpix^[0];

         if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
         begin
           R := R1 + (R2 - R1) * 50 div (Percent + 50);
           G := G1 + (G2 - G1) * 50 div (Percent + 50);
           B := B1 + (B2 - B1) * 50 div (Percent + 50);
           hpix^[2] := R;
           hpix^[1] := G;
           hpix^[0] := B;
         end;
       end;

       if p <> Rect.Right - 1 then
       begin
         //Pixel rechts
         //Pixel right
         hpix := pix;
         inc(hpix);
         R2 := hpix^[2];
         G2 := hpix^[1];
         B2 := hpix^[0];

         if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
         begin
           R := R1 + (R2 - R1) * 50 div (Percent + 50);
           G := G1 + (G2 - G1) * 50 div (Percent + 50);
           B := B1 + (B2 - B1) * 50 div (Percent + 50);
           hpix^[2] := R;
           hpix^[1] := G;
           hpix^[0] := B;
         end;
       end;

       if prevscan <> nil then
       begin
         //Pixel oben
         //Pixel up
         R2 := prevscan^[2];
         G2 := prevscan^[1];
         B2 := prevscan^[0];

         if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
         begin
           R := R1 + (R2 - R1) * 50 div (Percent + 50);
           G := G1 + (G2 - G1) * 50 div (Percent + 50);
           B := B1 + (B2 - B1) * 50 div (Percent + 50);
           prevscan^[2] := R;
           prevscan^[1] := G;
           prevscan^[0] := B;
         end;
         Inc(prevscan);
       end;

       if nextscan <> nil then
       begin
         //Pixel unten
         //Pixel down
         R2 := nextscan^[2];
         G2 := nextscan^[1];
         B2 := nextscan^[0];

         if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then
         begin
           R := R1 + (R2 - R1) * 50 div (Percent + 50);
           G := G1 + (G2 - G1) * 50 div (Percent + 50);
           B := B1 + (B2 - B1) * 50 div (Percent + 50);
           nextscan^[2] := R;
           nextscan^[1] := G;
           nextscan^[0] := B;
         end;
         Inc(nextscan);
       end;
       Inc(pix);
     end;
   end;
 end;
end;

...
  bmp.Canvas.FillRect(bmp.Canvas.ClipRect);
  bmp.Canvas.TextOut(0,0, IntToStr(Random(9999999999)));
  Antialiasing(bmp, Rect(0, 0, bmp.Width, bmp.Height), 50);
  form.Canvas.Draw(0,0, bmp);

по идее канвас я очищаю, но при многократном использовании
остаётся размытое предыдущее изображение при отрисовке на форме bmp.
Не подскажите где туплю?
и может у кого есть в загашнике какая шустрая отработка сглаживания?


 
Барковъ   (2008-01-04 15:19) [1]

блин,  Brush.Style := bsclear устанавливается :)

а насчет самого алгоритма может есть у кого пошустрей?


 
Amoeba ©   (2008-01-05 21:36) [2]

Может имеет смысл воспользоваться готовым решением (библиотекой):
http://g32.org/graphics32/index.html


 
homm ©   (2008-01-05 21:50) [3]

> [1] Барковъ   (04.01.08 15:19)
> а насчет самого алгоритма может есть у кого пошустрей?

Алгоритма чего?



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
15-1198489890
KV
2007-12-24 12:51
2008.02.03
delphi &amp; vista


2-1199844321
Abcdef123
2008-01-09 05:05
2008.02.03
Почему не работает CTRL+(LeftClick Mouse)?


2-1199628881
savyhinst
2008-01-06 17:14
2008.02.03
class function whatAshnyaga?


10-1142832134
Alex_C
2006-03-20 08:22
2008.02.03
Создание многопоточных приложений на COM


2-1199868237
DevilDevil
2008-01-09 11:43
2008.02.03
Почему может возникать неправильная максимизация ?