保存图像

时间:2011-05-17 02:47:41

标签: c# visual-studio visual-studio-2010 windows-phone-7 canvas

我正在 C#for Windows Phone中制作绘图程序。

这适用于Windows Phone ,所以一堆东西在C#中不起作用。

在打开.XAML页面的开始,我有一个空白的画布。用户绘制Canvas,然后单击Save。当他/她单击“保存”时,我希望程序能够将图像保存在“画布”上。

到目前为止,我有以下代码:

        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?

2 个答案:

答案 0 :(得分:4)

您的第一部分似乎是将最后使用过的数字写入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已设置在代码中的其他位置。我之前没有将Canvas保存到图像中,但是一些快速搜索出现了这个blog,其中使用WriteableBitmap给出了一个示例,表明您可以用canvas元素替换图像变量:

WriteableBitmap wbmp = new WriteableBitmap(yourCanvas, null);

文章还指出Canvas的背景将被忽略并替换为黑色图像,但您可以通过首先向Canvas添加一个矩形以及任何您想要的背景来克服这一点。再一次,我还没试过这个。如果这不起作用,您应该考虑发布另一个与将Canvas转换为图像有关的问题,因为这与您关于保存图像的原始问题实际上是一个单独的问题。

答案 1 :(得分:0)

如果您可以使用CE保存可写图像并想知道如何保存画布, 然后你需要渲染画布到图像或者如果你想保存绘图,然后让用户通过在画布上放置空白图像(带有alpha通道)直接绘制到图像而不是画布,然后使用鼠标移动事件添加画笔标记到图片。因此修改显示和将来输入以保存方法。