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

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

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

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


 


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


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