2013-08-03 109 views
3

我使用Adobe Flash CS3創建了一個簡單的動畫GIF,GIF包含200幀(1280x786)。當我加載它被顯示在C#WPF應用程序時,程序獲取一個OutOfMemoryException上下面的代碼在C#中加載動畫GIF#

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例如,程序加載罰款。請注意以下幾種情況:

  • 1280×768與200幀:異常
  • 550x400以200幀:加載罰款
  • 具有1280×768 50幀:加載罰款

問題出在哪裏?如何獲得如此大的動畫GIF加載沒有例外?

+0

我希望這個SO後可以幫助你。 http://stackoverflow.com/questions/210922/how-do-i-get-an-animated-gif-to-work-in-wpf – Nitesh

+0

這可能是最好的假設例外是準確的。在32位進程的危險區域消耗786 MB內存肯定很深。你需要一個64位的流程才能實現。將您的EXE項目的平臺目標設置更改爲AnyCPU。 64位版本的Windows是必需的。 –

+0

我已經有一個64位系統(英特爾酷睿i7,6GB內存):| – Abdalla

回答

4

也可以在發行模式下運行它......不應該與OutOfMemoryException異常困擾......

我建議你調整GIF一點,因爲200fps 1280×768位代表一個可怕的量的內存...

讓我們來看... 1幀表示983040像素...(1280 x 768),每個像素由3種顏色的數據組成,所以3字節等於:3 * 983040 = 2949120字節只有一個框架... 你有200 ...那麼:589824000字節。 這等於576000 KB或562.7兆字節...

這是一個可怕的很多...

+1

不要忘記alpha值。每個像素需要4個字節。這是總共786432000字節或750MB,因爲Hans Passant已經在他對這個問題的評論中寫過。那麼在Release模式下運行將如何防止應用程序內存不足? – Clemens

+0

是的,我不確定位圖是否具有alpha值表示。有一段時間沒有用過它。 在發佈模式下運行它將保留「調試保留」內存並採用任何可用的內存。我有一個應用程序在調試模式下使用了15GB內存時拋出了OOMException。一旦我將它放入發佈模式,它會將可用內存提高到6GB,並且沒有任何警告,並且它是工作(留待6GB內存不好,因爲我稍後放棄了這種方法)。 – DaMachk

+0

即使在發佈模式下,我仍然遇到同樣的問題:|我只是不知道6 GB RAM機器上內存不足的情況:| – Abdalla