2013-03-15 78 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