2013-10-13 56 views
1

我想使用WriteableBitmap對象,因爲我需要它來旋轉圖像並將圖像保存到我的應用程序的獨立存儲。WP8 WriteableBitmap構造函數保留大量內存

問題是,它使用了太多內存,最終導致內存不足異常。

下面是我的應用程序的內存使用情況圖片,圖片鏈接爲here,以便更好地查看。

Memory Chart

這裏的,我使用WriteableBitmap的一個實例:

 WriteableBitmap picture = new WriteableBitmap(PictureCanvas, null); 

     using (var memoryStream = new MemoryStream()) 
     { 
      picture.SaveJpeg(memoryStream, picture.PixelWidth, picture.PixelHeight, 0, 100); 

      using (var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(Globals.OVERLAY_FILE_NAME, FileMode.Create, myIsolatedStorage)) 
       { 
        fileStream.Write(memoryStream.ToArray(), 0, memoryStream.ToArray().Length); 
        fileStream.Close(); 
       } 
      } 
     } 

     picture = picture.Crop(0, 0, 1, 1); 

我嘗試裁剪圖像,使其佔用更少的內存,但並不做任何事情。

我正在使用WriteableBitmap擴展庫here,並在頭版中提到Dispose()方法,但我沒有在我的應用程序中看到它。

如果有人可以請告訴我如何解決這個問題或指向我的某個地方,我可以找到一個可能的解決方案,那太棒了!

回答

1

我有a similar issue和仍在調查,但至少一個小技巧,我可以給:如果有可能擺脫的MemoryStream並直接寫入到FILESTREAM像這樣:

WriteableBitmap picture = new WriteableBitmap(PictureCanvas, null); 
    using (var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
    using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(Globals.OVERLAY_FILE_NAME, FileMode.Create, myIsolatedStorage)) 
    { 
     picture.SaveJpeg(fileStream, picture.PixelWidth, picture.PixelHeight, 0, 100) 
    } 

這應該給你買一些記憶。

+0

我能夠通過將writeableBitmap設置爲null來減少內存使用量。現在我沒有在我的問題中包括這個,但是我正在從視頻刷中獲取內存泄漏,這實際上是導致我的泄漏。我會建議設置爲空。我還查看了你的代碼,並且處理了你製作的流,但是不要關閉它們。也許這將有助於?我還建議製作一個小應用程序,只使用writeableBitmap來製作圖像,然後檢查內存使用情況,並繼續構建小樣本,直到發現泄漏。 –

+0

謝謝克里斯!儘管我注意到了,但我瞥了一眼畫筆的歸零。處理一個流自動關閉它,使用反射器,IL間諜或任何其他反編譯工具檢查出來。這是多餘的。 –

+0

但是,請嘗試這個東西,直接寫入fileStream並避免MemoryStream。 MemoryStream使用了內部重新分配的字節數組(每次溢出時翻倍)併產生大量垃圾。最後,我沒有看到它的目的.. –