Главная страница
    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.069 c
15-1346949003
Опять я
2012-09-06 20:30
2013.03.22
Вопрос по Яндекс-почте.


2-1340658279
Альманах
2012-06-26 01:04
2013.03.22
Создание одного фрейма два раз


15-1339221071
MBo
2012-06-09 09:51
2013.03.22
Не бриться!


2-1340180219
vasa777
2012-06-20 12:16
2013.03.22
число записей при sql запросе


15-1331384899
Дмитрий С
2012-03-10 17:08
2013.03.22
Блокировка файла.





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