我知道非常類似的問題在這裏問過去 - 但也有我的問題的解決方案:還是內存泄漏.NET4 - 結合內存的BitmapImage成圖像源
我從內存中加載一個圖像到一個的BitmapImage:
private static BitmapImage LoadImage(byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
然後使用這樣(INotifyPropertyChange)到所得的BitmapImage綁定到圖像對象的源(在頁面上)。
問題是:這將導致內存泄漏
你甚至不覺得這用廓線 - 只有.NET內存分析器讓我上(很多在我的情況達2-3圖像300MB!)軌道(因爲它是在非託管內存中的所有字節去 - 所以螞蟻告訴我「.NET使用分配給應用367,3MB的19,24MB總專用字節」 - 漂亮的):
無論我嘗試什麼 - 我都沒有得到這個泄漏。 嘗試(單,一次全部):
- 清晰的視覺樹/刪除上卸載圖像
- 設置圖像-來源爲空
- 使用圖像刷的矩形,而不是圖像
- 其他CacheOptions而不設置的MemoryStream
- 不凍結圖像
我不明白這一點 - 是真的! 只要我停止使用源中的圖像,一切都可以(沒有泄漏)。
有人可以嘗試嗎?
REMARK 看起來這是完全沒有錯誤(見我的第二個評論) - 我要檢查這個,所以我會讓這個問題打開了 - 這也許可以用這個其他的問題有所幫助
嗯......不知道這是不是真的* *由於「泄漏」的內存泄漏似乎約爲550MB,此後一些(200-300MB)內存被釋放,如果我再次加載位圖 - 但仍然不是所需的行爲...... – Carsten 2012-02-07 12:32:15
好吧......哦,我的 - 似乎這個問題是由愚蠢的圖片使用造成的。這些圖片是由用戶提供的(某種地圖 - 黑/白,有很多白色),我只查看了文件大小(大約1MB) - 但是這些是.JPG,圖片的分辨率高達10,000 X 5,000像素(sic!) - 將其解壓縮爲32位,每張圖片輕鬆達到> 150MB ...所以我想我可以稱這個解決方案爲「解決方案」,但現在我會打開它 - 也許有一些好的評論,我仍然必須嘗試「解決方法」(=合理的圖片) – Carsten 2012-02-07 12:54:11