Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.065 c
15-1346860652
Дмитрий С
2012-09-05 19:57
2013.03.22
Generic и неGeneric типы одинаковые в памяти?


15-1340605991
OldMBr
2012-06-25 10:33
2013.03.22
SendMessage


2-1334249726
novichek
2012-04-12 20:55
2013.03.22
Поиск цвета на битмапе


2-1328028334
alexdn
2012-01-31 20:45
2013.03.22
Canvas на Image


6-1260958453
zsv
2009-12-16 13:14
2013.03.22
Непонятно поведение TIdTCPServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский