C# - 将(数百个)StorageFiles 设置为 BitmapImages(无流)
C# - Set (hundreds of) StorageFiles as BitmapImages (Without Stream)
我试图从设备的图片库中获取所有照片,然后在应用程序中使用 <GridView/>
和项目模板中的 <Image/>
显示,但我没有找到一种没有问题的方法。
我需要从我得到的 StorageFiles
创建 BitmapImages
。
首先,我尝试创建 BitmapImage
s 并使用文件路径将 UriSource
设置为新的 Uri
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 商店下载它的任何人在完成后使用,因此图像的大小会有所不同,因为 [=40= 的图片库] Phone 设备几乎包含存储在用户 phone 上的所有照片,包括来自设备相机的照片、保存的图像等
绝对没有办法保证您不会 运行 使用上述任何方法内存不足。现实情况是,除非您即时将图像调整为标准尺寸,否则您永远无法真正控制使用的内存量,即使只是可见图像也是如此。
您必须使包含网格虚拟化,以便字节数组仅分配给用户实际可见的图像。
是的,当您滚动时丢弃和创建字节数组时,大多数系统都会有一些延迟,但这是您为能够查看它们而付出的代价 'all'。
综上所述,here 是一个帮助您入门的博客。
我试图从设备的图片库中获取所有照片,然后在应用程序中使用 <GridView/>
和项目模板中的 <Image/>
显示,但我没有找到一种没有问题的方法。
我需要从我得到的 StorageFiles
创建 BitmapImages
。
首先,我尝试创建 BitmapImage
s 并使用文件路径将 UriSource
设置为新的 Uri
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 商店下载它的任何人在完成后使用,因此图像的大小会有所不同,因为 [=40= 的图片库] Phone 设备几乎包含存储在用户 phone 上的所有照片,包括来自设备相机的照片、保存的图像等
绝对没有办法保证您不会 运行 使用上述任何方法内存不足。现实情况是,除非您即时将图像调整为标准尺寸,否则您永远无法真正控制使用的内存量,即使只是可见图像也是如此。
您必须使包含网格虚拟化,以便字节数组仅分配给用户实际可见的图像。
是的,当您滚动时丢弃和创建字节数组时,大多数系统都会有一些延迟,但这是您为能够查看它们而付出的代价 'all'。
综上所述,here 是一个帮助您入门的博客。