保存图像

本文关键字:图像 保存 | 更新日期: 2023-09-27 17:56:43

我正在为Windows Phone制作一个C#绘图程序。

这是针对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的文本文件,这似乎是做一些相对简单的事情的很多工作。 您可以将整个部分替换为以下内容:

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的示例,该示例表明您可以仅将图像变量替换为canvas元素:

WriteableBitmap wbmp = new WriteableBitmap(yourCanvas, null);

本文还指出,画布的背景将被忽略并替换为黑色图像,但您可以通过首先向画布添加一个具有所需背景的矩形来克服此问题。 同样,我没有尝试过这个。 如果这不起作用,您应该考虑发布另一个专门与将画布转换为图像相关的问题,因为这实际上与您关于保存图像的原始问题是一个单独的问题。

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