0

フォルダーからすべての画像ファイルを読み取り、圧縮サイズの別のフォルダーに保存する必要があります。ただし、コードはこの画像を非常によく圧縮しますが、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();

  }
}
4

2 に答える 2

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);
            }
        }
    }
}
于 2013-09-30T09:58:01.467 に答える
4

Disposeメソッドを呼び出す (または呼び出すのを忘れる) 必要がないように、using ブロックを使用してこれを変更することをお勧めします。

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(...);
   }
}
于 2013-09-30T10:00:24.210 に答える