我正在尝试从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不起作用?

有帮助吗?

解决方案

在此结束时检查样品 在pinvoke.net上。对CreateCompatibledC和SelectObject的其他调用可能会使您的示例起作用。

另外,您可以考虑使用graphics.drawimageunscalled,这将使您只能在.NET侧实现代码,并且仍然可以提供很好的性能。

更新 (由于更新的问题)
我不知道为什么HDC过了一段时间,但是根据 MSDN 您可以成对调用GETHDC和ReleaseHDC,然后将它们之间的呼叫拨打到它们之间:“呼叫GETHDC和ReleaseHDC方法必须成对出现。在GETHDC和ReleaseHDC方法对的范围内,您通常只对GDI功能进行调用。 “

因此,根据文档,您在第二个示例中所做的方式是要走的方式,您不应从GethDC方法中缓存和重复使用值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top