如何将WPF的BitmapSource图像保存到文件中?

43
2个回答

86

你需要使用编码器(BitmapEncoder 的子类)。例如,若要将其保存为PNG格式,可以像下面这样进行:

public static void SaveClipboardImageToFile(string filePath)
{
    var image = Clipboard.GetImage();
    using (var fileStream = new FileStream(filePath, FileMode.Create))
    {
        BitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(image));
        encoder.Save(fileStream);
    }
}

顺便提一下,注意Clipboard.GetImage存在一个错误。如果你只是将图像保存到文件中,则不应该有任何问题,但如果你想要显示它,那么这会是一个问题。


编辑:上述提到的错误似乎在4.0中已经修复了。


1
这段代码在我的机器上无法编译。BitmapFrame.Create的参数应该是URI或流,而不是图像:\ - Ignacio Soler Garcia
@IgnacioSolerGarcia 这个方法在WPF中确实存在:https://msdn.microsoft.com/zh-cn/library/ms615993(v=vs.110).aspx。您正在制作什么类型的应用程序? - Thomas Levesque
你说得对,抱歉。我用WinForms做了一个快速的概念验证应用程序。 - Ignacio Soler Garcia
当保存的请求来自不同的线程时,这种方法无法正常工作。 - Bernhard Hiller

2
这解决了你遇到的BitmapFrame.Create问题。
public static void SaveClipboardImageToFile(string filePath)
{
    //var image = Clipboard.GetImage();
    BitmapSource image = (BitmapSource)Clipboard.GetImage();
    using (var fileStream = new FileStream(filePath, FileMode.Create))
    {
        BitmapEncoder encoder = new PngBitmapEncoder();
        //encoder.Frames.Add(BitmapFrame.Create(image));
        encoder.Frames.Add(BitmapFrame.Create(image As BitmapSource));
        encoder.Save(fileStream);
    }
}

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