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

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

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

Регистрация: Feb 2009
Сообщений: 63
Question расчет размера картинки до ее загрузки

для расчета размера картинки провожу следующую процедуру, описанную в нижеследующем коде. Используя URLStream считываю по 5000 байт картинки, данные интерпретируются в Bitmap при помощи Loader-a, пока не станут известны размеры картинки. Еще использую таймер, а не progress потока, для того чтобы считывать данные из потока, не зависимо от того завершилось ли считывание данных в поток

Код AS3:
		private function calculateSize(){
			if (width==0 && height==0){
				if (sizeStream) {
					try {sizeStream.close();} catch (err:Error) {};
					sizeStream.removeEventListener(ProgressEvent.PROGRESS, sizeStreamProgressHandler);
					sizeStream.removeEventListener(Event.COMPLETE, completeHandler);
					sizeStream = null;
				}
				if (sizeLoader) {
					try {sizeLoader.close();} catch (err:Error)  {}
					try {sizeLoader.unload();}catch (err2:Error) {}
					sizeLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSizeCalculator);
		            		sizeLoader.contentLoaderInfo.removeEventListener(Event.UNLOAD, ioLUnloadHandler);
					sizeLoader = null;
				}
 
				sizeStream = new URLStream();
				sizeLoader = new Loader();
				sizeByteArray = new ByteArray();
				sizeStream.addEventListener(ProgressEvent.PROGRESS, sizeStreamProgressHandler);
				sizeStream.addEventListener(Event.COMPLETE, completeHandler);
 
 
				sizeLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSizeCalculator);
	            sizeLoader.contentLoaderInfo.addEventListener(Event.UNLOAD, ioLUnloadHandler);
 
 
				sizeTimer = new Timer(100);
				sizeTimer.addEventListener(TimerEvent.TIMER, loadProgress);
				try {
					sizeStream.load(url);
				}
				catch (err2:Error){
					trace("__calculateSize: "+err2);
				}
			}
		}
		function parseHeader() {
			trace("parseHeader "+url.url);
			trace("version: " + sizeStream.readByte());
		}
		function completeHandler(event:Event){
			trace("completeHandler: " + event);
//			parseHeader();
		}
		function ioLUnloadHandler(e:Event){
			trace("unloaded.. "+url.url);
			sizeLoader.loadBytes(sizeByteArray);
		}
 
		private function sizeStreamProgressHandler(e:ProgressEvent){
			sizeStream.readBytes(sizeByteArray, sizeByteArray.length, 5000);
			sizeLoader.unload();
//			sizeLoader.loadBytes(sizeByteArray);
			sizeTimer.start();
			sizeStream.removeEventListener(ProgressEvent.PROGRESS, sizeStreamProgressHandler);
		}
 
		private function loadProgress(e:TimerEvent){
			if (sizeBytesAdded){
				trace("loading... "+url.url);
				sizeBytesAdded = false;
				sizeStream.readBytes(sizeByteArray, sizeByteArray.length, 5000);
				sizeLoader.unload();
				sizeLoader.loadBytes(sizeByteArray);
			}
		}
 
		private function onSizeCalculator(e:Event){
		try{
			var tmpBitmap:Bitmap = sizeLoader.content as Bitmap;
			trace("convert.. "+url.url);
			if ((tmpBitmap.width==0) || (tmpBitmap.height==0)){
				sizeBytesAdded = true;
			}
			else{
				sizeTimer.stop();
				sizeTimer.removeEventListener(TimerEvent.TIMER, loadProgress);
				sizeTimer = null;
 
				if (sizeStream) {
					try {sizeStream.close();} catch (err:Error) {trace(err)};
					sizeStream.removeEventListener(ProgressEvent.PROGRESS, sizeStreamProgressHandler);
					sizeStream.removeEventListener(Event.COMPLETE, completeHandler);
					sizeStream = null;
				}
				width  = tmpBitmap.width;
				height = tmpBitmap.height;
 
				trace("Calculated "+url.url+"  "+width+":"+height);
 
				this.dispatchEvent(new Event(BitmapNode.CALCULATE_SIZE));
 
				if (sizeLoader) {
					try {sizeLoader.close();} catch (err:Error)  {}
					try {sizeLoader.unload();}catch (err2:Error) {}
					sizeLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSizeCalculator);
		            sizeLoader.contentLoaderInfo.removeEventListener(Event.UNLOAD, ioLUnloadHandler);
					sizeLoader = null;
				}
 
				sizeByteArray = null;
			}
		}catch(e:Error){trace(e)}
 
		}
есть ряд вопросов:
- почему алгоритм притормаживает на компе?
- почему не всегда срабатывает (либо при локальном запуске, либо при запуске с сервера)?
- есть алгоритмы проще?

есть пример на сервере, где загружаются 6 картинок, паралельно определяется их размер, по заданному алгоритму:
http://reditstudio.ru/tmp/galery.swf

Старый 01.12.2009, 18:12
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 2  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Подтормаживает? Да он тормозит как собака!

Причина, скорее всего – в частых созданиях экземпляра Loader с последующей загрузкой в него данных. Операция достаточно ресурсоёмкая, а если она рпоисходит при загрузке каждых 5 килобайт – тогда всё понятно.

А вы не думали грузить сразу Loader-ом?

Старый 01.12.2009, 18:31
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 3  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
эм..
он позволяет узнать размеры до загрузки?)

Старый 01.12.2009, 22:31
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
А узнаёте, что грузите? png, jpg, bmp...

Цитата:
данные интерпретируются в Bitmap при помощи Loader-a
Это работает?
где-то [далеко идут грибные дожди] пытались сделать подобное для jpg.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 02.12.2009, 15:04
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 5  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
)
спасибо, а как же быть с png?

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
mrMEM, советую использовать дебаг-версию плеера, ибо там какие-то ошибки полезли. Так я их не запомнил, а второй раз грузить эти тормоза нет никакого желания.
dimarik, очень интересная ссылка, отдельное спасибо.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

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

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

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


 


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


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