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