[英]AND two bitmaps in C#
我正在尝试和两个这样的位图:
[DllImport("gdi32.dll")] public static extern int SetROP2(IntPtr hDC, int nDrawMode); const int SRCAND = 0x008800C6; // AND raster op. lock (g.Clip) { IntPtr pDC = g.GetHdc (); SetROP2 (pDC, SRCAND); g.DrawImageUnscaled (currentBitmap, bound.Location); g.ReleaseHdc (pDC); }
但是我从Draw语句中获得了“Object目前正在其他地方使用”异常。 在Draw语句运行之前移动ReleaseHdc语句,但不使用指定的栅格op。
LockBits方法太慢了,因为它复制了整个位图两次,其中一个位图很大,而且这种情况每秒都会发生很多次。
我有什么想法可以将.NET引入ANDing位图吗?
lock (g.Clip)
这不行。 您将获得此异常,因为您在多个线程中使用位图。 我想在另一个绘制位图的线程。 要做到这一点,您必须确保两个线程不能同时使用位图。 这确实需要lock关键字。 但是在同一个锁对象上。 您使用的Graphics实例将不相同。 锁不起作用。
创建两个线程使用的专用锁定对象。
虽然您找到了解决方法,但值得注意的是异常的实际来源。 GDI和GDI +操作不能交错 - 一个或另一个可以一次操作,但不能同时操作。
在您的代码中,调用g.GetHdc()
Graphics对象切换到新创建的HDC可用于GDI渲染的状态。 然后,在调用g.ReleaseHdc()
之前,Graphics对象将“正在使用”。 此时,HDC被破坏,然后可以再次使用Graphics对象进行渲染。
注意到通过调用GetHdc()
返回的HDC是ney创建的,并且只有在调用ReleaseHdc()
时才存在,它被销毁,很明显为什么ROP不应用于Graphics对象执行的后续操作。
如果需要使用GDI ROP,则必须在纯GDI上下文中进行所有关联渲染 - 使用Bitmap.GetHbitmap()
来获取必要的句柄。 请注意,与Graphics.GetHdc()
类似,HBITMAP是从Bitmap
新创建的,但与它没有共享状态。
有关GDI / GDI +互操作的更多详细信息,请参见KB 311221
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.