我正在编写一个应该批量调整文件夹中图像大小的应用程序。我的问题是我的代码适用于具有少量图像的小图像或目录的目录,但是当我在需要更多处理的许多大图像的目录上运行我的代码时,应用程序崩溃而不报告任何错误。这是我的代码:
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 :(得分: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);
}
}
}