2015-02-10 4 views
0

Я пытаюсь получить все фотографии из библиотеки изображений устройства и показать затем приложение, используя <GridView/> с внутри его шаблона элемента, но я не нашел способ сделать это без проблем. Мне нужно создать BitmapImages из StorageFiles, который я получаю.C# - Set (сотни) StorageFiles как BitmapImages (без потока)

Сначала я попытался создать в BitmapImage с и установив 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 Store по завершении, поэтому размер изображений зависит от того, как библиотека изображений на устройствах Windows Phone содержит практически любые фотографии, хранящиеся на телефоне пользователя, включая фотографии с камеры устройства, сохраненные изображения и т. д.

+0

У вас нет никакой информации о размере изображения. Я бы счел это необходимым. –

+0

@RobertHarvey Добавил это в сообщение. –

+0

Не используйте «EDIT» в своих сообщениях; это не форум. Я все еще не вижу никакой информации о том, сколько хранилищ используют ваши фотографии; говоря, что «размер изображений меняется» не говорит нам ничего. –

ответ

1

Нет абсолютно никакого способа гарантировать, что вы не исчерпаете память ни с одним из вышеуказанных подходов. И реальность такова, что, если вы не изменяете размеры изображений «на лету» до стандартного размера, вы никогда не сможете контролировать, сколько памяти вы используете, даже для только видимых изображений.

Вы ДОЛЖНЫ сделать виртуализованную сетку сетью так, чтобы массив байтов был выделен только для изображений, которые на самом деле видны пользователю.

Да, в большинстве систем будет некоторое отставание, так как вы прокручиваете, поскольку массивы байтов отбрасываются и создаются, но это цена, которую вы платите за возможность просмотреть их «все».

Все это, как говорится, here - это блог, который поможет вам начать работу.

 Смежные вопросы

  • Нет связанных вопросов^_^