0

我正在尝试从设备的图片库中获取所有照片,然后使用<GridView/>带有<Image/>内部项目模板的应用程序显示,但我没有找到没有问题的方法。我需要BitmapImagesStorageFiles我得到的东西中创建。

首先,我尝试创建s 并将文件路径BitmapImage设置UriSource为新的 s,如下所示:Uri

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 设备的图片库包含存储在用户手机上的几乎所有照片,包括来自设备的相机、保存的图像等。

4

1 回答 1

1

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

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

是的,当您滚动字节数组被丢弃和创建时,大多数系统都会有一些滞后,但这是您能够“全部”查看它们所付出的代价。

综上所述,这里有一个博客可以帮助您入门。

于 2015-02-11T00:28:46.883 回答