我正在使用Direct2D
渲染目标,我有一个ID2D1Bitmap
类型的对象。我需要在WPF
窗口中显示此位图,我想将此位图托管到Image
控件中。为了做到这一点,解决方案可以是将ID2D1Bitmap
对象转换为System::Windows::Media::ImageSource
对象,或者将位图保存到可以在之后加载的文件中。
我试图寻找不同的方法,但没有任何结果,因为Direct2D API不提供任何解决方案AFAIK。
有没有办法做到这一点?
答案 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.ImageSource
:Converting 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();
}