![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Антиалистинг, сглаживание линий, как осуществить, исходники! [D6, Win95/98, Win2k]
NarvaL © (2004-03-28 20:39:00)Народ!!! помогите осуществить сглаживание обычной прямой нарисованой либо в Tpaint либо в Timage ... без разницы, лишь бы сглаживала!!!!!
ЛЮБЫМИ СПОСОБАМИ!!! Как бы это садистски и мазохистски не оказывалось!
З.Ы.: Просьба без глупых высказываний типа - "что это такое" или "мне нужен весь код чтобы это понят"
Кода нет, сам ещё не знаю даже как бы это осуществить!!! Может кто сталкивался!!!
НО НУЖНО!!!!!!!!!!
Mihey (2004-03-29 21:01:00) [1]Ещё есть выход. Антиалиасинг всего. Просто увеличиваем изображение в три раза через resampling и потом в три раза егоу меньшаем :). Работает.
Dmyk (2004-03-29 20:08:00) [2]Нууу... Если кратко, то примерно так:
Проходим в цикле все точки. Берём значения интенсивности красного для точки и 8-ми точек вокруг неё, слаживаем и делим на 9 (количество точек). Это и есть интенсивность красного в сглаженном рисунке. Аналогично повторяем для интенсивности синего цвета и зелёного цвета.
Единственное что - надо делать попровку для крайних пикселей (для точки с правой строны доступно только 6 вокруглежащих точек, а для точки в правом-верхнем углу доступны только 4 точки).
Вот небольшой пример:
(псевдокод, на практике не поверял, очень тормознут из-за Canvas.Pixels. Ещё не сгладит крайние точки рисунка ((0,0), (0,1), (1,1), (1,0)) и подобные - для них надо отдельно писать). В реальных условиях лучше скопировать исходные данные в один большой массив (обращие к массиву происходит быстрее, чем обращение к Canvas.Pixels) и рисовать на нём. А для вывода лучше использовать Scanline.)
{FBmp - рисунок с прямой, которую надо сгладить. Сглаженная прямая рисуется в FNewBitmap. Оба должны уже быть созданы!}
var
i, j: Integer;
r, g, b: Byte;
begin
FNewBitmap.Height := FBmp.Height;
FNewBitmap.Width := FBmp.Width;
forj := 1 toFBmp.Height -2 do
fori := 1 toFBmp.Width -2 do
withFBmp.Canvas do begin
r := (GetRValue(Pixels[i, j]) +
GetRValue(Pixels[i +1, j]) +
GetRValue(Pixels[i -1, j]) +
GetRValue(Pixels[i, j +1]) +
GetRValue(Pixels[i, j -1]) +
GetRValue(Pixels[i +1, j +1]) +
GetRValue(Pixels[i +1, j -1]) +
GetRValue(Pixels[i -1, j +1]) +
GetRValue(Pixels[i -1, j -1])) div 9;
g := (GetGValue(Pixels[i, j]) +
GetGValue(Pixels[i +1, j]) +
GetGValue(Pixels[i -1, j]) +
GetGValue(Pixels[i, j +1]) +
GetGValue(Pixels[i, j -1]) +
GetGValue(Pixels[i +1, j +1]) +
GetGValue(Pixels[i +1, j -1]) +
GetGValue(Pixels[i -1, j +1]) +
GetGValue(Pixels[i -1, j -1])) div 9;
b := (GetBValue(Pixels[i, j]) +
GetBValue(Pixels[i +1, j]) +
GetBValue(Pixels[i -1, j]) +
GetBValue(Pixels[i, j +1]) +
GetBValue(Pixels[i, j -1]) +
GetBValue(Pixels[i +1, j +1]) +
GetBValue(Pixels[i +1, j -1]) +
GetBValue(Pixels[i -1, j +1]) +
GetBValue(Pixels[i -1, j -1])) div 9;
FNewBitmap.Canvas.Pixels[i, j] := RGB(r, g, b);
end;
end;
NarvaL (2004-03-29 15:43:00) [3]
> Dmyk (28.03.04 22:03) [2]
> Сглаживание уже нарисованной прямой осуществляется так же,
> как и сглаживание всего остального: проходимся по рисунке
> и усредняем значения всех соседних пикселей.
А можно с этого места по подробее!!! я ведь с цветовой схемой ещё не работал.. есть пример программы.. которая бы сканила и усредняла значение???? или вообще как это организовать можно???
Кажися то, что нужно!!!
Dmyk (2004-03-28 22:03:00) [4]Сглаживание уже нарисованной прямойосуществляется так же, как и сглаживание всего остального: проходимся по рисунке и усредняем значения всех соседних пикселей.
Если же надо нарисовать сглаженную прямую, то тут чего-то есть: http://algolist.manual.ru/graphics/painting/line.php.
Mihey (2004-03-28 21:21:00) [5]http://freespace.virgin.net/hugo.elias/graphics/x_wuline.htm