Сохранение изображения

#c# #visual-studio #visual-studio-2010 #windows-phone-7 #canvas

#c# #visual-studio #visual-studio-2010 #windows-phone-7 #холст

Вопрос:

Я создаю программу для рисования на C # для Windows Phone.

Это для Windows Phone, поэтому не работает куча вещей, которые работали бы на C #.

В начале открытия страницы .XAML у меня есть пустой холст. Пользователь рисует на холсте, затем нажимает Сохранить. Когда он / она нажимает Сохранить, я хочу, чтобы программа могла сохранять изображение на холсте.

На данный момент у меня есть следующий код:

         IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
        StreamReader sr = null;

        sr = new StreamReader(new IsolatedStorageFileStream("Data\imagenum.txt", FileMode.Open, isf));
        test = sr.ReadLine();
        sr.Close();

        int.TryParse(test, out test2);

        test2 = test2   1;

        IsolatedStorageFile isf2 = IsolatedStorageFile.GetUserStoreForApplication();
        isf2.CreateDirectory("Data");
        StreamWriter sw = new StreamWriter(new IsolatedStorageFileStream("Data\imagenum.txt", FileMode.Create, isf2));
        sw.WriteLine(test2);
        //This writes the content of textBox1 to the StreamWriter. The StreamWriter writes the text to the file.
        sw.Close();
  

Этот код определяет, каким было бы подходящее имя для изображения.

Я также нашел различные другие фрагменты кода в Интернете:

             // Construct a bitmap from the button image resource.
        test = "Images/"   test   ".jpg";
        using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            WriteableBitmap bmImage = new WriteableBitmap(image);
            if (!store.DirectoryExists("Images"))
            {
                store.CreateDirectory("Images");
            }
            using (IsolatedStorageFileStream isoStream =
            store.OpenFile(@"Images"   test   ".jpg", FileMode.OpenOrCreate))
            {
                Extensions.SaveJpeg(
                bmImage,
                isoStream,
                bmImage.PixelWidth,
                bmImage.PixelHeight,
                0,
                100);
            }
        }
  

Вышесказанное представляет собой уродливую путаницу кода из руководств по MSDN и моего собственного, плохо скомпонованного кода.

(Это не работает по полуочевидным причинам)

Как бы мне сохранить холст в IsolatedStorage в виде изображения?

Комментарии:

1. @Mitch: Спасибо. Теперь добавляю вопрос…

Ответ №1:

Ваш первый раздел, где вы, кажется, записываете последнее используемое число в текстовый файл в IsolatedStorage , кажется, требует много работы, чтобы сделать что-то относительно простое. Вы можете заменить весь этот раздел этим:

 IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
int imageNumber = 0;
settings.TryGetValue<int>("PreviousImageNumber", out imageNumber);
imageNumber  ;
  

Вы можете сохранить изображение в IsolatedStorage таком виде:

 using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (!isf.DirectoryExists("Images"))
    {
        isf.CreateDirectory("Images");
    }
    IsolatedStorageFileStream fstream = isf.CreateFile(string.Format("Images\{0}.jpg",imageNumber));

    WriteableBitmap wbmp = new WriteableBitmap(image);
    Extensions.SaveJpeg(wbmp, fstream, wbmp.PixelWidth, wbmp.PixelHeight, 0, 100);
    fstream.Close();
}
  

Но, вероятно, было бы разумнее сохранить изображение в их MediaLibrary виде следующим образом:

 MediaLibrary library = new MediaLibrary();
WriteableBitmap wbmp = new WriteableBitmap(image);

MemoryStream ms = new MemoryStream();
Extensions.SaveJpeg(wbmp, ms, wbmp.PixelWidth, wbmp.PixelHeight, 0, 100);
ms.Seek(0, SeekOrigin.Begin);
library.SavePicture(string.Format("Images\{0}.jpg",imageNumber), ms);
  

В любом случае, вы можете затем сохранить imageNumber обратно в IsolatedStorageSettings вот так:

 settings["PreviousImageNumber"] = imageNumber;
settings.Save();
  

Я предполагал, что image используемое выше значение было установлено где-то еще в вашем коде. Я раньше не сохранял холст в изображение, но после быстрого поиска появился этот блог, где приведен пример использования WriteableBitmap, который указывает, что вы можете просто заменить переменную image своим элементом canvas:

 WriteableBitmap wbmp = new WriteableBitmap(yourCanvas, null);
  

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

Комментарии:

1. Небольшое изменение: string.format должно быть String.Format .

2. @JavaAndCSharp Я обновил код для использования string.Format , я просто вводил код непосредственно в ответе и пропустил этот. Сработало ли это у вас?

3. строка. Формат сработал (VS не выдает мне ошибку), но я не знаю, как установить значение растрового изображения. Может быть, с чем-то вроде этого: image.SetSource(myPaintingCanvas);

4. @JavaAndCSharp string.Format — правильный синтаксис. Я обновил свой вопрос возможным решением для извлечения изображения из вашего объекта Canvas, пожалуйста, дайте мне знать, если это сработает.

5. Сработало великолепно. Спасибо! Всегда поражался тому, как быстро и точно на этом сайте получают ответы на вопросы.

Ответ №2:

Если вы можете сохранить записываемое изображение с помощью CE и хотите знать, как сохранить холст, тогда вам нужно либо преобразовать холст в изображение, либо, если вы хотите сохранить рисунок, попросите пользователя рисовать непосредственно на изображении, а не на холсте, поместив пустое изображение (с альфа-каналом) на холст, затем используя событие перемещения мыши, чтобы добавить метки кисти к изображению. Таким образом, изменяя как отображение, так и будущий ввод для метода сохранения.