Статьи

Как создать папку в библиотеке изображений Windows Phone 8.1 (и сохранять / читать файлы в нее / из нее)

Некоторые из вас, возможно, заметили, что  UniShare  имеет свою собственную папку в библиотеке изображений вашего устройства. Также есть некоторые другие приложения, такие как WhatsApp или Tweetium. Преимущества собственной папки вашего приложения очевидны:

  • проще загружать изображения в ваше приложение
  • пользователь всегда может отразить, какие картинки приходят из вашего приложения
  • другое присутствие вашего приложения в ОС
  • более высокая частота запоминания вашего приложения на сайте пользователя (что приводит к более частому использованию вашего приложения)

Этот пост покажет вам, как легко создать папку в библиотеке изображений, а также сохранять и читать файлы в / из этой папки.

подготовка

Во-первых, вам нужно добавить это с помощью операторов в ваше приложение:

using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;

Затем добавьте возможности библиотеки изображений в Package.appmanifest вашего приложения.

образ

Если у вас есть приложение 8.1 Silverlight, вам нужно добавить его как в Package.appmanifest, так и в WMAppManifest.xml:

образ

Тогда мы уже можем сгенерировать нашу папку с помощью одной строки кода (считается как для Silverlight, так и для приложений времени выполнения):

StorageFolder appFolder= await KnownFolders.PicturesLibrary.CreateFolderAsync("myCustomAppFolder", CreationCollisionOption.OpenIfExists);

Вы всегда должны использовать метод CreateFolderAsync вместе с CollisionOption ‘OpenIfExists’. Таким образом, ваше приложение будет открывать его каждый раз, когда вы собираетесь сохранить файл, но создает папку, если она еще не существует. Если вы сейчас перейдете в свою библиотеку изображений, вы еще не увидите свою папку, хотя она там есть (используйте приложение «Диспетчер файлов»,  чтобы проверить ее, если хотите). Папки заполняются только тогда, когда у них есть контент. Это то, что следующий шаг.

Сохранить файл изображения

Сохранение изображения также довольно просто. Сначала мы создаем StorageFile в нашей папке:

StorageFile myfile= await appFolder.CreateFileAsync("myfile.jpg", CreationCollisionOption.ReplaceExisting);

Это создает файл-контейнер, в который мы можем записать наше изображение. Чтобы сохранить изображение, мы собираемся асинхронно записать в него поток нашего изображения:

//asuming we have an Image control, replace this with your local code
var img = myImage.Source as WriteableBitmap;
//get fresh drawn image 
img.Invalidate();

using (Stream stream = await myfile.OpenStreamForWriteAsync())
{
   img.SaveJpeg(stream, img.PixelWidth, img.PixelHeight, 0, 100);
}

Этот код работает как для приложений Windows Phone 8.1 Silverlight, так и для приложений времени выполнения. Если вы сейчас перейдете в свою библиотеку изображений, вы увидите папку вашего приложения, а также ваше сохраненное изображение. Довольно легко, правда?

Читайте изображения из папки нашего приложения

Чтение файла изображения также довольно просто. Вот код:

//open the picture library
StorageFolder libfolder = KnownFolders.PicturesLibrary;
//get all folders first
IReadOnlyList<StorageFolder> folderList = await libfolder.GetFoldersAsync();
//select our app's folder
var appfolder = folderList.FirstOrDefault(f => f.Name.Contains("myCustomAppFolder"));
//get the desired file (assuming you know the file name)
StorageFile picfile = await appPicturesFolder.GetFileAsync("myfile.jpg");
//generate a stream from the StorageFile
var stream = await picfile.OpenAsync(FileAccessMode.Read);
//generate a new image and set the source to our stream
BitmapImage img = new BitmapImage();
img.SetSource(stream);

//todo: work with the image

Чтобы получить нашу сгенерированную папку, нам нужно получить список папок в библиотеке, используя метод StorageFolder.GetFoldersAsync (). Затем мы запрашиваем этот список для папки нашего приложения. Если вы хотите получить список всех изображений в вашей папке, вы можете использовать метод  StorageFile.GetFilesAsync ()  . То, что я сделал выше, это загрузил наш сохраненный файл. Наконец, я открыл поток из этого файла и назначил его новому BitmapImage, который можно использовать в нашем приложении.

Есть также много других опций, которые можно сделать с этими папками и файлами, это очень распространенный сценарий.

Как всегда, я надеюсь, что этот пост будет полезен для некоторых из вас.