|
|
|||||
Алгоритм пипетки
Есть кнопка, при клике по которой мы получаем некое значение цвета. Задача состоит в том, чтоб воспроизвести это значение на самодельной палитре. Палитра из себя представляет круг с градиентной заливкой от центра. Также есть отдельный ползунок, регулирующий яркость.
Как подобрать необходимый цвет и уровень яркости (от -255 до 255 или от -1 до 1)? Заранее спасибо за советы.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
BitmapData#draw, getPixel - не подходит?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Psycho Tiger, проблема не получить цвет пикселя, а отобразить его "координаты" на специальной панельке. Т.е. зная значение цвета нужно найти подходящий пиксель на специальном изображении (градиент) и подобрать значение яркости.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Хм.
А как рисуется этот круг заливки?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
"Яркость" это понятие пространства HSB, а не RGB. BitmapData работает с RGB, найти пиксель на картинке не получится, нельзя разделить цвет на "Brightness" и "RGB", a RGB на палитре представлен только на десятую часть отсилы.
Допустим такой алгоритм - получив цвет пипетки, Вы преобразуете его в HSB. Затем подставляете то значение яркости, которое на палитре (для этого на палитре ВСЕ пиксели должны иметь строго одинаковую яркость!), преобразуете обратно в RGB и ищете на картинке палитры с помощью getPixel или getColorBoundsRect. У меня есть большие сомнения, что цвет ВСЕГДА будет найден (сомневаюсь что на картинке представлено все пространство HSB для одного значения В), но другого способа я не вижу.
__________________
Reality.getBounds(this); |
|
|||||
Преобразование цвета осуществляется с помощью статического метода mx.utils.ColorUtil.adjustBrightness. На данный момент непосредственно в коде проекта используется только RGB (что в adjustBrightness не знаю, очень может быть, что там осуществляется преобразование). В любом случае спасибо за вариант. Тема еще актуальна.
В отношении полноценности палитры думаю можно искать максимально приближенное значение. Сейчас сам себе представляю что-то из области волнового алгоритма: отправная точка - центр круга. Попиксельно радиально проверяем разницу между текущим и проверяемым цветом, остановившись только в случае, когда разница или не изменяется или увеличивается. А дальше уже подбираем яркость. Хотя этот вариант мне представляется более затратным и кривым.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
Цитата:
public static function adjustBrightness(rgb:uint, brite:Number):uint { var r:Number = Math.max(Math.min(((rgb >> 16) & 0xFF) + brite, 255), 0); var g:Number = Math.max(Math.min(((rgb >> 8) & 0xFF) + brite, 255), 0); var b:Number = Math.max(Math.min((rgb & 0xFF) + brite, 255), 0); return (r << 16) | (g << 8) | b; }
__________________
משיח לא בא משיח גם לא מטלפן |
Часовой пояс GMT +4, время: 11:08. |
|
« Предыдущая тема | Следующая тема » |
|
|