2015-02-10 20 views
0

我試圖從設備的圖片庫中獲取所有照片,然後在應用中使用<GridView/><Image/>在其項目模板中顯示,但是我沒有找到解決問題的方法。 我需要從我得到的StorageFiles中創建BitmapImagesC# - 將數百個StorageFiles設置爲BitmapImages(無數據流)

首先我試圖創建BitmapImage S和與文件的路徑設置UriSourceUri S,這樣的:

var picsLib = await KnownFolders.PicturesLibrary.GetFilesAsync(CommonFileQuery.OrderByDate); 
var picsList = new List<BitmapImage>(); 

    foreach (StorageFile pic in picsLib) 
    { 
     var imgSrc = new BitmapImage(); 
     imgSrc.UriSource = new Uri(pic.Path, UriKind.Absolute); 
     picsList.Add(imgSrc); 
    } 

PhotosView.ItemsSource = picsList; 

但圖像顯示不出來。

後,我試圖用流:

var imgSrc = new BitmapImage(); 
var picStream = await pic.OpenReadAsync(); 
imgSrc.SetSource(picStream); 
picsList.Add(imgSrc); 

當然,我得到了System.OutOfMemoryException

接下來,我嘗試使用縮略圖:

var imgSrc = new BitmapImage(); 
var picThumb = await pic.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.PicturesView, 
       200, Windows.Storage.FileProperties.ThumbnailOptions.ResizeThumbnail); 
imgSrc.SetSource(picThumb); 
picsList.Add(imgSrc); 

但我意識到,它就像流,OutOfMemory一次。如果我將其限制爲僅獲取10或20張圖像的縮略圖,則效果不錯,但我確實需要顯示所有照片。

XAML並不是問題,因爲它限制了要加載的圖像數量,因此它的工作正常。

該應用程序旨在供任何在完成後從Windows Phone商店下載的應用程序使用,因此圖像大小各不相同,因爲Windows Phone設備的圖片庫幾乎包含存儲在用戶手機上的任何照片,包括來自設備相機的照片,已保存的圖像等。

+0

您沒有包含任何有關圖像尺寸的信息。我會考慮這種必要的。 – 2015-02-10 23:38:07

+0

@RobertHarvey將此添加到帖子中。 – 2015-02-10 23:56:03

+0

不要在你的帖子中使用「編輯」;這不是一個論壇。我仍然看不到有關您的照片使用多少存儲空間的任何信息;說「圖像的大小各不相同」並沒有告訴我們任何事情。 – 2015-02-10 23:57:43

回答

1

絕對沒有辦法保證您不會用上述任何方法耗盡內存。實際情況是,除非您將圖像大小調整爲標準大小,否則即使僅顯示可見圖像,也無法真正控制您使用的內存量。

您必須使虛擬化的包含網格,以便字節數組只能分配給用戶實際可見的圖像。

是的,當你拋棄並創建字節數組時,大多數系統會有一些延遲,但這是你能夠查看它們'全部'所付出的代價。

所有這一切被說,here是一個博客,以幫助您開始。