Почему этот код генерации миниатюр создает исключение OutOfMemoryException для больших файлов? - PullRequest
2 голосов
/ 21 марта 2010

Этот код отлично работает для создания миниатюр, но когда ему предоставляется очень большой (100 МБ +) файл TIFF, он генерирует исключения OutOfMemoryExceptions. Когда я делаю это вручную в Paint.NET на той же машине, он работает нормально. Как я могу улучшить этот код, чтобы перестать создавать очень большие файлы?

В этом случае я загружаю 721 МБ TIF на машину с 8 ГБ ОЗУ. Диспетчер задач показывает, что используется 2 ГБ, поэтому что-то мешает ему использовать всю эту память. В частности, он выдает, когда я загружаю изображение, чтобы рассчитать размер оригинала. Что дает?

/// <summary>Creates a thumbnail of a given image.</summary>
/// <param name="inFile">Fully qualified path to file to create a thumbnail of</param>
/// <param name="outFile">Fully qualified path to created thumbnail</param>
/// <param name="x">Width of thumbnail</param>
/// <returns>flag; result = is success</returns>
public static bool CreateThumbnail(string inFile, string outFile, int x)
{
  // Mathematically determine Y dimension
  int y;
  using (Image img = Image.FromFile(inFile)) // Exception thrown
      y = (int)((double)img.Height * ((double)x / (double)img.Width));

  // Make thumbnail     
  using (Bitmap bmp = new Bitmap(inFile)) 
    using (Bitmap thumb = new Bitmap((Image)bmp, new Size(x, y))) 
      using (Graphics g = Graphics.FromImage(thumb)) {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.InterpolationMode = InterpolationMode.High;
        g.CompositingQuality = CompositingQuality.HighQuality;
        ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders()[1];
        EncoderParameters ep2 = new EncoderParameters(1);
        ep2.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
        g.DrawImage(bmp, new Rectangle(0,0,thumb.Width, thumb.Height));
        try {
          thumb.Save(outFile, codec, ep2);
          return true; }
        catch { return false; }
      }
}

Ответы [ 2 ]

1 голос
/ 21 марта 2010

Мое странное предположение, что вы запускаете его как 32-битное приложение. Что ограничивает использование памяти вашего приложения теоретическими 2 ГБ, что на самом деле больше похоже на 1,5 ГБ эмпирически.

0 голосов
/ 21 марта 2010

Вы пробовали с FastImageGDIPlus . Это хорошо сработало, но я никогда не пытался загрузить файл размером 721 МБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...