Как сохранить BitmapImage через SaveFileDialog из WPF?

То, как я пытаюсь реализовать это через стандартные 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, но сохраняет пустое изображение ((


person curiousity    schedule 16.11.2011    source источник
comment
Вы просто открываете и закрываете файл, вы никогда не записываете в него изображение...   -  person Thomas Levesque    schedule 16.11.2011


Ответы (2)


Вы можете сделать что-то вроде этого:

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, вам не обязательно использовать SaveFileDialog из Windows Forms

person Thomas Levesque    schedule 16.11.2011
comment
Просто используйте Microsoft.Win32.SaveFileDialog вместо System.Windows.Forms.SaveFileDialog - person Thomas Levesque; 16.11.2011

Для кода 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

person agileDev    schedule 07.02.2017