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

C# - Set (hundreds of) StorageFiles as BitmapImages (Without Stream)

我试图从设备的图片库中获取所有照片,然后在应用程序中使用 <GridView/> 和项目模板中的 <Image/> 显示,但我没有找到一种没有问题的方法。 我需要从我得到的 StorageFiles 创建 BitmapImages

首先,我尝试创建 BitmapImages 并使用文件路径将 UriSource 设置为新的 Uris,如下所示:

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 商店下载它的任何人在完成后使用,因此图像的大小会有所不同,因为 [=40= 的图片库] Phone 设备几乎包含存储在用户 phone 上的所有照片,包括来自设备相机的照片、保存的图像等

绝对没有办法保证您不会 运行 使用上述任何方法内存不足。现实情况是,除非您即时将图像调整为标准尺寸,否则您永远无法真正控制使用的内存量,即使只是可见图像也是如此。

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

是的,当您滚动时丢弃和创建字节数组时,大多数系统都会有一些延迟,但这是您为能够查看它们而付出的代价 'all'。

综上所述,here 是一个帮助您入门的博客。