Devs

[Desenvolvimento] Como salvar um arquivo de imagem no sistema de arquivos da APP

Olá pessoal, tudo bom?

A transição entre o Windows Phone 7, 7.5, 8, 8.1 e agora o Windows Phone 10 (também se encaixam aqui as Universal APPs) trouxe mudanças no modo como codificamos alguns recursos para as APPs, sendo um deles, o método para armazenamento de arquivos no StorageFolder (IsolatedStorageFile) da própria aplicação.

Dada essa situação e também para responder a dúvida de um leitor, resolvi escrever esse post que tem por objetivo demonstrar como armazenar um arquivo de imagem no StorageFolder da APP.

PS: O procedimento para armazenar outros tipos de arquivos seria similar a esse

A codificação abaixo parte do pressuposto que você já possui um arquivo de imagem instanciado em um objeto da classe WriteableBitmap e que o mesmo é passado por parâmetro para nosso método que irá persisti-lo no sistema de arquivos da APP. Vejamos:

async private void SaveImage(WriteableBitmap wb)
{
  try
    {
      //Mapeando o sistema de arquivos local da APP
      StorageFolder folder = ApplicationData.Current.LocalFolder;
      //Definindo o diretório dentro sistema de arquivos local que receberá as imagens
      StorageFolder imgFolder = await folder.CreateFolderAsync("Images", CreationCollisionOption.OpenIfExists);
      //Definindo o objeto do arquivo a ser persistido
      StorageFile file = await imgFolder.CreateFileAsync("file_name", CreationCollisionOption.ReplaceExisting);

      //Definindo o tipo do arquivo de imagem
      Guid BitmapEnconderGuid = BitmapEncoder.JpegEncoderId;
      //Gravando o arquivo
      using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
      {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEnconderGuid, stream);

        Stream pixelStream = wb.PixelBuffer.AsStream();
        byte[] pixels = new byte[pixelStream.Length];
        await pixelStream.ReadAsync(pixels, 0, pixels.Length);

        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
             (uint)wb.PixelWidth,
             (uint)wb.PixelHeight,
             96.0,
             96.0,
             pixels);
        await encoder.FlushAsync();
      }

      var dialog = new MessageDialog("Image stored successfully.", "Information");
      await dialog.ShowAsync();
    }
    catch (Exception)
    {
      throw new FileNotFoundException();
    }
}

Abraços,

Eduardo Henrique Rizo (@eduardorizo)

MCP

Post Relacionado: