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

faraday 12.07.2014 15:33

МувиКлип экспортировать как растр.
 
Здравствуйте, имеется растровая карта 4к*4к, стоит задача разделить ее на города(для дальнейшего выделения и работы с ними) Для оптимизации размера решил импортировать в флеху одну jpg. и уже там обвести векторным контуром города. Проблема возникла при программном разделении растровой карты, Алгоритм пробегает по всем векторным маскам городов, отрисовывает их в bitmapData, и уже потом заполняет их беком фона.
Код AS3:

bmpCity:BitmapData = new BitmapData(borders['_' + i].width, borders['_' + i].height, true, 0x000000);
bmpCity.draw(borders['_' + i]);
for (var _x:int = 0; _x < bmpCity.width;_x++)
for (var _y:int = 0; _y < bmpCity.height; _y++)
if (bmpCity.getPixel32(_x, _y) >> 24 & 0xFF)
bmpCity.setPixel32(_x, _y, bitMap.getPixel32(finMap['_' + i].x + _x, finMap['_' + i].y + _y));

Проблема в том что работает это чрезвычайно медленно, рендер около 10 секунд, и мне кажется именно из-за постоянном вызове draw, поэтому возник вопрос как сохранить возможность всегда править векторные маски в IDE, и при этом чтоб при самой упаковке в SWC с городами можно было работать как bitmapData. В настройках мувика нашел Экспорт как BitMap , но на выходе все равно мувиклип, и не понятно как из него достать сам растр.
http://i.imgur.com/Ahl1tcr.png

nubideus 12.07.2014 16:40

Цитата:

рендер около 10 секунд, и мне кажется именно из-за постоянном вызове draw
Цитата:

Код AS1/AS2:

for (var _x:int = 0; _x < bmpCity.width;_x++)
for (var _y:int = 0; _y < bmpCity.height; _y++)


даа, определенно виноват draw.

у метода draw есть параметр blendMode. юзай например DARKEN

faraday 12.07.2014 17:19

blendMode ситуацию не улучшил.экспериментально выяснил что тормозит именно setPixel. если его отключить - ускорится раза в 3. Едисвтенный вар как я понял, все таки нарезать битмапу в ide, но можно ли это как то сделать через существующие маски? либо все равно прийдется нарезать на png в фотошопе?

samana 12.07.2014 17:46

А почему бы вам просто не применить векторную форму как маску к растровой прямоугольной области города?

nubideus 12.07.2014 17:49

Цитата:

blendMode ситуацию не улучшил.экспериментально выяснил что тормозит именно setPixel. если его отключить - ускорится раза в 3. Едисвтенный вар как я понял, все таки нарезать битмапу в ide, но можно ли это как то сделать через существующие маски? либо все равно прийдется нарезать на png в фотошопе?
я же тебе толсто намекнул что тормоза из-за перебора пикселей. ты можешь нарезать растр без перебора, делая маску режимом наложения

faraday 12.07.2014 18:18

nubideus,Не понял про маску с режимом наложения без копирования икселей, можешь подробнее чем тут поможет бленд?
samanaНу, этих городов больше 100. под каждый подгонять маску напряжно, да и если не растризировать, то опять же в каждом городе будет хранится вся карта целиком.

samana 12.07.2014 18:40

Цитата:

Сообщение от faraday (Сообщение 1169034)
samanaНу, этих городов больше 100. под каждый подгонять маску напряжно, да и если не растризировать, то опять же в каждом городе будет хранится вся карта целиком.

Странно, ведь из первого вашего сообщения я понял, что эти векторные маски уже есть:
Цитата:

Сообщение от faraday (Сообщение 1169034)
Алгоритм пробегает по всем векторным маскам городов...


nubideus 12.07.2014 19:00

Вложений: 1
faraday,
Код AS3:

package 
{
        import flash.events.Event;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.GradientType;
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.geom.Rectangle;
 
        public class Main extends Sprite
        {
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        var mask:Shape = new Shape();
                        var gradientMatrix:Matrix = new Matrix();
                        gradientMatrix.createGradientBox(100, 100);
                        mask.graphics.beginGradientFill(GradientType.LINEAR, [0xFFFFFF, 0xFFFFF], [0x00, 0xFF], [0, 255], gradientMatrix);
                        mask.graphics.drawCircle(50, 50, 40);
                        mask.graphics.drawRect(70, 70, 30, 30);
                        // векторная маска
 
                        var background:BitmapData = new BitmapData(800, 600, true, 0); // твоя карта
                        background.noise(0);
 
                        var maskRect:Rectangle = mask.getBounds(null);
                        var region:BitmapData = new BitmapData(maskRect.width, maskRect.height, true, 0); // результат
                        var maskBitmap:BitmapData = new BitmapData(maskRect.width, maskRect.height, true, 0); // растеризованная маска
                        maskBitmap.draw(mask, new Matrix(1, 0, 0, 1, -maskRect.x, -maskRect.y));
 
                        region.copyPixels(background, maskRect, new Point(), maskBitmap, new Point()); // copyPixels умеет маску
                        this.addChild(new Bitmap(region)).transform.matrix =
                        new Matrix(1, 0, 0, 1, maskRect.x, maskRect.y);
                }
        }
 
}

результат Вложение 31019

и что бы не множить растр делаешь
Код AS3:

                        var maskRect:Rectangle = mask.getBounds(null);
                        var region:BitmapData = new BitmapData(maskRect.width, maskRect.height, true, 0); // результат
 
                        region.draw(mask, new Matrix(1, 0, 0, 1, -maskRect.x, -maskRect.y));
                        region.copyPixels(background, maskRect, new Point(), region, new Point()); // copyPixels умеет маску

Цитата:

не понял про маску с режимом наложения без копирования икселей, можешь подробнее чем тут поможет бленд?
я што то не сообразил как во флеше это сделать просто. как я понял там нужны манипуляции с display list, а раз так, то проще применять векторную маску и растеризовывать результат. может кто подскажет как это сделать правильно? а так мне вариант с copyPixels видится быстрее display list'а, на глаз

faraday, хорошим тоном было бы приложить сюда карту и маски в виде swc

LifeIsRhythm 12.07.2014 22:10

Цитата:

не понятно как из него достать сам растр.
Если не ошибаюсь, то объекту-картинке, нужно задать инстенс нейм и потом обращаться mc.instanceName.
Ну и второй способ доставать, как child.

faraday 13.07.2014 22:43

nubideus, спасибо, copyPixels работает и правда куда быстрее. Остался только непонятным момент с использвоанием матричных преобразований? зачем они тут нужны, разницы без них не заметил..


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

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