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

mrMEM 01.12.2009 18:04

расчет размера картинки до ее загрузки
 
для расчета размера картинки провожу следующую процедуру, описанную в нижеследующем коде. Используя 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

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
Это работает?
где-то [далеко идут грибные дожди] пытались сделать подобное для jpg.

mrMEM 02.12.2009 15:04

)
спасибо, а как же быть с png?

TanaTiX 02.12.2009 19:31

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


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

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