[英]out of memory exception when reading image from folder
我需要從文件夾ans中讀取所有圖像文件,然后將其保存到另一個具有壓縮大小的文件夾中。但是我的代碼很好地壓縮了這些圖像,但是在695個圖像文件“內存不足異常”之后,它給出了錯誤。 這是我的代碼。大約有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();
}
}
問題在於您不會像處理其他圖像引用那樣處理originalimg
。 您應該在if語句的末尾添加以下內容:
originalimg.Dispose();
但是,我建議您使用using
塊,因為這些塊將幫助您更好地管理此類資源的處理,因為您不必隱式調用Dispose
方法,即使在調用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);
}
}
}
}
我建議使用using塊對此進行修改,以避免需要調用(或忘記調用) 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(...);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.