如何将图像保存到原始扩展名的磁盘?

时间:2012-06-26 07:42:15

标签: c# wpf

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

System.drawing.imageSystem.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 个答案:

答案 0 :(得分:2)

查看RenderTargetBitmapBitmapEncoder课程。

以下实用工具类允许您根据所选格式将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);