使用 ByteArray 加载时如何获取图像尺寸?

How to get image dimensions when loaded with ByteArray?

使用 AS3 和 AIR 我想在使用 ByteArray 加载图像后获得图像尺寸。使用下面的代码,我可以成功加载图像,甚至可以成功应用 scaleX/scaleY,但从加载器大小中得到零,因为 height/width。

        private function listFiles():void{
        imagesPath=layout.pathFld.text;
        fileList=new Array;
        var desktop:File = File.userDirectory.resolvePath(imagesPath);
        var files:Array = desktop.getDirectoryListing();
        for (var i:uint = 0; i < files.length; i++)
        {
            fileList.push(files[i].nativePath);
        }
        for (i = 0; i < fileList.length; i++)
        {
            layout.txtFld.appendText(fileList[i]+"\n");
        }
        loadOneImage();
    }

    private function loadOneImage():void
    {
        var f:String=fileList[counter];
        bytes = new ByteArray();
         myFileStream = new FileStream();
        var myFile:File = File.userDirectory.resolvePath(f);

        myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
        myFileStream.addEventListener(Event.COMPLETE, loadImage);       
        myFileStream.openAsync(myFile, FileMode.READ);
    }

    private function progressHandler(event:ProgressEvent):void 
    {
        if (myFileStream.bytesAvailable)
        {
            myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable);
        }
    }

    private function loadImage(e:Event):void
    {
        var loader:Loader = new Loader();
        loader.loadBytes(bytes);    
        loader.scaleX=.05;
        loader.scaleY=.05;
        var ph:Number=loader.height;
        var pw:Number=loader.width;
        trace("ph/pw="+ph+"/"+pw);
       // I GET ZEROS HERE
     }

为了正确获取构造的 DisplayObject 的大小,请先将其添加到舞台。如果您不需要将它保留在舞台上,您可以在 space 四行代码中添加、获取大小、删除。此外,即使您执行 loadBytes(),加载程序也会异步执行加载,因此您仍然必须在尝试获取大小之前侦听 Event.COMPLETE

要获取图像尺寸,您可以使用 Loader.contentLoaderInfo,但正如@Vesper 所说,您必须等待它的 Event.COMPLETE 事件被触发,否则编译器将触发错误,因此您可以这样做:

var loader:Loader = new Loader();
    loader.loadBytes(bytes);
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onContentLoad);
    function onContentLoad(e:Event):void{
        trace('image width : ' + e.target.width);
        trace('image height : ' + e.target.height);         
    }

希望能帮到你。