C# - 将数百个StorageFiles设置为BitmapImages(无数据流)

问题描述:

我试图从设备的图片库中获取所有照片,然后在应用中使用<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

绝对没有办法保证您不会用上述任何方法耗尽内存。实际情况是,除非您将图像大小调整为标准大小,否则即使仅显示可见图像,也无法真正控制您使用的内存量。

您必须使虚拟化的包含网格,以便字节数组只能分配给用户实际可见的图像。

是的,当你抛弃并创建字节数组时,大多数系统会有一些延迟,但这是你能够查看它们'全部'所付出的代价。

所有这一切被说,here是一个博客,以帮助您开始。