![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
|
Делаю приложение типа фильтра liquify в фотошопе. У меня есть битмап, внутри которого пользователь рисует чёрной кистью. То, куда смещаются пикселы у меня зависит не от цвета, а только от параметров scaleX и scaleY. Цвет не должен влиять на смещение пикселей. Поэтому нужно сделать, чтобы на смещение влияла только та часть битмапа, в которой в данный момент рисует пользователь. Пробовал задавать битмапу изначально нейтральный серый цвет, но всё-равно какое-то смещение происходит.
Как вариант можно, конечно, сделать карту смещения по размеру изменяемой области, но это очень нудно. Если других вариантов нет, так и сделаю. Хотя нет, даже если карта будет нужного размера, она будет прямоугольной (а кисть круглая) и произойдёт нежелательное смещение пикселей вне круга. Добавлено через 27 минут Разобрался. Выставил параметры И поставил прозрачность вне закрашиваемой области на 50%. Конечно, выглядит как костыль, но ничего лучше не придумал. Только тогда вопрос. Как в 16тиричном коде выставить ровно 50%. Это сколько будет? 77 не подходит. Добавлено через 35 минут Всё, 80 по ходу = 50% Последний раз редактировалось Parez; 22.06.2011 в 18:50. Причина: не, не вариант |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Собственно надо было закрасить средним цветом - 0x808080
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
|
Ну да, в принципе. Не мог допереть какой цвет будет средним. Уже с альфа каналом сделал.
Ещё вопрос. У меня получилось вот что: http://**********/11989501. Но меня это не радует, поскольку происходит непонятное размытие до тех пор, пока картинка не становится либо прозрачной, либо (если свойство прозрачности BitmapData стоит на false) не сливается с заданным фоном битмапа. Это нормально? И есть ли выход? Последний раз редактировалось Parez; 22.06.2011 в 19:58. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
16 / 2 = 8 Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
|
Цитата:
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Вы заметили, что разговариваете сами с собой? Это потому, что Вы говорите о том, что видите только Вы. Вы всерьез думаете, что у нас хватит денег и связей нанять ФБР, чтобы они стащили у Вас код?
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
|
Цитата:
Просто все примеры подобного фильтра работают примерно так же, как мой (в смысле с таким же нежелательным размытием). Например вот: http://www.sephiroth.it/test/flex/2/...ease/main.html. Я думал, что раз вы говорите, что можно этого избежать, изменив код, то вы знаете как это можно сделать.)) Вот главная функция смещения. Запускается когда пользователь рисует кистью: function genDisplacement(event:Event):void { var mxDist:Number = mouseX - preX; var myDist:Number = mouseY - preY; var dmf:DisplacementMapFilter = new DisplacementMapFilter(); dmf.mapBitmap = bmd; dmf.mode = DisplacementMapFilterMode.COLOR; dmf.mapPoint = new Point(0, 0); dmf.componentX = BitmapDataChannel.ALPHA; dmf.componentY = BitmapDataChannel.ALPHA; dmf.scaleX = -mxDist*strength; dmf.scaleY = -myDist*strength; imgBmd.applyFilter(imgBmd,imgBmd.rect,new Point(0,0),dmf); preX = mouseX; preY = mouseY; bmd.fillRect(bmd.rect,0x80FF0000); } Последний раз редактировалось Parez; 23.06.2011 в 17:29. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Так это код для smudge а не для Liquify. Вы же данные исходника разрушаете, а карту смещений обновляете. А надо с точностью до наоборот.
Вот представьте что Вы сжали изображение в два раза и сохранили его в тот же файл. 3/4 информации потеряно и НИКАК не может быть восстановлено. Это и есть ваше размытие – сжимая и растягивая участки исходного изображения, Вы навсегда теряете детали. Исходник должен оставаться как есть, Вам надо рисовать карту смещений для него. Плотность цвета на этой мазне будет определять, куда и насколько сдвинутся пиксели исходника, но Вам ни в коем случае нельзя переписывать сами эти пиксели, пока юзер не сменит инструмент, то есть не подтвердит накопленные в карте изменения. Сейчас у Вас исходное изображение накапливает искажения, а карта искажений наоборот – чистая.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
|
Ну да, в принципе. Я так и думал. Так ведь, если не запоминать результат в основной bmd, то пользователь может, например полностью закрасить всё чёрным, но при этом смещение окажется недостаточным для него. Просто тогда надо ставить огромные значения scaleX и scaleY и очень маленькую прозрачность у самой кисти. Так что ли?
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну в любом случае, цвет или альфа (на самом деле альфа не подходит, цветом управлять гораздо проще - вы легко можете добавить тот или другой цвет, а убавить альфу получится только через колено) – Вам не получить шага смещения больше 127 градаций. То есть перегнать пиксели из одного угла в другой в битмапдате шириной 4000 получится только с огромным множителем. Это специфика фильтра, куда от нее деться? Может быть поэтому на флэше и нет нормальных реализаций Liquify? Во всяком случае я не вижу. Если есть ссылка – поделитесь.
Добавлено через 7 минут Возможно, получилось бы что-то реализовать через drawTriangles, но тут я не силен, к сожалению. Посмотрите пример у Silin'а чтобы понять, о чем я.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:53. |
|
|
« Предыдущая тема | Следующая тема » |
|
|