【问题标题】:How to convert a ID2D1Bitmap into a ImageSource如何将 ID2D1Bitmap 转换为 ImageSource
【发布时间】:2017-03-26 04:51:19
【问题描述】:

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

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

有什么办法吗?

【问题讨论】:

标签: c++ wpf bitmap direct2d


【解决方案1】:

我为 WPF 和 UWP 应用找到的最佳解决方案是 SharpDX。请参阅SharpDX website

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

【讨论】:

    【解决方案2】:

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

    在这一点上,您使用它的方式有点不清楚,更多关于预期用途的信息或简短的示例会在这里真正有所帮助。

    编辑 1: 看看这个 SO Qn:Save ID2D1Bitmap to file 和 cmets 以获取将 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();
    }
    

    【讨论】:

    • 如何从 ID2D1Bitmap 源创建 WIC 位图以访问其字节流?此外,解释如何从 WIC 位图源获取 Drawing.Bitmap 也会很有用。
    • 我看到了您的编辑,但是当我执行代码时,我在 wic 渲染目标中收到 D2DERR_WRONG_RESOURCE_DOMAIN 错误(当我绘制位图时)。
    • 尝试使用 rtProps.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE; rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE;
    • 您是否对源 ID2D1RenderTarget 和目标 WIC RenderTarget 使用上述相同的设置?我想这是需要的。默认设置不起作用。
    • 源渲染目标是 ID2D1DeviceContext1 创建为 D2DDevice-&gt;CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, &amp;d2dContext)
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多