![]() |
Параметры getColorBoundsRect
Привет всем. Гуру, помогите понять назначение параметров в методе getColorBoundsRect. Описание в хэлпе:
Цитата:
|
Параметр mask выделяет определенную составляющую из цвета пикселя. Например, у Вас есть пискель c color = 0x03050604. Как из его цвета выделить флешу альфа-составляющую цвета. А делается это просто - он делает логическое "И" этого значения с маской, указывающей какие биты в цвете Вы хотите контролировать. Т.е 0x03050604 & 0xFF000000 = 0x03000000 означает, что Вы выделили из цвета color только альфа-составляющую.
А метод делает следующее сравнивает значение, полученное при опирации "И" маски и текущего значения пикселя с заданным в качестве параметра color и определает прямоугольную область где эти занчения не равны. А насчет примера, значения mask и color равны 0xFFFFFFFF, а значит mask & color дадут результат 0xFFFFFFFF. И это значит флеш будет искать область где нет белых (0xFFFFFFF) пикселей. |
Вроде ясно. Т.е. в качестве маски я всегда должен задавать 0xFF000000 или 0x00FF0000 ну или другое, но главное чтобы там были FF - это как бы указывает по какой составляющей цвета (R, G, B или A) искать, так? И получается что метод ищет область, где НЕ присутствует цвет, указанный в качестве параметра color. Мне казалось наооборот - возвращает область, ГДЕ присутствует этот цвет. А что будет если у меня несколько клякс определенного цвета, что за область вернет, несколько областей?
|
Нет. Не обязательно 0xFF000000 или 0x00FF0000, можно и 0x3456FF00. Ведь цвета бывают не только чисто красный, зеленый и синий, есть и другие, которые Вы, собственно, вдруг захотите изолировать.
А как маскирование работает Вы можете узнать если представите параметр mask и value в двоичном виде. Ну вот например, 0xFF000000 = mask = 11111111000000000000000000000000; value = 0x03050604 = 00000011000001010000011000000100. Побитовая операция "И" тогда даст 11111111000000000000000000000000 & 00000011000001010000011000000100 ------------------------------------ 00000011000000000000000000000000 Т.е. посути Вы выделили биты определнной области - верхнего байт числа value. На счет клякс, тут, наверно, Вам лучше поэкспериментировать и сразу будет все понятно. |
Вот что хочу узнать - если в качестве параметра mask введу 0x3456FF00 - это значит буду искать по составляющим A, R и G (т.е. на предмет прозрачности, красного и зеленого цветов). Синий не будет учитываться. И эта строчка 0x3456FF00 получается равносильна, скажем 0xFFFFFF00 или 0x01010100 - неважно какие числа - я ведь просто указываю маску - те цвета, по которым будет поиск.
Цитата:
Нипанятноооо... |
На счет 0x3456FF00. То что синяя составляющая цвета не будет учитываться сказано абсолютно, точно. А вот на равносильность 0x3456FF00 и 0xFFFFFF00 ставиться под сомнение. Попробуйте представить эти два числа в двочном виде. И если задаться что это маски для value, то при побитовом сложении этих масок с value получатся совсем разные значения. В первом случае для значения битов маски - 1 будет "просачиваться" соотвествующий бит value. Во втором, все биты value воидут в тестируемое значение с color.
|
Фуф, вроде дошло. Alex_beginner, спасибо, дружище!
|
Нда, метод крайне глючный. :(
По-крайней мере с прозрачной битмапой это так. Код:
import flash.display.BitmapData;Код:
trace("getPixel = 0x"+myBitmapData.getPixel(10,10).toString(16))Код:
colorBoundsRect = myBitmapData.getColorBoundsRect(0xffff00ff, 0x705400ff, true);Меняем параметр цвета на правильный (заданный), т.е. на 0х55: Код:
colorBoundsRect = myBitmapData.getColorBoundsRect(0xffff00ff, 0x705500ff, true);Дальше больше, работаем с маской: Код:
//Смотрим какой цвет ожидается, если маску у R задать 0х54:Код:
colorBoundsRect = myBitmapData.getColorBoundsRect(0x705400ff, 0x705400ff, true);PS Возможно дело в ограничениях с работой флеша с 32 разрядными числами. Не знаю. Например максимальное положительное число, которое переваривает toString(16) вовсе не 0xFFFFFFFF, как можно было бы подумать, а 0x7fffffff Код:
z=0x7fffffffВидимо отсюда же проблемы и с отображением getPixel32. Но побитовое И в теории сработало же безошибочно (см. выше), а в практике (getColorBoundsRect) ничего не вышло. :( |
chingachgoog, молодец. Интересный глюк нашел. Возможно дело с округлением альфы. Т.е. с цветами флэш нормально работает - а вот с прозрачностью - не очень. Вот что выдает трейс при разных значениях цвета:
Код:
var myBitmapData:BitmapData = new BitmapData(300, 200, true, 0x700100FF); |
chingachgoog! Очень любопытные исследования. Я, увлекся ими.
Цитата:
Грубо говоря, установите, параметр transparent в false, и данный пример заработает, т.е.: Код:
myBitmapData = new BitmapData(300, 200, false, 0x705500FF);Используйте, лучше transparent==false и значения альфа-канала. Буду исследовать дальше. |
| Часовой пояс GMT +4, время: 21:33. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.