PDA

Просмотр полной версии : Узнать цвет пиксела в BitmapData


Волгоградец
12.05.2008, 10:44
Привет! Всех с прошедшими! Знатоки теории цвета - подскажите: необходимо сделать карту высот - она, как известно, представляется в виде черно-белой картинки (т.е. RGB составляющие одинаковые). Я хочу узнать цвет любой составляющей (ведь одинаковые они) в интервале от 0 до 255. BitmapData.getPixel дает значение либо строковое, если приводить значение к toString, например 101010. Либо к большому числу, например 0х101010 дает 65 с чем-то тысяч. Еще раз вопрос - как, допустим, получить цвет R-составляющей в диапазоне 0-255?

chingachgoog
12.05.2008, 10:53
trace(0xFF)

iNils
12.05.2008, 10:55
Лучше синий :)
синий = цвет & 0xFF

Волгоградец
12.05.2008, 11:40
А как мне задать 0xFF, если я только указываю значения x и y, нужно использовать BitmapData.getPixel32??

chingachgoog
12.05.2008, 11:54
Number("0x"+myBitmapData.getPixel(x, y).toString(16).slice(0,2))

Это если в лоб

add:
для ARGB соответственно, меняем параметры slice на (2,4) например :)

Волгоградец
12.05.2008, 11:56
Оооо, спасибо, я про slice() не подумал!

Это если в лоб
Просто интересно, если не в лоб, то как это?

chingachgoog
12.05.2008, 12:02
можно побитовыми смещениями, можно toString оптимизировать...
да в программировании всегда 100 путей на одну задачу есть :)

iNils
12.05.2008, 12:04
chingachgoog, это что за код такой хитрый? Зачем приводить к hex, когда он обрабатывается сразу Number? И slice не в тему.
argb = 0x00FF0000;
rgb = 0xFF0000;
trace (argb >> 16);
trace (rgb >> 16);

Волгоградец
12.05.2008, 12:08
:eek: iNils, что такое ">>" и почему 16???
Я бы перевел так - rgb намного больше шестнадцати :rolleyes:...

chingachgoog
12.05.2008, 12:19
chingachgoog, это что за код такой хитрый? Зачем приводить к hex, когда он обрабатывается сразу Number? И slice не в тему.
argb = 0x00FF0000;
rgb = 0xFF0000;
trace (argb >> 16);
trace (rgb >> 16);

Я же написал, что это "в лоб" - для ПОНИМАНИЯ смысла, и также написал, что можно побитовым смещением :)

iNils
12.05.2008, 14:50
:eek: iNils, что такое ">>" и почему 16???
Я бы перевел так - rgb намного больше шестнадцати :rolleyes:...Сдвигаем число вправо на 16 бит. Почему 16? Потому, что красный цвет, это 3-ий байт справа, поэтому нам нужно сдвинуть правых два байта, а это как раз 16 бит.
Это цельная картина:
argb = 0x04030201;
trace (argb >> 24 & 0xFF); // альфа
trace (argb >> 16 & 0xFF); // красный
trace (argb >> 8 & 0xFF); // зеленый
trace (argb >> 0 & 0xFF); // синий
А & 0xFF отбрасывает все, что находится слева от крайнего байта, полученного после сдвига, так как argb >> 16 даст нам 0x0403 и 0x04 лишнее.
Для синего цвета сдвига делать не надо, поэтому вместо argb >> 0 & 0xFF можно просто написать argb & 0xFF.

Еще одно полезное свойство побитового сдвига. Операции
a = Math.floor (b);
a = Math.floor (b / 2);
a = Math.floor (b / 4);
абсолютно аналогичны этим
a = b >> 0
a = b >> 1
a = b >> 2
Только вот сдвиг работает в 1,5 раза быстрее.

olexandr
12.05.2008, 15:07
to iNils:
разве они полностью идентичны? мне казалось, что сдвиг еще и округляет сразу... если не прав - поправьте, пожалуйста
trace(5/2); // 2.5
trace(5 >> 1); // 2

iNils
12.05.2008, 15:14
А Math.floor разве не видно?:D

Волгоградец
12.05.2008, 15:43
Вау. Спасибо. Нео сказал в первой части Матрицы: "Теперь я знаю кунг-фу". А я скажу так:"Теперь я знаю побитовый сдвиг".
Ты крут, iNils.
chingachgoog, тебе тоже спасибо.

Alex_beginner
24.05.2008, 19:54
function color_to_RGB(color:Number):Array
{
var rgb:Array=[];
rgb[2]=color&0xFF;
color>>=8;
rgb[1]=color&0xFF;
color>>=8;
rgb[0]=color&0xFF;
return rgb;
}

function RGB_to_Color(r:Number, g:Number, b:Number):Number
{
return ((r<<16)|(g<<8)|b);
}