Разбираемся в : Antialiasing
Вложений: 6
Итак в єтой статье я розкажу вам как сделать сглаживание своими руками.
И так немножко теории...что же такое сглаживание? Прямиком из вики получаем: Цитата:
Вложение 11400 Со сглажеванием же картинка будет выглядет намного "мягче": Вложение 11401 Ну думаю тут все ясно....теперь перейдем к реализации: Разбиваем имагу на сектора Первым делом нам нужно написать функцию котая бы делила всю имагу на сектора.... желательно чтобы функция была гибка, и вы могли вольно выставлять количество секторов на которые она должна разбиватся. По этому я сначала создал тип который содержал бы информацию каждого сектора о : 1.Начальной координате Х 2.Начальной координате У 3.Высоте сектора 4.Шириге сектора 5.Его порядкового ид(это не так уж и нужно, но посколько данная функция может еще использоватся и в качестве отладки, то лучше таки создать это поле) Код:
Type sector Код:
Function sectors(image,sectors,ImageX,ImageY) 1.image - собственно картинка которую мы будет сглаживать 2.sectors - это количество секторов на которое мы будем ее делить.(какое должно быть их количество и зачем они вообще нужну опишу далее) 3.ImageX- начальная координата Х имаги, это нам понадобится при работе с пиксмапами. 4.ImageY - начальная координата У имаги,это нам понадобится при работе с пиксмапами. Как разделить картинку на равное количество секторов - конечно все мы знаем: Делим ширину и высоту картинки на кол-во секторов и получаем ширину и высоту каждого сектора. Код:
sectorsW:Float=ImageWidth(image)/sectors Код:
'Divine image to sectors Код:
For NewSector : sector = EachIn sector_list Вложение 11396 Хм, теперь давайте разберемся зачем же эти сектора... Сектора нужны для того, чтобы мы могли по ним сгладить имагу.Итак по этапно как мы это будем именно делать: 1.Имага розбита на сектора 2.С помощю перебора каждого сектора мы вычислим какой цвет для него средне-статистичен(инными словами посмотрим каждый пиксель который содержит сектор и возьмем среднее значение цвета.) 3.Закрасим весь секор средним цветом из полученого в этапе 2 значения. Не сложно догадатся что чем бльше секторов мы сделаем - те качественее будет сглаживание, но и втоже время увеличит время обработки. Функция сглаживания Итак приступим к самой функции сглаживания: 1.Для начала нужно знать что чтобы рабоать с имагой в Бмаксе нам нужно сначала поставить ей флаг DYNAMICIMAGE. Делаем это при загрузке имаги : Код:
mainImage=LoadImage("sammple.png",DYNAMICIMAGE ) pixmap=LockImage(image) ну а потом естественно разблокировать UnlockImage(image) Также следует знать что при работе с пикселями пиксмапы, Бмакс пользуется интом ARGB.Чтобы его розложить на стандартный А,R,G,B нужно попарится немножко... но вот вам фугкции намного упрощающие задачу: 1.Функйия переформатирования из стандартный А,R,G,B в инт ARGB: Код:
Function SetARGB(a=255,r=255,g=255,b=255) Код:
Function IntR(rgbint) Код:
Function IntG(rgbint) Код:
Function IntB(rgbint) Код:
Function IntA(rgbint) Теперь когда мы вооружены и опасны, можно перебрать весе пиксели всех секторов и закрасить их средним значением. Описывать построчно не буду, итак все понятно как это сделать....единственное что хочу сказать - не нужно создавать вякие массивы или типы для того чтобы сравнивать пиксили сектора...достаточно создать переменную которая будет плюсовать значения каждого пикселя: Код:
TempA=IntA(pixel) Функция сглаживания: Код:
'main antialiase function Вложение 11397 Если у кого не получилось сделать самому Исходны код с ресами :Вложение 11398 У кого нету бМакса, но посмотреть охота: Вложение 11399 |
Ответ: Разбираемся в : Antialiasing
Это не антиалязинг, а блюр. Но всё равно годно, спасибо.
|
Часовой пояс GMT +4, время: 05:54. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot