有3千多个图片文件,我现在批量把这些图片缩小,生成一个新文件,
大约转到1千左右就出现内存不足的异常,怎么优化一下啊,望高手赐教,多谢代码如下:string[] files = System.IO.Directory.GetFiles(@"E:\uploadfile");
System.Drawing.Image img;
LEO.Common.Thumbnail thum = new LEO.Common.Thumbnail();
foreach(string file in files)  {
img = thum.GetThumbnail(file,400,400);
img.Dispose();
string fileName = file.Substring(file.LastIndexOf("\\"),file.Length-file.LastIndexOf("\\"));
System.Diagnostics.Debug.WriteLine(fileName);
//img.Save(@"d:\new" + file);
}

解决方案 »

  1.   

    现在内存很便宜D。。本人实属菜鸟一名。想邀请各位朋友共同讨论.net,java,SQL,j2ee,j2me,html,css,javascrpt,c/c++,xml等软件开发,网站开发等语言。
    也请各位高人光临指教。。
    QQ群号22629823
      

  2.   

    我不太清楚LEO.Common.Thumbnail是什么东西,第三方组件?有可能它有问题。改进的方法可以如下试试:
    LEO.Common.Thumbnail thum = new LEO.Common.Thumbnail();
    private void SaveThumnailImage( string strSourceFile, string strDesDir )
    {
           Image img = thum.GetThumbnail(strSourceFile,400,400);
           string fileName = file.Substring(file.LastIndexOf("\\"),file.Length-file.LastIndexOf("\\"));
           System.Diagnostics.Debug.WriteLine(fileName);
           img.Save( strDesDir + file);
           img.Dispose();
    }//Call it
    string[] files = System.IO.Directory.GetFiles(@"E:\uploadfile");
    foreach(string file in files)
    {
          SaveThumnailImage( file, @"d:\new" );
          //如果还不行的话,这里显式的调用 "GC.Collect()"看看效果
    }
      

  3.   

    多谢老大回复,GC.Collect()之后还会出现内存不足LEO.Common.Thumbnail 是我写的自定义类,方法很简单,就是生成缩略图,
    代码如下,麻烦老大看怎么优化一下,不胜感激:public  System.Drawing.Image GetThumbnail(string fileName,int width,int height)
    {
    System.Drawing.Image img;
    img = System.Drawing.Image.FromFile(fileName); Size size = GetSize(width,height,img.Width,img.Height);
    //新建一个bmp图片
    Image bitmap = new System.Drawing.Bitmap(size.Width,size.Height);
    //新建一个画板
    Graphics g = System.Drawing.Graphics.FromImage(bitmap);
    //设置高质量插值法
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    //设置高质量,低速度呈现平滑程度
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    //在指定位置并且按指定大小绘制原图片的指定部分
    g.DrawImage(img, new Rectangle(0, 0, size.Width, size.Height), 
    new Rectangle(0, 0, img.Width,img.Height),GraphicsUnit.Pixel); g.Dispose();
    img.Dispose();
    return bitmap;
    }
      

  4.   

    我试了一下没问题,大致如下:
    private void SaveThumnailImage( string strSourceFile, string strDesFile )
    {
    Image img = GetThumbnail(strSourceFile,400,400);
    img.Save( strDesFile);
    img.Dispose();
    }public Image GetThumbnail(string fileName,int width,int height)
    {
    Image img = System.Drawing.Image.FromFile(fileName); Size size = new Size(width,height); //新建一个bmp图片
    Image bitmap = new Bitmap(size.Width,size.Height);
    //新建一个画板
    Graphics g = Graphics.FromImage(bitmap);
    //设置高质量插值法
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    //设置高质量,低速度呈现平滑程度
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    //在指定位置并且按指定大小绘制原图片的指定部分
    g.DrawImage(img, new Rectangle(0, 0, size.Width, size.Height),
    new Rectangle(0, 0, img.Width,img.Height),GraphicsUnit.Pixel); g.Dispose();
    img.Dispose();
    return bitmap;
    }//Call 
    const string SOURCE_FILE = @"D:\Test.jpg";
    for( int i = 0; i < 1500; i++ )
    {
    SaveThumnailImage( SOURCE_FILE, string.Format( @"D:\temp\{0}.jpg", i ) );
    Thread.Sleep( 10 );
    GC.Collect();
    }
      

  5.   

    原来是图片坏了,在加载图片的时候报错了
    System.Drawing.Image img = System.Drawing.Image.FromFile(fileName);用下面的方式跳过异常可取吗?要怎么跳过异常才更好?
    for( int i = 0; i < 1500; i++ )
    {
    try{
    SaveThumnailImage( SOURCE_FILE, string.Format( @"D:\temp\{0}.jpg", i ) );
    }
    catch{}
    }
      

  6.   

    这样可以,但在SaveThumnailImage函数里面进行捕获会更好
      

  7.   

    OK,多谢各位,准备结贴另外问下老大,用Thread.Sleep( 10 );让CPU睡一会有什么好处?
      

  8.   

    好象记得java图象处理有缓冲机制的
      

  9.   

    是啊,大内存用VirtualAlloc吧,忘了那个函数了
      

  10.   

    逐个生成文件,生成后一定要释放对象。建议写一个函数如:createImg( string file)file为图片路径。最后几行将用完的对象 ,dispose()一下。在用gc里的函数进行一下强制垃圾处理。调用时:
    foreach(  string file in files )
    {
    createImg(file);
    }