如何在WPF C#中将内存中的BitmapImage保存到文件中?

17

我找不到任何关于这个问题的信息,需要一些帮助。我已经将一堆图像加载到内存中作为BitmapImage类型,以便可以删除它们存储的临时目录。我已经成功完成了这部分内容。现在我需要将这些图像保存到另一个临时位置,但我无法弄清楚如何做到这一点。这些图像包含在一个中:

Dictionary<string, BitmapImage>

这个字符串是文件名。我该如何将此集合保存到新的临时位置?感谢任何帮助!


你为什么不直接移动文件呢?如果在将数据写回磁盘之前服务器或程序崩溃,那么数据将会丢失。如果你只是使用IO来移动文件,那么就没有数据丢失的风险(实际上)。 - Tony Hinkle
是的,我有一种不同的处理恢复的方法,我打算实现。当用户加载我的应用程序的项目文件(一个zip文件)时,它会将所有内容解压到临时目录中,将文件加载到内存中,然后清理该临时目录。然后,程序将定期自动保存项目备份文件。当用户想要保存他们的项目时,我想将所有这些内存资源卸载到临时目录中,将其打包为项目文件,保存到用户位置,然后删除临时目录。我只需要弄清楚如何从内存中保存。 - Chris
你是将图像加载到内存中,还是也在UI中显示它们?如果不显示它们,则无需创建BitmapImages,可以将二进制文件内容简单地存储为字节数组。无论如何,将BitmapImage保存到文件是通过BitmapEncoder完成的,例如PngBitmapEncoder。 - Clemens
我会查看一下。是的,我会在用户界面中显示这些图片。 - Chris
1个回答

46
您需要使用编码器来保存图像。以下代码将获取图像并将其保存:
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));

using (var fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
{
    encoder.Save(fileStream);
}

我通常会将这个函数写成扩展方法,因为它是图像处理/操作应用程序中非常常见的函数,例如:

public static void Save(this BitmapImage image, string filePath)
{
    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(image));

    using (var fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
    {
        encoder.Save(fileStream);
    }
}

这样,您可以直接从BitmapImage对象的实例中调用它。


1
谢谢!那个解决方案非常优雅,而且运行得很好! - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接