Curso Windows Phone – Como converter um objeto StorageFile para um BitmapImage

Segue uma dica para converter um arquivo armazenado localmente no Windows Phone (ou Universal APPs) para um objeto do tipo BitmapImage.

Em primeiro lugar devemos recuperar o arquivo da imagem e armazena-lo em um objeto do tipo StorageFile. Exemplo:

string nomeArquivo = "teste";
//O objeto folder irá representar o "sistema de arquivos" da APP
StorageFolder folder = ApplicationData.Current.LocalFolder;
//O objeto imgFolder irá representar o diretório onde as imagens estão armazenadas
StorageFolder imgFolder = await folder.GetFolderAsync("Images"); //Supondo que os arquivos de imagens fiquem no diretório de nome Images
//O objeto file representa o arquivo da imagem que você está recuperando
StorageFile file = await imgFolder.GetFileAsync(nomeArquivo);
Depois de obter o arquivo e coloca-lo em um objeto do tipo StorageFile, basta fazer a conversão para BitmapImage. Claro que para isso funcionar o arquivo recuperado anteriormente tem que ser do tipo de uma imagem. Exemplo:
//Esse trecho de código é continuação do anterior e o objeto file representa o arquivo recuperado
BitmapImage img = new BitmapImage(new Uri(file.Path, UriKind.Absolute));

Abraços,

Eduardo Henrique Rizo

MCP

Post Relacionado: 

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

4 comentários em “Curso Windows Phone – Como converter um objeto StorageFile para um BitmapImage”

  1. Pingback: Free: Curso Windows Phone – Vários tópicos | Blog do Eduardo H. Rizo

  2. Olá, tenho uma duvida: como eu salvo uma imagem na minha aplicação? Quero colocar uma foto de perfil, mas não sei como fazer isso, eu consigo abrir a galeria de fotos do Windows Phone 8.1 e escolher a imagem, mas não sei como salvar ela no aplicativo e quando voltar carregar esta imagem de novo. Por favor me ajuda, ja procurei em vários lugares.

    Obs: Alguns lugares achei métodos que não funcionam no meu Visual Studio 2013. Por exemplo, o método imagem.Save ou imagem.SaveJpeg.

    Obrigado!

      1. Boa tarde, MUUUITO obrigado pelo post. Mas agora to tendo outro probleminha :/ eu consigo salvar e carregar a imagem, mas quando carrego ela não aparece. Não sei o que acontece mas ela carrega e pelo jeito fica toda preta porque eu consigo clicar nela. Obrigado!

        Segue abaixo meu código:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
        ImagePath = string.Empty;
        FileOpenPicker filePicker = new FileOpenPicker();
        filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        filePicker.ViewMode = PickerViewMode.Thumbnail;

        // Filter to include a sample subset of file types
        filePicker.FileTypeFilter.Clear();
        filePicker.FileTypeFilter.Add(“.bmp”);
        filePicker.FileTypeFilter.Add(“.png”);
        filePicker.FileTypeFilter.Add(“.jpeg”);
        filePicker.FileTypeFilter.Add(“.jpg”);

        filePicker.PickSingleFileAndContinue();
        view.Activated += viewActivated;
        }

        private async void viewActivated(CoreApplicationView sender, IActivatedEventArgs args1)
        {
        FileOpenPickerContinuationEventArgs args = args1 as FileOpenPickerContinuationEventArgs;

        if (args != null)
        {
        if (args.Files.Count == 0) return;

        view.Activated -= viewActivated;
        StorageFile storageFile = args.Files[0];
        var stream = await storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
        var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
        await bitmapImage.SetSourceAsync(stream);
        var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream);

        imagemContato.Source = bitmapImage;

        WriteableBitmap write = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);

        SaveImage(write);

        }
        }

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

        //Definindo tipo de arquivo da imagem
        Guid BitmapEncoderGuid = BitmapEncoder.JpegEncoderId;

        using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoderGuid, stream);

        Stream pixelsStream = wb.PixelBuffer.AsStream();
        byte[] pixels = new byte[pixelsStream.Length];
        await pixelsStream.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(“Imagem salva com sucesso!”, “Informação”);
        await dialog.ShowAsync();
        }
        catch (Exception)
        {

        throw new FileNotFoundException();
        }

        }

        private async void LoadImage()
        {
        string nomeArquivo = “teste”;
        //O objeto folder irá representar o sistema de arquivos da APP
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        //O objeto imgFolder irá representar o diretório da imagem
        StorageFolder imgFolder = await folder.GetFolderAsync(“imagens”);
        //O objeto file representa o arquivo da imagem a ser recuperado
        StorageFile file = await imgFolder.GetFileAsync(nomeArquivo);

        BitmapImage img = new BitmapImage(new Uri(file.Path, UriKind.Absolute));

        imagemContato.Source = img;

        var dialog = new MessageDialog(“Imagem carregada com sucesso!”, “Informação”);
        await dialog.ShowAsync();

        }

Deixe um comentário