1

我正在使用Windows Phone 8.1 RT應用程序。從文件中讀取圖像後顯示圖像的一種方法是創建一個BitmapImage並將其設置爲XAML控件的源。加載BitmapImage在WP 8.1中佔用大量內存RT

我正在使用下面的代碼來做同樣的事情。圖像存儲在LocalFolder

private async void LoadImage() 
{ 
    StorageFolder folder = ApplicationData.Current.LocalFolder; 
    StorageFile file = await folder.GetFileAsync("imageFile.jpg"); 

    BitmapImage bitmapImage = new BitmapImage(); 

    using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read)) 
    { 
     bitmapImage.DecodePixelWidth = 500; 
     await bitmapImage.SetSourceAsync(stream); 
    } 

    imageHolder.Source = bitmapImage; 
} 

由於我加載圖像的一小部分,我用的是DecodePixelWidth以節約內存。但是,我的觀察結果並不符合預期。

觀察:

  1. 如果我一個40 MB圖像加載到內存中,由應圍繞40 MB(加上任何開銷內存增加)增加對內存的佔用,但應用程序的內存分析說,否則。我看到當加載一張40 MB圖像時,內存拍到320 MB

  2. 如果我使用DecodePixelHeightDecodePixelWidth以節省存儲器,所述存儲器仍然拍攝高達50-80MB(比原始圖像的尺寸大),這取決於DecodePixelHeight/DecodePixelWidth的值。

我希望操作系統明智地使用內存,並在加載圖像時使用最少量的內存。我預計在設置DecodePixelWidth時,操作系統的內存使用量低於40 MB,但看到實際結果時非常驚訝。

有人可以解釋爲什麼在將圖像加載到內存時使用如此大量的內存?這是預期的行爲?我可以做些什麼來節省內存,因爲如果事情是這樣,即使使用DecodePixelWidth,我也無法同時將兩個大圖像加載到內存中,而無法獲得OOM。

連接了剖析屏幕截圖。

  1. 不使用DecodePixelWidth,圖像尺寸40 MB.第一峯是245 MB,第二個峯是327 MB

enter image description here

  • 使用DecodePixelWidth = 500,圖像尺寸40 MB。第一峯88 MB,並持續水平49 MB
  • enter image description here

    回答

    1

    而是通過IRandomAccesStream創建的BitmapImage可以從StorageFile創建壓縮縮略圖的。

    StorageItemThumbnail thumb = file.GetScaledImageAsThumbnailAsync(ThumbnailMode.ListView, 
                        90, 
                        ThumbnailOptions.UseCurrentScale); 
         var bitmap = new BitmapImage(); 
         bitmap.SetSource(thumb); 
    

    這會創建一個比直接從一個流中的普通BitmapImage小得多的BitmapImage。

    此外,如果您需要加載大量圖像,您應該查看虛擬化甚至增量列表。

    +0

    我不想顯示縮略圖;我想加載一個高分辨率的圖像並顯示它。 – Flipper

    +1

    傳遞給該方法的三個值是ThumbnailMode,Requestedsize和ThumbnailOption。我把所需的尺寸設置爲90,因爲我不需要顯示非常大的圖像,只是非常多。但仍然在這個尺寸,他們看起來非常好。我敢打賭,如果你看看這些價值觀,你會得到你所需要的。使用我的應用程序,我可以加載數百個高分辨率圖像,而不會對內存造成任何問題。 – StijnvanGaal