我正在尝试将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后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不起作用?
答案 0 :(得分:0)
检查pinvoke.net上此page末尾的示例。对CreateCompatibleDC和SelectObject的额外调用可能会使您的示例工作。
或者,您可以考虑使用Graphics.DrawImageUnscalled,它允许您仅在.Net端实现代码,并且仍然可以提供相当不错的性能。
更新(由于更新的问题)
我不确切知道为什么hDC在一段时间后变得无效,但根据MSDN你成对地调用GetHdc和ReleaseHdc并将它们之间的GDI +代码调用分组:“必须出现对GetHdc和ReleaseHdc方法的调用在GetHdc和ReleaseHdc方法对的范围内,通常只调用GDI函数。“
因此,根据文档,您在第二个示例中所采用的方式是可行的方法,您不应该缓存和重用GetHdc方法中的值。