locked
сохранение изображений на фотодиск RRS feed

  • Вопрос

  • Добрый день,

    у меня небольшое приложение с картинками.

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

    может сэмпл какой есть

    спасибо.

    28 октября 2013 г. 6:36

Ответы

  • \ <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <!--image which we need to save:-->
                <Image x:Name="img" Source="/Assets/Tiles/FlipCycleTileSmall.png"/>
    
                <!--image which we need load from saved file:-->
                <Image x:Name="img2" Grid.Row="1"/>
                
                <Button Click="Button_Click" Content="click" Grid.Row="2"/>
    
            </Grid>

    private async void Button_Click(object sender, RoutedEventArgs e)
            {
                var writableBitmap = new WriteableBitmap(this.img, null);
    
                using (var stream = new MemoryStream())
                {
                    writableBitmap.SaveJpeg(stream, writableBitmap.PixelWidth, writableBitmap.PixelHeight, 0, 100);
                    var storageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("123", CreationCollisionOption.ReplaceExisting);
                    using (var st = await storageFile.OpenStreamForWriteAsync())
                    {
                        stream.Seek(0, SeekOrigin.Begin);
                        var bytes = stream.GetBuffer();
                        await st.WriteAsync(bytes, 0, bytes.Length);
                        
                    }
                }
    
                var file = await ApplicationData.Current.LocalFolder.GetFileAsync("123");
                using (var fileStream = (await file.OpenAsync(FileAccessMode.Read)).AsStreamForRead())
                {
                    var bitmap = new BitmapImage();
                    bitmap.CreateOptions = BitmapCreateOptions.None;
                    bitmap.SetSource(fileStream);
                    this.img2.Source = bitmap;
                }
            }
    28 октября 2013 г. 8:32
  • Андрей,

    Посмотрите этот гайд: http://www.c-sharpcorner.com/UploadFile/74f20d/using-isolated-storage-to-save-and-read-an-image-in-windows/


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    28 октября 2013 г. 10:45
  • в общем публикую сам ответ на свой вопрос:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
    
    
                MediaLibrary myMediaLibrary = new MediaLibrary();
                Uri myUri = new Uri(@"001.jpg", UriKind.Relative);
    
                System.IO.Stream photoStream = App.GetResourceStream(myUri).Stream;
                byte[] buffer = new byte[photoStream.Length];
    
                photoStream.Read(buffer, 0, Convert.ToInt32(photoStream.Length));
                myMediaLibrary.SavePicture("001.jpg", buffer);
                MessageBox.Show("картинка сохранена");
    
            }
    
        }
    } 
       

    8 ноября 2013 г. 7:48

Все ответы

  • Здравствуйте,

    А в каком формате картинки?


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    28 октября 2013 г. 8:15
  • \ <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <!--image which we need to save:-->
                <Image x:Name="img" Source="/Assets/Tiles/FlipCycleTileSmall.png"/>
    
                <!--image which we need load from saved file:-->
                <Image x:Name="img2" Grid.Row="1"/>
                
                <Button Click="Button_Click" Content="click" Grid.Row="2"/>
    
            </Grid>

    private async void Button_Click(object sender, RoutedEventArgs e)
            {
                var writableBitmap = new WriteableBitmap(this.img, null);
    
                using (var stream = new MemoryStream())
                {
                    writableBitmap.SaveJpeg(stream, writableBitmap.PixelWidth, writableBitmap.PixelHeight, 0, 100);
                    var storageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("123", CreationCollisionOption.ReplaceExisting);
                    using (var st = await storageFile.OpenStreamForWriteAsync())
                    {
                        stream.Seek(0, SeekOrigin.Begin);
                        var bytes = stream.GetBuffer();
                        await st.WriteAsync(bytes, 0, bytes.Length);
                        
                    }
                }
    
                var file = await ApplicationData.Current.LocalFolder.GetFileAsync("123");
                using (var fileStream = (await file.OpenAsync(FileAccessMode.Read)).AsStreamForRead())
                {
                    var bitmap = new BitmapImage();
                    bitmap.CreateOptions = BitmapCreateOptions.None;
                    bitmap.SetSource(fileStream);
                    this.img2.Source = bitmap;
                }
            }
    28 октября 2013 г. 8:32
  • спасибо за оперативный ответ:

    проблемы (VS2012 подчёркивает):

    1. MemoryStream - не удалось найти имя и пространство имён;

    2. Элемент ApplicationData не существует в текущем контексте;

    3. Элемент CreationCollisionOption - не существует в текущем контексте;

    4. Элемент SeekOrigin - не существует в текущем контексте;

    картинки у меня в формате png.

    28 октября 2013 г. 10:27
  • Андрей,

    Посмотрите этот гайд: http://www.c-sharpcorner.com/UploadFile/74f20d/using-isolated-storage-to-save-and-read-an-image-in-windows/


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    28 октября 2013 г. 10:45
  • спасибо за оперативный ответ:

    проблемы (VS2012 подчёркивает):

    1. MemoryStream - не удалось найти имя и пространство имён;

    2. Элемент ApplicationData не существует в текущем контексте;

    3. Элемент CreationCollisionOption - не существует в текущем контексте;

    4. Элемент SeekOrigin - не существует в текущем контексте;

    картинки у меня в формате png.


    Этот код был написан быстренько на чистом созданном проекте вп8 без подключения сторонних библиотек. Так что маловероятна его неработоспособность.


    • Изменено Oleg Kurzov 28 октября 2013 г. 12:45
    28 октября 2013 г. 12:42
  • Здравствуйте, Андрей!

    Если Ваш вопрос решен, то, пожалуйста, пометьте ответы которые Вам помогли.


    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    30 октября 2013 г. 6:19
  • Добрый день,

    к сожалению ни один ответ не помог, поэтому помечать пока нечего.

    создал новый проект, вставил код из ответа выше, но результат (см. приложенные файлы).

    красным подчёркнуто: не существует в текущем контексте.

    7 ноября 2013 г. 6:29
  • какая платформа, wp8 ?
    7 ноября 2013 г. 7:57
  • да..
    7 ноября 2013 г. 9:05
  • using Windows.Storage;
    
    Пробовали добавлять этот немспейс?
    7 ноября 2013 г. 10:18
  • попробовал добавить.

    спасибо, действительно заработало.

    только как то странно: при нажатии кнопки, изображение дублируется на этой же странице (см. снимок с экрана). ни на фотодиске ни в альбомах фотографий, данная картинка не появляется.

    что это? ошибка эмулятора?

    7 ноября 2013 г. 12:02
  • Андрей, Вы бы хоть код посмотрели. Вы ведь просто скопировали код, а там поведение такое, что оно генерирует картинку из первого Image и просто ставляет его во второй, т.к. это как пример использования. Полученную картинку из первого Image Вы можете сохранить в любую папку как StorageFile. Я просто записал в локальное хранилище приложения 

    await ApplicationData.Current.LocalFolder


    Вы же можете записать куда-то в KnownFolders.CameraRoll / KnownFolders.SavedPictures , предварительно включив доступ к папке в манифесте.(ID_CAP_MEDIALIB_PHOTO)

    И еще, если у Вас подчеркивает какие-то типы, то нужно нажимать правой кнопкой на типе, выбрать закладку Исправить и подключить Using. 


    • Изменено Oleg Kurzov 7 ноября 2013 г. 12:39
    7 ноября 2013 г. 12:36
  • Добрый день,

    ну не знаю даже куда записать )

    код: 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Shell;
    using PhoneApp1.Resources;
    using System.Windows.Media.Imaging;
    using System.IO;
    
    using Windows.Storage;
    
    
    
    namespace PhoneApp1
    {
        public partial class MainPage : PhoneApplicationPage
        {
            // Конструктор
            public MainPage()
            {
                InitializeComponent();
             }
    
           private async void Button_Click(object sender, RoutedEventArgs e)
            {
                var writableBitmap = new WriteableBitmap(this.img, null);
    
                using (var stream = new MemoryStream())
                {
                    writableBitmap.SaveJpeg(stream, writableBitmap.PixelWidth, writableBitmap.PixelHeight, 0, 100);
                    var storageFile = await KnownFolders.CameraRoll.CreateFileAsync("123", CreationCollisionOption.ReplaceExisting);
                    using (var st = await storageFile.OpenStreamForWriteAsync())
                    {
                        stream.Seek(0, SeekOrigin.Begin);
                        var bytes = stream.GetBuffer();
                        await st.WriteAsync(bytes, 0, bytes.Length);
                        
                    }
                }
    
                var file = await KnownFolders.CameraRoll.GetFileAsync("123");
                using (var fileStream = (await file.OpenAsync(FileAccessMode.Read)).AsStreamForRead())
                {
                    var bitmap = new BitmapImage();
                    bitmap.CreateOptions = itmapCreateOptions.None;
                    bitmap.SetSource(fileStream);
                    this.img2.Source = bitmap;
                }
            }
          
        }
    }
    не работает (при нажатии кнопки) выполнение приложения останавливается.
    8 ноября 2013 г. 5:25
  • в общем публикую сам ответ на свой вопрос:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
    
    
                MediaLibrary myMediaLibrary = new MediaLibrary();
                Uri myUri = new Uri(@"001.jpg", UriKind.Relative);
    
                System.IO.Stream photoStream = App.GetResourceStream(myUri).Stream;
                byte[] buffer = new byte[photoStream.Length];
    
                photoStream.Read(buffer, 0, Convert.ToInt32(photoStream.Length));
                myMediaLibrary.SavePicture("001.jpg", buffer);
                MessageBox.Show("картинка сохранена");
    
            }
    
        }
    } 
       

    8 ноября 2013 г. 7:48
  • photoStream в using хотя бы оберните.
    8 ноября 2013 г. 8:04