2012-06-26 60 views
1

我正在使用以下代码来获取wpf中的图像源代码(图像类型为System.Windows.Controls.Image)。我想将这个图像存储到磁盘上,它有原始的扩展名,可以吗?如何将图像保存为具有原始扩展名的磁盘?

System.drawing.image规定保存方法是否有类似于System.windows.controls.image

Image image=new Image(); 
BitmapImage bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.UriSource = new Uri(openFileDlg.FileName); 
bitmap.EndInit();    
image.Source = bitmap;     
+1

有关如何将图像保存到(文件)流的信息,请参见[BitmapEncoder](http://msdn.microsoft.com/en-us/library/ms619208)(和派生类)。 MSDN提供了大量的代码示例。 – Clemens

回答

2

看看和BitmapEncoder类。

下面的实用工具类可以让您保存您的Image作为光栅图形图像,根据所选择的格式:

public static class VisualToImg 
{ 

    static VisualToImg() 
    { 
     DPI = 96; 
     PixelFormat = PixelFormats.Default; 
    } 

    public enum eImageFormat 
    { Bitmap, Png, Gif, Jpeg, Tiff, Wmp } 

    static public bool SaveAs(FrameworkElement element, String filePath, 
     eImageFormat imageFormat) 
    { 
     switch (imageFormat) 
     { 
      case eImageFormat.Bitmap: 
       return SaveUsingEncoder(element, filePath, new BmpBitmapEncoder()); 
      case eImageFormat.Gif: 
       return SaveUsingEncoder(element, filePath, new GifBitmapEncoder()); 
      case eImageFormat.Jpeg: 
       return SaveUsingEncoder(element, filePath, new JpegBitmapEncoder()); 
      case eImageFormat.Png: 
       return SaveUsingEncoder(element, filePath, new PngBitmapEncoder()); 
      case eImageFormat.Tiff: 
       return SaveUsingEncoder(element, filePath, new TiffBitmapEncoder()); 
      case eImageFormat.Wmp: 
       return SaveUsingEncoder(element, filePath, new WmpBitmapEncoder()); 
     } 

     return false; 
    } 

    static public double DPI 
    { get; set; } 

    static public PixelFormat PixelFormat 
    { get; set; } 

    static private bool SaveUsingEncoder(FrameworkElement visual, string filePath, 
     BitmapEncoder encoder) 
    { 
     try 
     { 
      RenderTargetBitmap bmp = new RenderTargetBitmap((int)visual.ActualWidth, 
       (int)visual.ActualHeight, DPI, DPI, PixelFormat); 

      bmp.Render(visual); 
      encoder.Frames.Add(BitmapFrame.Create(bmp)); 

      using (var stream = File.Create(filePath)) 
      { encoder.Save(stream); } 

      return true; 
     } 
     catch (Exception) 
     { return false; } 
    } 

} 

你也可以用它来保存你的Image或任何其他FrameworkElement

VisualToImg.SaveAs(image, "image1.png", VisualToImg.eImageFormat.Png); 
VisualToImg.SaveAs(image, "image2.bmp", VisualToImg.eImageFormat.Bitmap); 
VisualToImg.SaveAs(image, "image3.jpeg", VisualToImg.eImageFormat.Jpeg); 
+0

非常感谢,您的解决方案完美工作。有没有什么办法可以扩展用于图像源的图像文件? – user913359

+0

是的,看看[这](http://stackoverflow.com/a/1397541/995246),或者只是做一个搜索。 – gliderkite

相关问题