如何将ID2D1Bitmap转换为ImageSource

时间:2016-11-11 21:48:27

标签: c++ wpf bitmap direct2d

我正在使用Direct2D渲染目标,我有一个ID2D1Bitmap类型的对象。我需要在WPF窗口中显示此位图,我想将此位图托管到Image控件中。为了做到这一点,解决方案可以是将ID2D1Bitmap对象转换为System::Windows::Media::ImageSource对象,或者将位图保存到可以在之后加载的文件中。

我试图寻找不同的方法,但没有任何结果,因为Direct2D API不提供任何解决方案AFAIK。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

我发现WPF和UWP应用程序的最佳解决方案是SharpDX。请参阅SharpDX website

我曾尝试过使用D2DWrappers(see the Microsoft site),但在我的UWP开发中,我发现SharpDX代码更易于使用。我认为WPF也是如此,因为它也是C#代码。

答案 1 :(得分:0)

Direct2D位图是与硬件设备相关的资源,通常不容易从系统的CPU端访问。因此难以获得ID2D1Bitmap的像素,它既不是设计也不是以这种方式使用。从Direct2D位图获取原始字节的任何机制通常都是通过从中创建WIC位图来访问字节流。这样您就可以将其写入文件甚至是字节数组,并使用一些互操作来在C#中访问它。如果要将其写入文件并在WPF中读取它,此机制将起作用。如果在处理期间的某个时间有IWICBitmapSource对象中的位图数据,并且可以缓存它,则作业会更容易。 此处将System.Drawing.Bitmap转换为System.Windows.Media.ImageSourceConverting Bitmap to ImageSource(感谢@MSL在评论中指出了上述答案)。

此时,您使用它的方式有点不清楚,有关预期用途或简短样本的更多信息在这里会有所帮助。

编辑1: 看一下这个SO Qn:Save ID2D1Bitmap to file以及将ID2D1Bitmap保存到文件中的代码版本的注释。它基本上转换为IWICBitmap并将其写入文件。在此步骤中,由于IWICBitmap继承自IWICBitmapSource,您甚至可以使用CopyPixels()方法将位图数据转储到字节数组中,如果您愿意这样做。

现在,如果您要将其保存到文件中,那么获取System.Drawing.Bitmap就像这样简单:

bitmap = new Bitmap("<YOUR_BITMAP_FILENAME>")

您可以将其转换为BitmapImage,以便在WPF中使用:

using(MemoryStream memstream = new MemoryStream())
{
    bitmap.Save(memstream, ImageFormat.Bmp);
    memstream.Position = 0;
    BitmapImage bitmapImage = new BitmapImage();
    bitmapImage.BeginInit();
    bitmapImage.StreamSource = memstream;
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    bitmapImage.EndInit();
}
相关问题