如何从Drawing.Image创建Media.ImageSource?

时间:2018-03-05 22:46:16

标签: c# .net wpf winforms

我想在Media.DrawingContext上渲染裁剪的图像。我想到了DrawingContext.DrawDrawing(Media.Drawing)方法,因为作为Media.Drawing,我会传递Media.Drawing.ImageDrawing,因为它的构造函数ImageDrawing(Media.ImageSource, Rect)允许选择ImageSource的一部分。

我的原始图片加载在Drawing.Image中(如果需要,可以从其他类加载)。所以我想将Drawing.Image转换为Media.ImageSource

我研究了Media.ImageSource的派生类,但我在Media.DrawingImageMedia.Imaging.BitmapSource都没有找到任何内容。

感谢您的回答!

1 个答案:

答案 0 :(得分:1)

这更像是黑客而不是直接转换:但它应该给出相同的结果:

基本上:

  • 将图像保存为流
  • 快退小溪
  • 告诉Wpf图像使用流作为其流源

这是一个可以做到这一点的课程:

using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace StackCsWpf
{
    public class ImageUtils
    {
        public static ImageSource ToImageSource(System.Drawing.Image image, ImageFormat imageFormat)
        {
            BitmapImage bitmap = new BitmapImage();

            using (MemoryStream stream = new MemoryStream())
            {
                // Save to the stream
                image.Save(stream, imageFormat);

                // Rewind the stream
                stream.Seek(0, SeekOrigin.Begin);

                // Tell the WPF BitmapImage to use this stream
                bitmap.BeginInit();
                bitmap.StreamSource = stream;
                bitmap.CacheOption = BitmapCacheOption.OnLoad;
                bitmap.EndInit();
            }

            return bitmap;
        }
    }
}

现在我可以使用上面的方法在Wpf图像组件中显示图像。

/// <summary>
/// Logique d'interaction pour MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        System.Drawing.Image winFormImg = System.Drawing.Image.FromFile("leaves.jpg");
        Image1.Source = ImageUtils.ToImageSource(winFormImg, ImageFormat.Jpeg);
    }
}

Image1是一个简单的Wpf Image组件,我将其从工具箱拖到我的Wpf App主窗口的网格中。

很好地呈现:

image conversion

参考:Msdn forums