Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.06.2011, 18:18
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 1  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
По умолчанию Как сделать, чтобы DisplacementMapFilter влияло только на часть изображения?

Делаю приложение типа фильтра liquify в фотошопе. У меня есть битмап, внутри которого пользователь рисует чёрной кистью. То, куда смещаются пикселы у меня зависит не от цвета, а только от параметров scaleX и scaleY. Цвет не должен влиять на смещение пикселей. Поэтому нужно сделать, чтобы на смещение влияла только та часть битмапа, в которой в данный момент рисует пользователь. Пробовал задавать битмапу изначально нейтральный серый цвет, но всё-равно какое-то смещение происходит.

Как вариант можно, конечно, сделать карту смещения по размеру изменяемой области, но это очень нудно. Если других вариантов нет, так и сделаю.

Хотя нет, даже если карта будет нужного размера, она будет прямоугольной (а кисть круглая) и произойдёт нежелательное смещение пикселей вне круга.

Добавлено через 27 минут
Разобрался. Выставил параметры
Код AS3:
componentX = BitmapDataChannel.ALPHA;
componentY = BitmapDataChannel.ALPHA;
И поставил прозрачность вне закрашиваемой области на 50%. Конечно, выглядит как костыль, но ничего лучше не придумал.

Только тогда вопрос. Как в 16тиричном коде выставить ровно 50%. Это сколько будет? 77 не подходит.

Добавлено через 35 минут
Всё, 80 по ходу = 50%


Последний раз редактировалось Parez; 22.06.2011 в 18:50. Причина: не, не вариант
Старый 22.06.2011, 19:17
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Собственно надо было закрасить средним цветом - 0x808080
__________________
Reality.getBounds(this);

Старый 22.06.2011, 19:21
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 3  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Ну да, в принципе. Не мог допереть какой цвет будет средним. Уже с альфа каналом сделал.

Ещё вопрос. У меня получилось вот что: http://**********/11989501. Но меня это не радует, поскольку происходит непонятное размытие до тех пор, пока картинка не становится либо прозрачной, либо (если свойство прозрачности BitmapData стоит на false) не сливается с заданным фоном битмапа. Это нормально? И есть ли выход?


Последний раз редактировалось Parez; 22.06.2011 в 19:58.
Старый 23.06.2011, 00:40
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Как в 16тиричном коде выставить ровно 50%. Это сколько будет? ...какой цвет будет средним
10 / 2 = 5
16 / 2 = 8
Цитата:
Это нормально? И есть ли выход?
Есть. Надо изменить код.
__________________
Reality.getBounds(this);

Старый 23.06.2011, 01:14
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 5  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Цитата:
Есть. Надо изменить код.
Логично. Вопрос в том, что именно и как.

Старый 23.06.2011, 01:36
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
что именно и как
Буквы. Клавиатурой.
Вы заметили, что разговариваете сами с собой? Это потому, что Вы говорите о том, что видите только Вы.
Вы всерьез думаете, что у нас хватит денег и связей нанять ФБР, чтобы они стащили у Вас код?
__________________
Reality.getBounds(this);

Старый 23.06.2011, 17:06
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 7  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Цитата:
Вы всерьез думаете, что у нас хватит денег и связей нанять ФБР, чтобы они стащили у Вас код?
Ахах)) Нет, ну вы просто так говорите, как будто уже это сделали)
Просто все примеры подобного фильтра работают примерно так же, как мой (в смысле с таким же нежелательным размытием). Например вот: http://www.sephiroth.it/test/flex/2/...ease/main.html.
Я думал, что раз вы говорите, что можно этого избежать, изменив код, то вы знаете как это можно сделать.))
Вот главная функция смещения. Запускается когда пользователь рисует кистью:
Код AS3:
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.
Старый 23.06.2011, 19:59
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Так это код для smudge а не для Liquify. Вы же данные исходника разрушаете, а карту смещений обновляете. А надо с точностью до наоборот.
Вот представьте что Вы сжали изображение в два раза и сохранили его в тот же файл. 3/4 информации потеряно и НИКАК не может быть восстановлено. Это и есть ваше размытие – сжимая и растягивая участки исходного изображения, Вы навсегда теряете детали. Исходник должен оставаться как есть, Вам надо рисовать карту смещений для него. Плотность цвета на этой мазне будет определять, куда и насколько сдвинутся пиксели исходника, но Вам ни в коем случае нельзя переписывать сами эти пиксели, пока юзер не сменит инструмент, то есть не подтвердит накопленные в карте изменения. Сейчас у Вас исходное изображение накапливает искажения, а карта искажений наоборот – чистая.
__________________
Reality.getBounds(this);

Старый 23.06.2011, 21:06
Parez вне форума Посмотреть профиль Отправить личное сообщение для Parez Найти все сообщения от Parez
  № 9  
Ответить с цитированием
Parez

Регистрация: Nov 2010
Адрес: Ярославль
Сообщений: 249
Ну да, в принципе. Я так и думал. Так ведь, если не запоминать результат в основной bmd, то пользователь может, например полностью закрасить всё чёрным, но при этом смещение окажется недостаточным для него. Просто тогда надо ставить огромные значения scaleX и scaleY и очень маленькую прозрачность у самой кисти. Так что ли?

Старый 23.06.2011, 21:40
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну в любом случае, цвет или альфа (на самом деле альфа не подходит, цветом управлять гораздо проще - вы легко можете добавить тот или другой цвет, а убавить альфу получится только через колено) – Вам не получить шага смещения больше 127 градаций. То есть перегнать пиксели из одного угла в другой в битмапдате шириной 4000 получится только с огромным множителем. Это специфика фильтра, куда от нее деться? Может быть поэтому на флэше и нет нормальных реализаций Liquify? Во всяком случае я не вижу. Если есть ссылка – поделитесь.

Добавлено через 7 минут
Возможно, получилось бы что-то реализовать через drawTriangles, но тут я не силен, к сожалению.
Посмотрите пример у Silin'а чтобы понять, о чем я.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:53.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.