Форум 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=210969)

Vlad84 05.06.2015 18:28

Постепенная сборка изображения
 
Вложений: 1
Есть битмапа огромного размера, над ней нужно провести ряд преобразований с помощью фильтров и сохранить в картинку на локальном диске. Собрал тестовый вариант и прибалдел от загрузки ЦП.

Понимаю, что надо дробить картинку на битмапы меньшего размера, с которыми и работать.
Не понимаю как собрать куски bitmapdatа-ы в один большой?


Код AS3:

for (var $y:int = 0; $y < Math.floor(mc.height / block); $y++) {
        for (var $x:int = 0; $x < Math.floor(mc.width / block); $x++) {
                var bitmapdata = new BitmapData(block,block,true,0xFFFFFF);
                        bitmapdata.draw(mc, new Matrix(1, 0, 0, 1, -$x * block, -$y * block), null, null, null, true);
        }
}

Разбивка на куски:

samana 05.06.2015 18:58

Цитата:

Не понимаю как собрать куски bitmapdatа-ы в один большой?
Создаёте большую битмапДату, и в цикле пробегаетесь по маленьким битмапДатам и копируете из них пиксели (copyPixels) в большую. В методе copyPixels есть параметр, обозначающий в какую область копировать пиксели.

Vlad84 05.06.2015 19:25

А чем copyPixels принципиально отличается от метода draw?

caseyryan 05.06.2015 20:19

1) тем, что draw врисует любой объект IDrawable, а copyPixels может только из BitmapData копировать
2) copyPixels может выбрать любой участок изображения без лишних заморочек, не требуя никаких матриц

samana 05.06.2015 20:27

3) так же copyPixels работает очень быстро.

caseyryan 05.06.2015 20:31

Ну draw тоже достаточно шустрый метод

samana 05.06.2015 20:41

Кстати, не уверен, что применение разных фильтров на маленькие кусочки дадут ожидаемый результат в конечной сборке в единое изображение, наверно появятся швы.
И почему-то есть подозрение, что разбивка не даст прирост в производительности.. Но надо конечно тестировать.

meiciuc 05.06.2015 21:27

1. зачем предварительно разбивать на куски большой битмап, если все равно над всеми кусками придется выполнять различные действия? Как это может положительно сказаться на производительности?
2. после применения фильтров к кускам, действительно, велика вероятность, что появятся швы
3. в данном случае draw будет быстрее, чем copyPixel - ведь во втором случае метод будет заключен в довольно медленный (и огромный!) цикл
4. а почему загрузка проца критична? И если все-таки критична, может, в сторону шейдеров посмотреть?
5. если дело в том, что приложение во время выполнения работы подвисает, может распределить применение фильтров по-времени?

Zebestov 05.06.2015 21:55

meiciuc, в твоем комментарии ответ на пункт 1 раскрывается в пункте 5.
Про огромный цикл я не понял — есть же аргумент sourceRect.

Что касается неоднократно упомянутых швов, то их можно полностью избежать, если применять всякие blur/displace к тайлу с полями. С одной стороны это безусловно увеличит время обработки, с другой — это решение.

meiciuc 05.06.2015 22:02

Цитата:

Сообщение от Zebestov (Сообщение 1183189)
meiciuc, в твоем комментарии ответ на пункт 1 раскрывается в пункте 5.

не совсем. Я имел ввиду, что если фильтров несколько, то их можно применить последовательно через какой-нибудь таймаут. Применить к оригинальной картинке - не нарезая ее.
Цитата:

Сообщение от Zebestov (Сообщение 1183189)
meiciuc
Что касается неоднократно упомянутых швов, то их можно полностью избежать, если применять всякие blur/displace к тайлу с полями. С одной стороны это безусловно увеличит время обработки, с другой — это решение.

Конечно, можно усложнить себе задачу - применять фильтры к кусочкам с бордерами. Я только так и не понял - зачем? Каким образом нарезка большой картинки с последующим сшиванием может увеличить скорость преобразования этой картинки?


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

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