#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 и хотите знать, как сохранить холст, тогда вам нужно либо преобразовать холст в изображение, либо, если вы хотите сохранить рисунок, попросите пользователя рисовать непосредственно на изображении, а не на холсте, поместив пустое изображение (с альфа-каналом) на холст, затем используя событие перемещения мыши, чтобы добавить метки кисти к изображению. Таким образом, изменяя как отображение, так и будущий ввод для метода сохранения.