![]() |
метод getPixels возвращающий ByteArray
В АС 3 метод getPixels возвращает ByteArray. К тому же появились методы для работы с байтами.
Что мы можем изменить в полученном массиве? Как организован возвращаемый этой функцией массив? Методы getPixel и setPixel слишком медленные что бы обработать большое количество пикселов, Можно ли манипулировать пикслемами в массиве что возвращает функция getPixels ? Как я понимаю обработать массив байтов можно намного быстрее чем последовательно вызывать функции getPixel и setPixel. И ещё почему метод copyPixels в несколько раз быстрее чем вызов getPixels и setPixels у двух растровых объектов? |
А что тебя конкретно интересует? Ты можешь изменить любой байт, если нужно. Или нужно послать массив байтов на сервер?
Код:
import flash.utils.ByteArray; |
Цитата:
Хотелось бы заменить пикселы определённых цветов на пикселы других цветов. Только очень быстро |
Как я понимаю, вопрос был в каком формате хранятся пиксели в ByteArray.
Аналогично этому: Код:
var ar:Array = new Array();Код:
byteArray.position=0; |
Отлично :)
А как мне определить координаты пиксела? относительно прямоугольника из которого я взял эти пикселы. |
О! Появился. А я уж, по затянувшемуся молчанию решил, что тебя за сорванные сроки с картой заказчик порешил :)
Координаты просто, на каждую точку 4 байта, значит надо позиционироваться на 4*(y*ширина_прямоугольника + x) и читать значение. Код:
// заливаем все красным |
Цитата:
|
miramax, а откуда ж там эти данные возьмутся?
|
Цитата:
|
http://ink.envisionext.com/swf2png/
я тут запостил отчёт о сохранение картинки на сервер. т.е. BitmapData в byteArray (PNG картинка) и отправка готовой картинки для записи на сервер. |
Цитата:
|
2INK•: Спасибо, познавательно :)
|
Может кто знает как лучше и рациональней выводить картинку(представленную byte array) по случайным пикселам? И за скока она вся прорисуется?
|
Цитата:
|
Как с помощью setPixels вывести 100 случайных пикселей в картинке?
|
vapes, для этого есть noise
|
Написал я вот такую штуку:
Код:
private function createArray ():void{ |
А зачем ты создал массив?
|
Чтобы выбирать потом из него случайные пикселы и выводить
|
Смысл в том , что надо выводить 1000 случайных пикселей картинки за 1/10 сек
|
А зачем их копировать из картинки в массив, чтобы потом в другую картинку вставлять? Не проще напрямую getPixel из одной и setPixel в другую?
|
Я пикселы храню в массиве ,чтобы потом генерить случайные эл-ты массива содержащие инфу о пикселах ,вставлять их в битмапДату и удалять эти эл-ты из массива , чтобы не сгенерить их повторно. во
|
Всё, у меня вывих мозга.
|
Ух ты убираешь: this.myarray.splice(pixelNumber-1,1);
и производительность в раз 5 возрастает |
теперь вопрос:как избежать повторения пикселов?
|
Цитата:
Код:
// массив с точками |
Цитата:
Код:
var n:int = 200; // выводим 200 точекв идеале для скорости было красиво просто хранить начальный индекс в массиве и количество выводимых точек. Код:
var currentPos : number = 0; |
юзайте byteArray для хранения больших массивов чисел - там сумасшедшая скорость....
|
byteArray действительно быстрее, но в данном случае сомнительно его применение. Как красиво и быстро перетасовать поток байтов я не представляю.
Если говорить об оптимизации, то следует еще при копировании точек лочить битмап: Код:
resultBitmapData.lock();Кстати, можно устроить соревнование на создание наиболее быстрого алгоритма для решения этой задачи, есть желающие? ;) |
Цитата:
|
Думал заюзать BitmapData.noise, чтобы создать рандомные точки для копирования, а он оказывается довольно тормознутый (функция ниже работает в 2раза медленней, чем предложеный вариант выше), но эффект получился довольно красивый! Точки не сразу ставятся на свои места, а плавно проявляются.
Код:
var cnt:int = 0; |
Хотел как лучше, получилась всякая чушь:
Код:
var bitmapWidth:Number = 550; |
Цитата:
это ОЧЕНЬ плохо в цикле!. splice, shift очень ресурсоемкие операции, pop вроде не очень... но тоже занимает больше времени чем простое обращение по индексу []. Кнут сказал "90% времени выполнения программа находится в циклах, поэтому следует оптимизировать именно их" Ну, а по практике нужно думать %) Врядли я рожу тут оптимальную идею по тому как это сделать быстро( В принципе первый способ который предложен MerlinTwi Претендует на оптимальность если в него добавить мои советы %). Единственное, что я незнаю/непридумал как это создание массива с рендомными точками/получение не повторяющихся точек. %( |
Дык, я же не собирался демонстировать вариант оптимизации, я просто показал, какой эффект получается (а его, как раз, и дают shift, pop и splice).
Если убрать shift и pop, то мой вариант при 2000 итераций отстает от варианта MerlinTwi где-то на 50 мс. С другой стороны, длинные массивы, например, Flash 8 очень не любит — гораздо быстрее работает с множеством коротких, чем с одним длинным. |
WindWalker, а прочитать первой пост темы по ссылке совесть не позволила?
|
В том, что прочитана была только первая строчка. Про threshold там упоминалось несколько раз, но он не подходит из-за своей медлительности, внимательнее нужно быть.
|
Цитата:
На я как-то подымал тему работы с массивами и с ассоциативными массивами. Там были тесты для разных плееров. Ну и продолжая разговор, делал я проект там была работа я ОГРОМНЫМИ массивами. Допустим подгружались статистические данные посекундно/минутно/часово для нескольких месяцев/лет... (ну естественно не все сразу :D, а по запросу некоторое их количество). Но все хранилось в массиве, посчитай его виртуальную длинну :D реально канешно он был чуть поменьше (флеш как показывает практика хранит их по типу ассоциативных...), но все равно огромные массивы. А работало шустро %). ЗЫ проект был на мх2004. |
Ого теперь у меня вывих мозга :bb:
|
__etc, в твоем примере замещается не вся картинка?
|
MerlinTwi, вся, если убрать shift и pop. Просто с ними прикольный градиент получается :)
__i, вместе с Дембицким делали что-то подобное, что в этой теме, так вот один длинный массив тормозил много больше, чем двумерный. |
| Часовой пояс GMT +4, время: 16:18. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.