2013-03-15 69 views
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"); 

    } 

我的問題是。爲什麼我的應用程序在重處理上崩潰?它與匿名聲明事件處理程序有什麼關係?我很困惑。

謝謝!

+0

嘗試使用PhotoShop或Adobe Bridge進行此操作。他們做得更好! – 2013-03-16 02:21:05

回答

3

檢查您的內存使用情況,一旦完成調整圖像大小以釋放內存,您也可以致電bitmapData.dispose

我也會將這些匿名函數移出來,使其更易於閱讀,並且由於for循環而不易出錯。

編輯:我相信問題是文件數組沒有其他的refence,所以你失去了對文件的引用。試試下面的代碼,看看它是否有幫助。

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); 

     } 
    } 
} 
+0

內存使用情況看起來不錯。程序在調整單個圖像之前崩潰。它需要大約10秒的時間,然後凍結並停止響應。據報道,內存使用量爲80MB,並不多。你有什麼建議? – deadlock 2013-03-15 16:44:22

+0

它開始工作的圖像有多大?而且,根據IDE,15可能是標準的腳本超時。 – 2013-03-15 16:45:28

+0

圖像大約4mb每個​​。另外,我剛剛意識到,當目錄有許多圖像並且圖像尺寸很大時,「Event.COMPLETE」根本不會觸發。 – deadlock 2013-03-15 16:47:12

相關問題