PDA

Просмотр полной версии : расчет размера картинки до ее загрузки


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

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

SamFR
01.12.2009, 18:12
Подтормаживает? Да он тормозит как собака! :)

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

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

mrMEM
01.12.2009, 18:31
эм..
он позволяет узнать размеры до загрузки?)

dimarik
01.12.2009, 22:31
А узнаёте, что грузите? png, jpg, bmp...

данные интерпретируются в Bitmap при помощи Loader-a
Это работает?
где-то (http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/) [далеко идут грибные дожди] пытались сделать подобное для jpg.

mrMEM
02.12.2009, 15:04
)
спасибо, а как же быть с png?

TanaTiX
02.12.2009, 19:31
mrMEM, советую использовать дебаг-версию плеера, ибо там какие-то ошибки полезли. Так я их не запомнил, а второй раз грузить эти тормоза нет никакого желания.
dimarik, очень интересная ссылка, отдельное спасибо.