繁体   English   中英

和C#中的两个位图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM