Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.07.2014, 15:33
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 1  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
По умолчанию МувиКлип экспортировать как растр.

Здравствуйте, имеется растровая карта 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 , но на выходе все равно мувиклип, и не понятно как из него достать сам растр.

Старый 12.07.2014, 16:40
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 2  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Цитата:
рендер около 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

Старый 12.07.2014, 17:19
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 3  
Ответить с цитированием
faraday
 
Аватар для faraday

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

Старый 12.07.2014, 17:46
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 4  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
А почему бы вам просто не применить векторную форму как маску к растровой прямоугольной области города?

Старый 12.07.2014, 17:49
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 5  
Ответить с цитированием
nubideus

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

Старый 12.07.2014, 18:18
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 6  
Ответить с цитированием
faraday
 
Аватар для faraday

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

Старый 12.07.2014, 18:40
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 7  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от faraday Посмотреть сообщение
samanaНу, этих городов больше 100. под каждый подгонять маску напряжно, да и если не растризировать, то опять же в каждом городе будет хранится вся карта целиком.
Странно, ведь из первого вашего сообщения я понял, что эти векторные маски уже есть:
Цитата:
Сообщение от faraday Посмотреть сообщение
Алгоритм пробегает по всем векторным маскам городов...

Старый 12.07.2014, 19:00
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 8  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
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);
		}
	}
 
}
результат Название: Снимок.PNG
Просмотров: 344

Размер: 19.7 Кб

и что бы не множить растр делаешь
Код 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


Последний раз редактировалось nubideus; 12.07.2014 в 19:18.
Старый 12.07.2014, 22:10
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 9  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

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

Старый 13.07.2014, 22:43
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 10  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
nubideus, спасибо, copyPixels работает и правда куда быстрее. Остался только непонятным момент с использвоанием матричных преобразований? зачем они тут нужны, разницы без них не заметил..

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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