2013-08-03 2 views
3

Я создал простой анимированный GIF с использованием Adobe Flash CS3, GIF содержит 200 кадров (1280x786). Когда я загружаю его будет отображаться в приложении C# WPF, программа получает OutOfMemoryException на следующий кодЗагрузка анимированного GIF в C#

private void set_gif_Image(String path) 
    { 
     if (File.Exists(path)) 
     { 
      var bitmapimage = new BitmapImage(); 

      bitmapimage.BeginInit(); 
      bitmapimage.UriSource = new Uri(path); 
      bitmapimage.EndInit(); 
      ImageBehavior.SetAnimatedSource(img_preview, bitmapimage);//Exception Here 
     } 
     else 
     { 
      var bitmapimage = new BitmapImage(); 

      bitmapimage.BeginInit(); 
      bitmapimage.UriSource = new Uri("C:\\testing_files\\ERROR.gif"); 
      bitmapimage.EndInit(); 

      ImageBehavior.SetAnimatedSource(img_preview, bitmapimage); 
     } 

Но если я загружаю 20 кадров GIF, например, программа загружает нормально. Обратите внимание на следующие ситуации:

  • 1280x768 с 200 кадров: Исключение
  • 550x400 с 200 кадров: Нагрузки мелкие
  • 1280x768 50 кадров: Нагрузки мелкие

Где проблема? как получить такой большой анимированный GIF, загруженный без исключения?

+0

Я надеюсь, что это ТАК пост может помочь вам. http://stackoverflow.com/questions/210922/how-do-i-get-an-animated-gif-to-work-in-wpf – Nitesh

+0

Возможно, лучше всего предположить, что исключение является точным. Потребление 786 мегабайт памяти, безусловно, находится в опасной зоне для 32-битного процесса. Вам понадобится 64-битный процесс, чтобы продвинуться вперед. Измените целевой параметр платформы для своего проекта EXE на AnyCPU. Требуется 64-разрядная версия Windows. –

+0

У меня уже есть 64-битная система (ядро i7, 6 ГБ оперативной памяти): | – Abdalla

ответ

4

Или вы можете запустить его в режиме выпуска ... Не должно беспокоить с OutOfMemoryException ...

Я советую вам изменить размер GIF немного, потому что 200fps 1280x768 растровый представляет собой ужасное количество памяти ...

Давайте посмотрим ... 1 кадр представляет собой 983040 пикселей ... (1280 x 768), каждый пиксель выполнен из трех цветов, поэтому 3 байта равны: 3 * 983040 = 2949120 байтов для только один кадр ... У вас есть 200 таких ... так: 589824000 Bytes. Это составляет 576000 кбайт или 562,7 МБайт ...

Это очень много ...

+1

Не забывайте значение альфа. Каждый пиксель занимает 4 байта. Это 786432000 байт или 750 МБ, так как Ханс Пассант уже написал в своем комментарии к вопросу. И как будет работать в режиме Release, чтобы у приложения не хватило памяти? – Clemens

+0

Да, я не был уверен, имеет ли битмап представление альфа-значения. Не использовал его в то время. Запуск в режиме деблокирования позволит оставить «отладочную резервную» память и использовать любую доступную память. У меня было приложение, которое бросило OOMException, когда он использовал 1,5 ГБ памяти в режиме отладки. После того, как я поместил его в режим выпуска, он подхватил доступную память и вырос до 6 ГБ без предупреждений и сделал это работу (оставьте в стороне, что использование 6 ГБ памяти не очень хорошо, поскольку я отказался от этого подхода позже). – DaMachk

+0

У меня проблема с тем же вопросом даже в режиме выпуска: | Я просто не знаю, где нехватка памяти на 6 ГБ оперативной памяти: | – Abdalla

Смежные вопросы