0

我正在尝试将 BitBlt 从 HBITMAP 转换为 GDI+ 位图。我试过这个,但没有任何反应:

Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);
IntPtr hBufferDC = BufferGraphics.GetHdc();

...

BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);

编辑:显然,如果我获得了 hDC,然后再将它与 BitBlt 一起使用,它就无法工作。我需要确保 hDC 仍然有效。这是解决方案:

Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);

...

IntPtr hBufferDC = BufferGraphics.GetHdc();
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);
BufferGraphics.ReleaseHdc(hBufferDC);

有谁知道为什么这个改变是必要的?为什么使用第一个示例中较早获得的 hDC 可能不起作用?

4

1 回答 1

0

在 pinvoke.net 上查看本页末尾的示例。对 CreateCompatibleDC 和 SelectObject 的额外调用可能会使您的示例工作。

或者,您可以考虑使用 Graphics.DrawImageUnscall,这将允许您仅在 .Net 端实现您的代码,并且仍然会提供相当好的性能。

更新(由于更新的问题)
我不知道为什么 hDC 会在一段时间后变得无效,但根据MSDN,您成对调用 GetHdc 和 ReleaseHdc 并将对 GDI+ 代码的调用分组在它们之间:“调用 GetHdc 和 ReleaseHdc方法必须成对出现。在 GetHdc 和 ReleaseHdc 方法对的范围内,您通常只调用 GDI 函数。

因此,根据文档,您在第二个示例中所做的方式是可行的方法,您不应该缓存和重用 GetHdc 方法中的值。

于 2011-01-01T16:32:07.357 回答