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

Вниз

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

 
toropoff   (2012-02-15 12:49) [0]

помогите, может в закромах у кого есть быстрая процедурка Antialiasing"a..
на мелком битмапе отрисован текст. при увеличении масштабирования ессно контур рваный. необходимо сгладить края.
bmp: pf32bit, delphiXE2

и кстати "• Кладовка - Исходные тексты. Модули, программы, компоненты и другое."   - срок регистрации домена закончился...


 
RWolf ©   (2012-02-15 13:03) [1]

оверсамплинг → гауссово размытие → приведение к исходному разрешению.


 
toropoff   (2012-02-15 13:10) [2]

RWolf ©, спасибо.. я примерно понимаю..
хотелось бы готовый, быстрый, проверенный код.
вариантов нагуглил достаточно, пробывал и сам написать..
скорость не очень только.
может есть у кого вариант с загрузкой битмапа в массив, с ассемблерными вставками..
я понимаю, что просить готовое тут наверное не принято..


 
toropoff   (2012-02-15 13:34) [3]

вот такой код пока:

procedure AntiAlias2(clip: tbitmap);
var
x,y: Integer;
p0, p1, p2: pbytearray;
begin
for y:=2 to clip.Height - 2 do begin
   p0:=clip.ScanLine [y-1];
   p1:=clip.scanline [y];
   p2:=clip.ScanLine [y+1];
   for x:=2 to clip.Width - 2 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;
end;

end;

я х.з. куда его и оптимизировать..
одно радует - не очень большой :)


 
Омлет ©   (2012-02-15 13:41) [4]

http://delphimaster.net/view/8-1192295230/


 
toropoff   (2012-02-15 13:46) [5]

Омлет ©, спасибо, именно этот пост я и перечитывал несколько раз прежде чем задать тут вопрос.
подумал может есть у кого что другое..


 
Омлет ©   (2012-02-15 13:46) [6]


> и кстати "• Кладовка - Исходные тексты. Модули, программы,
>  компоненты и другое."   - срок регистрации домена закончился.

Казанову уже ищут )


 
Омлет ©   (2012-02-15 13:48) [7]


> подумал может есть у кого что другое..

FastDIB там упоминается..


 
Омлет ©   (2012-02-15 13:55) [8]


> я х.з. куда его и оптимизировать..


Ну, как минимум, избавиться от умножений:

  x3 := 6;
  for x := 2 to clip.Width - 2 do begin
     p1[x3] := (p0[x3]+p2[x3]+p1[x3-3]+p1[x3+3]) shr 2;
     p1[x3+1] := (p0[x3+1]+p2[x3+1]+p1[x3-2]+p1[x3+4]) shr 2;
     p1[x3+2] := (p0[x3+2]+p2[x3+2]+p1[x3-1]+p1[x3+5]) shr 2;
     inc(x, 3);
   end;


 
toropoff   (2012-02-15 14:02) [9]

Омлет ©, точно век живи век учись..
спасибо!


 
Омлет ©   (2012-02-15 14:04) [10]

Потом избавиться от ScanLine в цикле.

LineSize := clip.Width * 4;
p0 := clip.ScanLine[0];
p1 := clip.scanline[1];
p2 := clip.ScanLine[2];
for y:=2 to clip.Height - 2 do begin
 x3 := 6;
 for x :=  ...
   ...
 end;
 inc(integer(p0), LineSize);
 inc(integer(p1), LineSize);
 inc(integer(p2), LineSize);
end;


Кстати, так делать неправильно - изменять пиксели и тут же брать их для расчета соседних (следующих строк). Необходимо иметь исходное и результирующее изображение. Исходное меняться не должно. Иначе будет накапливаться эффект от строки к строке.


 
toropoff   (2012-02-15 14:26) [11]

Омлет ©,
да, да..  я уже переделал через промежуточный битмап..
спасибо!


 
u4enik   (2012-02-16 00:08) [12]

Подниму тему, то же интересна.
Я сделал так:

//  bmpA - промежуточный битмап

BitBlt(bmpA.Canvas.Handle, 0, 0, videoWidth, videoHeight, clip.Canvas.Handle, 0, 0, SRCCOPY);

p0 := bmpA.ScanLine[0];
p1 := bmpA.scanline[1];
p2 := bmpA.ScanLine[2];

p3 := clip.ScanLine[1];

LineSize := Integer(p1) - Integer(p0);

r:= GetRValue(OutLyricUnit.ColorLyric.transparentColor);
g:= GetGValue(OutLyricUnit.ColorLyric.transparentColor);
b:= GetBValue(OutLyricUnit.ColorLyric.transparentColor);

for y:=1 to clip.Height - 2 do begin

   x3 := 4;

   for x:=1 to clip.Width - 2 do begin

      if (p3[x3] <> b) or (p3[x3+1] <> g) or (p3[x3+2] <> r) then  begin

        p3[x3]   :=  (p0[x3]+p2[x3]+p1[x3-4]+p1[x3+4])     shr 2;
        p3[x3+1] :=  (p0[x3+1]+p2[x3+1]+p1[x3-3]+p1[x3+5]) shr 2;
        p3[x3+2] :=  (p0[x3+2]+p2[x3+2]+p1[x3-2]+p1[x3+6]) shr 2;

      end;

      inc(x3, 4);

   end;

   inc(integer(p0), LineSize);
   inc(integer(p1), LineSize);
   inc(integer(p2), LineSize);
   inc(integer(p3), LineSize);

end;

Не могли бы подсказать другой алгоритм смешивания,  вместо:

        p3[x3]   :=  (p0[x3]+p2[x3]+p1[x3-4]+p1[x3+4])     shr 2;
        p3[x3+1] :=  (p0[x3+1]+p2[x3+1]+p1[x3-3]+p1[x3+5]) shr 2;
        p3[x3+2] :=  (p0[x3+2]+p2[x3+2]+p1[x3-2]+p1[x3+6]) shr 2;

а то что-то не очень сглаживает!


 
antonn ©   (2012-02-16 01:04) [13]

тут нужно внести ясность, т.к. из первого поста непонятки идут.
берется маленькое изображение, увеличивается, и его нужно сгладить? тогда АА тут не поможет, его можно размыть, но это не АА.
Или на маленькой картинке нужно нарисовать текст с АА? тогда это можно сделать либо через API (поискать в яндексе "lfQuality"), либо своими костылями примерно как тут http://desksoft.ru/index.php?forum=13&th=46


 
Омлет ©   (2012-02-16 11:28) [14]


> Не могли бы подсказать другой алгоритм смешивания

Скачать http://not-doing.ru/some/ISO.zip открыть в этой программе картинку, нажать Ctrl+M и подбирать нужные коэффициенты )



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

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

Наверх




Память: 0.5 MB
Время: 0.069 c
15-1349295678
ProgRAMmer Dimonych
2012-10-04 00:21
2013.03.22
Подсчёт ссылок на строку таблицы в MySQL


15-1335892821
Jeer
2012-05-01 21:20
2013.03.22
Отдых, как продолжение работы.


15-1328563233
Германн
2012-02-07 01:20
2013.03.22
Небольшой опрос по провайдерам и SMTP-серверам


15-1346364143
Artem
2012-08-31 02:02
2013.03.22
В Visual С++ автоматическая сборка мусора?


15-1333119005
Baks
2012-03-30 18:50
2013.03.22
#10008 - replace hard disk1