如何通过 WPF 中的 SaveFileDialog 保存 BitmapImage?

Posted

技术标签:

【中文标题】如何通过 WPF 中的 SaveFileDialog 保存 BitmapImage?【英文标题】:How to save BitmapImage via SaveFileDialog from WPF? 【发布时间】:2011-11-16 13:34:57 【问题描述】:

我尝试通过标准 Windows.Forms 实现它的方式(以获取有效的 DialogResult.OK)

            System.Windows.Forms.SaveFileDialog dlg = new System.Windows.Forms.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
           // dlg.DefaultExt = ".jpg"; // Default file extension
            dlg.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
            if(dlg.ShowDialog()== System.Windows.Forms.DialogResult.OK) 
if (dlg.DialogResult.HasValue && splashDialog.DialogResult.Value)
            
              string fName = dlg.FileName; 
              if (dlg.FileName != "")
              
                 System.IO.Stream fileStream = (System.IO.FileStream)dlg.OpenFile(); 

                  fileStream.Close();
               
             

这是使用 Windows 窗体,但它保存空白图像((

【问题讨论】:

你只是打开和关闭文件,你从来没有在其中写入图像...... 【参考方案1】:

你可以这样做:

var encoder = new JpegBitmapEncoder(); // Or PngBitmapEncoder, or whichever encoder you want
encoder.Frames.Add(BitmapFrame.Create(yourImage));
using (var stream = dlg.OpenFile())

    encoder.Save(stream);

顺便说一句,WPF 中也有一个SaveFileDialog,你不必使用 Windows 窗体中的那个

【讨论】:

只需使用Microsoft.Win32.SaveFileDialog 而不是System.Windows.Forms.SaveFileDialog【参考方案2】:

对于 WPF 代码将是这样的:

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "Document";             
dlg.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
if (dlg.ShowDialog() == true)

    var encoder = new JpegBitmapEncoder(); // Or PngBitmapEncoder, or whichever encoder you want
    encoder.Frames.Add(BitmapFrame.Create(bi));
    using (var stream = dlg.OpenFile())
    
         encoder.Save(stream);
    

这里 bi 是 BitmapImage

【讨论】:

以上是关于如何通过 WPF 中的 SaveFileDialog 保存 BitmapImage?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过行和列索引以编程方式访问 WPF Grid 中的控件?

如何通过单击另一个列表视图 WPF 中的元素来刷新列表视图

如何通过XAML,WPF中的数据绑定设置VisualState INITIALIZATION

WPF - 如何强制命令通过其 CommandBindings 重新评估“CanExecute”

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?

如何通过拖动扩展的窗口框架使 WPF 窗口可移动?