2013-09-30 101 views
0

我需要从文件夹中读取所有图像文件并将其保存到压缩大小的另一个文件夹中。但是,我的代码很好地压缩了这些图像,但它在695图像文件“内存异常“。这是我的code.there是在2000年左右的图像内存不足异常从文件夹中读取图像时

List<string> files = new List<string>(); 
files = Directory.GetFiles(Server.MapPath("../imgres") + "\\products\\", "*.jpg").ToList(); 
for (int k = 0; k < files.Count; k++) 
{ 
    if (File.Exists(files[k].ToString())) 
    { 
    string SaveLocation1 = ""; 
    System.Drawing.Image thumbnail; 
    System.Drawing.Image smallsize; 
    System.Drawing.Image originalimg; 

    originalimg = System.Drawing.Image.FromFile(files[k].ToString()); 
    thumbnail = originalimg.GetThumbnailImage(110, 110, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero); 
    smallsize = originalimg.GetThumbnailImage(47, 47, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero); 

    SaveLocation1 = Server.MapPath("../imgres/products") + "\\Thumbnail\\" + Path.GetFileName(files[k].ToString()); 
    thumbnail.Save(SaveLocation1); 
    thumbnail.Dispose(); 

    SaveLocation1 = Server.MapPath("../imgres/products") + "\\smallsize\\" + Path.GetFileName(files[k].ToString()); 
    smallsize.Save(SaveLocation1); 
    smallsize.Dispose(); 

    } 
} 
+3

你不在'originalimg'上调用'Dispose'并且内存不足? [Hm ...](http://msdn.microsoft.com/en-us/library/yh598w02.aspx) –

+0

尝试调用'originalimg.Dispose();'也。 – Heslacher

+0

可能重复:http://stackoverflow.com/questions/1108607/out-of-memory-exception-on-system-drawing-image-fromfile – pordi

回答

4

的问题是,你是不是处置originalimg像你与其他图像引用。您应该添加以下你的if语句的末尾:

originalimg.Dispose(); 

不过我建议你使用using块,这些将帮助你更好地管理这些资源的所述设置,你不会有隐含调用Dispose方法,即使您在致电Dispose之前发生异常,它也会处理处置,因此您可以确保它将被正确清理。

事情是这样的:

if (File.Exists(files[k].ToString())) 
{ 
    using(System.Drawing.Image originalimg = System.Drawing.Image.FromFile(files[k].ToString())) 
    { 
     using(System.Drawing.Image thumbnail = originalimg.GetThumbnailImage(110, 110, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)) 
     { 
      using(System.Drawing.Image smallsize = originalimg.GetThumbnailImage(47, 47, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)) 
      { 
       string SaveLocation1 = Server.MapPath("../imgres/products") + "\\Thumbnail\\" + Path.GetFileName(files[k].ToString()); 
       thumbnail.Save(SaveLocation1); 

       SaveLocation1 = Server.MapPath("../imgres/products") + "\\smallsize\\" + Path.GetFileName(files[k].ToString()); 
       smallsize.Save(SaveLocation1); 
      } 
     } 
    } 
} 
+0

感谢您的回复球员,问题是与腐败的图像一些图像已损坏。 – sharad

4

我会建议用使用块修改此,以避免任何需要调用(或忘记调用)的Dispose方法:

using (Image originalimg = Image.FromFile(files[k].ToString())) 
{ 
    using (Image thumbnail = originalimg.GetThumbnailImage(110, 110, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)) 
    { 
     thumbnail.Save(...); 
    } 

    using (Image smallsize = originalimg.GetThumbnailImage(47, 47, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)) 
    { 
     smallsize.Save(...); 
    } 
} 
+1

即使您不忘记打电话,也可能会遇到异常情况。你应该总是......使用#nopunintended。 –

+0

感谢您的回复球员,问题是与腐败的形象一些图像腐败。 – sharad