Главная страница
    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.076 c
15-1348943921
ClawClaw
2012-09-29 22:38
2013.03.22
Фон сайта


4-1260947297
zvm
2009-12-16 10:08
2013.03.22
чтение конкретного LBA на винте


15-1338220756
brother
2012-05-28 19:59
2013.03.22
Как Вы прочитали это: CoCu ?


9-1193072476
lubass
2007-10-22 21:01
2013.03.22
Omega GDK 92


15-1340137805
Юрий
2012-06-20 00:30
2013.03.22
С днем рождения ! 20 июня 2012 среда





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский