![]() |
Как получить адреса пикселей BitmapData?
Всем - добрый день!
Вопрос уже задавал на другом форуме, однако специализация и представительность этого форума внушают мне столь обширные надежды, что можно и нескромно повториться. Задача - получить адреса пикселей BitmapData до помещения связанного объекта Bitmap в список отображения (для реализации специфической заливки отображаемой фигуры, созданной средствами векторной графики). Однако, единственный способ, который пришел мне в голову, не работает: Код:
var tmpSh:Shape = new Shape(); |
Код AS3:
|
Спасибо, за оперативный ответ.
Думаю, Вас бы очень повеселило выражение моего лица, с которым смотрю на Цитата:
Код:
var paintSh:Function = function(bmp:Bitmap):void {P.S. "Внутренняя" функция ни при чем - квадрат возвращает 2 цвета...Что-то возле drawPath... P.P.S. Если определяю параметры commands, data внутри "внутренней" функции, то нахожу 2 цвета в bitmapData, при попытке передать параметры извне - 1 цвет. Добавлено через 1 час 43 минуты Все понял. paintSh(this) в моей реализации передает ссылку на глобальный объект вместо экземпляра класса. Досадный ляп. Большое спасибо, Wolsh. P.S. И это не то :). Так не долго в рассудке повредиться Добавлено через 3 часа 57 минут Несмотря на то, что, благодаря Wolsh, доступ к адресам пикселей оказался открыт :), академический интерес к проблеме остался (пример сугубо условный): Код AS3:
Код AS3:
Добавлено через 7 часов 3 минуты Ну и теперь совсем лишившее меня каких-либо идей обстоятельство: при попытке проследить связи объектов теми средствами, что дает FlashDeveloper (точки останова ставил на <bmpdata.draw(tmpSh);> и <paintBm(this);>), обнаружил изменение в поведении программы - теперь выводятся все пикселы массива..., т.е. пошаговое действие отличается от нормальной работы. Внятного объяснения не имею. Добавлено через 7 часов 38 минут В общем, размещение Код AS3:
|
В 10 плеере у БитмапДаты появился метод getVector, возвращающий Вектор с ARGB-значениями всех пикселей заданного прямоугольника битмапдаты. Например
Код AS3:
|
Да, я пробовал и этим вариантом снимать данные с BitmapData...
Кстати, должен покаяться (как бы ни было досадно это делать) - поторопился отрапортовать, что удовлетворил свой "академический интерес" :(... Давно не ощущал себя в такой прострации: чтобы не гонять бессмысленные циклы, изменим Код AS3:
Код AS3:
Код AS3:
trigg:0; color:0xff0000,0xff00ff trigg:1; color:0xff0000 trigg:0; color:0xff0000,0xff00ff Цвета второго прямоугольника игнорированы при любом начальном значении trigg... Однако, если исказим углы прямоугольников Код AS3:
trigg:0; color:0xff0000,0xff001f,0xff003f,0xff007f,0xff009f,0xff00bf,0xff00ff trigg:1; color:0xff0000,0xff00df,0xff009f,0xff005f,0xff001f,0xff00ff trigg:0; color:0xff0000,0xff001f,0xff003f,0xff007f,0xff009f,0xff00bf,0xff00ff Попытки отследить связи через отладчик меня не навели ни на какие выводы о причинах такого загадочного поведения... Возможно был недостаточно внимателен, возможно мое знание flash'a and AS изобилует пробелами, что вполне вероятно, т.к. увлекся этим недавно,... но озадачен. Возможно, допускаю некое хулиганство в конструкторе класса, но мне оно не очевидно. Добавлено через 20 часов 4 минуты Если код изменить таким образом Код AS3:
|
Пока считаю это багом
Вложений: 1
Получить правильные значения адресов пикселей можно таким образом:
Код AS3:
|
1. Вынесите вложенную функцию. Это – зло в 99% случаев, и лучше так не делать никогда, пока не припрет необходимость.
2. Проблема мне видится в использовании Ректангла, тем более взятого в системе координат стейджа. Я конечно могу ошибаться, ибо код для моего мозга достаточно мутный))))) Вобщем я склонен считать что здесь проблема в тесте, а не баг Адоба. Избавьтесь от ректангла, он тут совершенно не нужен, как я показывал в своем первом посте. Заметьте – это было все, что я изменил в вашем коде, и он заработал. |
1. Предлагаете оформить ее методом класса? Методы класса, имхо, должны отражать существенные особенности класса, а повторяющиеся вычисления удобно помещать в такие функции (это, конечно, частные особенности стиля - кто-то их и никогда не использует). Мнение о том, что вложенные функции "зло", встречал, но язык предусматривает такой прием, хотя для пользы дела, если вот такой "тупик", то можно и просто внутри кода разместить повторяющиеся операции ("раздует" его, правда :)).
2. В системе координат объекта (самого, содержащего каверзную БитмапДату класса) точно такая же картина - пробовал. Дело в том, что координаты Ректангла дают действительное размещение объекта в стейдже, именно там он и выводится, и там его место, но "мутность" в том, что последним описанным мной способом, я пишу в БитмапДату Фигуру из области, в которой ее нет :( - вот это меня и удивляет. P.S. Кстати, как "избавиться от Ректангла" - не понимаю. drawPath у меня рисует фигуру, состоящую из многих Безье-кривых, т.е. чтобы получить адреса пикселей, заполняющих фигуру, я этот Ректангл сканирую. |
Существенные особенности класса отражают его публичные методы. Приватные методы служат нуждам самого класса или его представителя-экземпляра, они инкапсулированы и являются секретом фирмы, так что никаких особенностей отражать не могут – наоборот, являются внутренними методами для операций, нужных данному классу, и только ему. Это чем-то противоречит цели данной функции?
Цитата:
Добавлено через 3 минуты Протрейсите ректангл, может я и зря на него наезжаю, но лучше уж знать, с чем имеем дело. В моем примере с getVector нет вообще никакого ректангла кроме bmpdata.rect - и то лишь потому что его требует метод. |
Цитата:
Цитата:
Разумеется, строить код на противоречащих концепции языка, или на других приемах, в отношении которых, по любым причинам, испытываешь внутреннее сомнение, плохо. Поэтому, для практических целей, вероятно, стоит поэкспериментировать для начала с другими способами создания графического контента фигуры (я не пробовал старые методы moveTo(), lineTo()),- потому что альтернативы BitmapData нет (ByteArray напрямую из фигуры не создашь, и в нем будут только "кривые" пиксели из битмапдаты). |
Цитата:
|
Код AS3:
to -De-: Думаю, нет смысла дальше разбираться, drawPath() рисовал мне фигуру в координатах stage, я должен был перерисовать ее, как на холсте в BitmapData, а для этого недостаточно лишь размеров фигуры :), я решил, что BitmapData.draw() сам перенесет "кисть" в начальную точку. Мой косяк. Пойду виниться в Адобе. |
| Часовой пояс GMT +4, время: 12:02. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.