Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Алгоритм пипетки (http://www.flasher.ru/forum/showthread.php?t=168210)

TanaTiX 18.09.2011 13:00

Алгоритм пипетки
 
Есть кнопка, при клике по которой мы получаем некое значение цвета. Задача состоит в том, чтоб воспроизвести это значение на самодельной палитре. Палитра из себя представляет круг с градиентной заливкой от центра. Также есть отдельный ползунок, регулирующий яркость.
Как подобрать необходимый цвет и уровень яркости (от -255 до 255 или от -1 до 1)? Заранее спасибо за советы.

Psycho Tiger 18.09.2011 14:08

BitmapData#draw, getPixel - не подходит?

TanaTiX 18.09.2011 14:54

Psycho Tiger, проблема не получить цвет пикселя, а отобразить его "координаты" на специальной панельке. Т.е. зная значение цвета нужно найти подходящий пиксель на специальном изображении (градиент) и подобрать значение яркости.

Psycho Tiger 18.09.2011 15:10

Хм.
А как рисуется этот круг заливки?

TanaTiX 18.09.2011 15:46

Вложений: 1
Вот так. Т.е. тупо картинкой.

Wolsh 18.09.2011 16:52

"Яркость" это понятие пространства HSB, а не RGB. BitmapData работает с RGB, найти пиксель на картинке не получится, нельзя разделить цвет на "Brightness" и "RGB", a RGB на палитре представлен только на десятую часть отсилы.
Допустим такой алгоритм - получив цвет пипетки, Вы преобразуете его в HSB. Затем подставляете то значение яркости, которое на палитре (для этого на палитре ВСЕ пиксели должны иметь строго одинаковую яркость!), преобразуете обратно в RGB и ищете на картинке палитры с помощью getPixel или getColorBoundsRect. У меня есть большие сомнения, что цвет ВСЕГДА будет найден (сомневаюсь что на картинке представлено все пространство HSB для одного значения В), но другого способа я не вижу.

TanaTiX 18.09.2011 17:13

Преобразование цвета осуществляется с помощью статического метода mx.utils.ColorUtil.adjustBrightness. На данный момент непосредственно в коде проекта используется только RGB (что в adjustBrightness не знаю, очень может быть, что там осуществляется преобразование). В любом случае спасибо за вариант. Тема еще актуальна.
В отношении полноценности палитры думаю можно искать максимально приближенное значение. Сейчас сам себе представляю что-то из области волнового алгоритма: отправная точка - центр круга. Попиксельно радиально проверяем разницу между текущим и проверяемым цветом, остановившись только в случае, когда разница или не изменяется или увеличивается. А дальше уже подбираем яркость.
Хотя этот вариант мне представляется более затратным и кривым.

alatar 18.09.2011 17:52

Цитата:

(что в adjustBrightness не знаю, очень может быть, что там осуществляется преобразование
Достаточно открыть исходник и посмотреть.
Код AS3:

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;
}

Используйте вариант предложенный Wolsh, в пакете mx.utils для этого есть класс HSBColor. Найти минимальную разницу в векторе пикселей палитры будет менее затратно, чем радиально перебирать пиксели.

TanaTiX 18.09.2011 18:27

alatar, спасибо. Кстати этот класс у меня вшит в swc, так что содержимое посмотреть не могу.

alatar 18.09.2011 18:34

Все исходники лежат в SDK (%путь_до_сдк%/frameworks/projects), если вы их не удаляли.


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

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