Форум: "Начинающим";
Текущий архив: 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.058 c