【问题标题】:Windows Imaging Component - Direct2D C++ - Drawing, SavingWindows 映像组件 - Direct2D C++ - 绘图、保存
【发布时间】:2014-10-05 13:47:36
【问题描述】:

使用 Windows 图像组件 (WIC),我想为我的 Windows 桌面应用程序执行以下操作(Direct2D/C++ with Windows 7 SP1 - Visual Studio 2013)

  1. 选择任何类型的 RenderTarget(Direct2D Hwnd/Bitmap/WICBitmap - 等)用于绘图

  2. 创建一个空位图(D2D1Bitmap 或 IWICBitmap - 以适用者为准)

  3. 开始绘制 - 填充颜色,绘制一些线条和椭圆 - 结束绘制 ==>(全部在位图中)

  4. 在某个时间点,我需要 将位图中绘制的内容作为图像保存在我的电脑中

  5. 将位图放置在 x1,y1(左上角 - xy 坐标)和 x2,y2 (右下角 - xy 坐标)渲染目标。因为 窗口的其余空间将由工具栏使用。

如何使用 C++/Direct2D 实现这一点?

我的功能的 GDI+ 代码:

Bitmap* pBmp = NULL; //create null or empty bitmap
Graphics* pGrBuf = NULL; //initialise graphics to null

pBmp = new Bitmap((INT)rectClient.Width, (INT)rectClient.Height);
pGrBuf = new Graphics(pBmp);

在这个图形上,我总是可以画线、矩形等。

pGrBuf.DrawRectangle(....)
pGrBuf.DrawLine(...)

最后,为了达到第 5 点

//leave some space (30, 30 in xy co-ordinates) for putting the toolbox in the top
pGrBuf.DrawImage(m_pBmp, 30.0f, 30.0f);

特意省略了第 4 点的代码。

【问题讨论】:

    标签: c++ windows graphics bitmap direct2d


    【解决方案1】:

    这个问题有一个简单、明确的答案,但是您应该(重新)考虑一些细节。

    Direct2D 不是万能的框架,它可以轻易地超越其他框架。目前还不是很清楚您的绘图是关于什么以及它们的目的是什么,但在某些情况下 Direct2D 的使用不是很合适。如果将 GDI(+) 替换为 D2D,您的一些痛苦将是:

    • (官方)有限的操作系统支持,取决于 DirectX 版本和/或您将使用的功能。您将不得不忘记 Windows XP、(很可能)Windows Vista 和(不太可能)Windows 7
    • 性能(与 GDI+、GDI 相比)并不总是更好。主要看你使用D2D的方式和目的。在某些情况下,D2D 的性能很差(通常是错误的用法或误解的概念)。

    而且,Direct2D 可以提供的优势数不胜数。

    粗略地说,Direct2D 只不过是 Direct3D 的一个包装器。它是随 DirectX 10 引入的,其用法与 GDI(+) 非常相似。但是在 DirectX 11(1) 中,Direct2D 的“原则”发生了变化,现在它更像 D3D。它添加了另一种方法并删除了旧方法。一开始可能会有点混乱。令人困惑的是,网络上的所有教程、文章和任何 D2D 资源(包括 MSDN)都在 D2D 版本之间混在一起。其中一些是针对旧版本的,推荐一种东西(方法),另一些描述新版本。

    无论如何,我推荐新版本——即 Direct2D 11.1。

    你的问题...

    1. “RenderTarget”是来自“旧”D2D 的概念。新的是一个 DeviceContext
    2. DeviceContext 有一个可以是 D2D1Bitmap(1) 的目标 - 屏幕外的一个,交换链的后台缓冲区。
    3. 最典型的绘图方法是在 DeviceContext.BeginScene --- DeviceContext.EndScene 块中调用绘图函数。绘图功能与 GDI(+) 非常相似。
    4. 有几种方法可以做到这一点。您可以在 WIC 的帮助下完成。您还可以将 D2D1Bitmap 数据复制到 DIBBitmap,甚至可以(重新)在 GDI 上下文中绘制它。
    5. 有一个函数DeviceContext.DrawImage,但你将如何做到这一点取决于很多事情。例如,您可以有两个位图,它们在两个不同的 HWnd 上绘制(一个用于工具栏,另一个用于另一个绘图)。

    这里有一些资源可以帮助你:

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多