1

フォルダー内の画像のサイズをバッチで変更するアプリケーションを作成しています。私の問題は、私のコードが小さな画像を含むディレクトリまたは少数の画像を含むディレクトリに対して機能することですが、より多くの処理が必要な大きな画像が多数あるディレクトリでコードを実行すると、エラーを報告せずにアプリケーションがクラッシュします。これが私のコードです:

function BatchResizeDirectory(){
        var dir : File = new File;

        dir.addEventListener(Event.SELECT,function(){
            var files = dir.getDirectoryListing();

            for each (var file:File in files) 
            {
                if(["png","jpg","bmp","jpeg"].indexOf(file.extension.toLocaleLowerCase()) != -1){

                    file.addEventListener(Event.COMPLETE,function(e:Event){
                        var f:File = File(e.target);    
                        var loader:Loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event){

                            //init bmp data
                            var bmpd:BitmapData = new BitmapData(loader.content.width,loader.content.height);
                            bmpd.draw(loader);

                            //resize
                            var result:BitmapData = ImageResizer.bilinearIterative(bmpd, 64,64,
                                ResizeMath.METHOD_PAN_AND_SCAN);

                            //write to disk
                            var pnge:JPEGEncoder = new JPEGEncoder();
                            var bytes:ByteArray = pnge.encode(result);

                            var name = f.name.replace("."+f.extension,"");
                            var outputFilename = dir.nativePath+"/"+ name + "_resized." + f.extension;
                            var outputFile:File = dir.resolvePath(outputFilename);
                            var fs:FileStream = new FileStream();
                            try{
                                //open file in write mode
                                fs.open(outputFile,FileMode.WRITE);
                                //write bytes from the byte array
                                fs.writeBytes(bytes);
                                //close the file
                                fs.close();
                            }catch(e:Error){
                                trace(e.message);
                            }

                        });
                        loader.loadBytes(f.data);

                    });

                    file.load();

                }

            }
        });

        dir.browseForDirectory("Choose the input folder");

    }

私の質問はです。負荷の高い処理でアプリケーションがクラッシュするのはなぜですか? イベントハンドラーの匿名宣言と関係がありますか? 私は混乱しています。

ありがとうございました!

4

1 に答える 1

3

bitmapData.disposeメモリ使用量を確認してください。また、画像のサイズ変更が完了したら呼び出してメモリを解放することもできます。

また、これらの匿名関数を移動して、読みやすくし、for ループによるエラーが発生しにくくします。

編集:ファイル配列に他の参照がなかったため、ファイルへの参照が失われていたことが問題だったと思います。次のコードを試して、役立つかどうかを確認してください。

package 
{
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filesystem.File;
    import flash.filesystem.FileStream;

    public class Main extends Sprite 
    {
        private var _files:Array;

        public function Main():void 
        {
            BatchResizeDirectory();
        }

        private function BatchResizeDirectory():void{
            var dir : File = new File;

            dir.addEventListener(Event.SELECT,function():void{
                _files = dir.getDirectoryListing();

                for each (var file:File in _files) 
                {
                    loadFile(file);

                }
            });

            dir.browseForDirectory("Choose the input folder");

        }

        private function loadFile(file:File):void 
        {
            if(file.extension && ["png","jpg","bmp","jpeg"].indexOf(file.extension.toLocaleLowerCase()) != -1){

                file.addEventListener(Event.COMPLETE, onComplete);

                file.load();
            }
        }

        private function onComplete(e:Event):void 
        {
            var f:File = File(e.target);    
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT,function(e:Event):void{

                trace(f.name);
            });
            loader.loadBytes(f.data);

        }
    }
}
于 2013-03-15T16:36:15.220 に答える