2010-09-17 78 views
0

我想在屏幕的特定区域上创建一个过滤器来执行过滤操作。屏幕颜色过滤

实例什么过滤opertion可能是:
      - 反转(例如,改变黑色像素为白色像素,红至蓝绿色)
      - 掩蔽像素(例如掩模= FF0000;输入c79001 - > c70000)
      - 操作,如Photoshop的图层效果

这里是它应该是什么样子的例子: http://img443.imageshack.us/img443/1462/overlayk.png

有谁知道如何在Windows操作系统下执行此操作。 (我喜欢的语言是C#)

谢谢!

+0

看起来很像xor过滤器。 – 2010-09-17 17:16:49

回答

0

根据您需要更新“过滤器”的速度,快速和黑客的方法是只使用CopyFromScreen获取屏幕截图,而您的过滤器窗口不可见,将过滤器应用于图像数据,然后设置过滤器窗口来显示图像数据。

如果你想这样做,而不必首先隐藏窗口,你可能需要做一些像http://www.codeproject.com/KB/system/snapshot.aspx在那里你可以捕捉到单个窗口。

一个更棘手但可能更快的事情要做,并且要求几乎完全使用p/invoke win32调用,将根本没有窗口,根据坐标获取所需的捕获窗口,将图像捕获为上面,然后直接画到屏幕DC。

+0

我虽然关于这种方法。问题是,当滤镜后面的像素发生变化时,我需要更新滤镜。但是由于过滤器在前面,我无法检测它们是否发生了变化。 (暂时不能将过滤器设置为不可见。) – raisyn 2010-09-17 17:30:51

+0

对,然后考虑第三个选项。基于直接窗口捕捉直接重复绘制到屏幕DC。 – Reinderien 2010-09-17 17:36:29

+0

你能解释一下“直接窗口捕捉”是什么吗? – raisyn 2010-09-17 17:43:13

0

澄清:你想在桌面的面积,不只是你的窗口的范围内,是你的控制,让您应用逐像素过滤器下。如果是这样的话,我认为你需要的是使用XNA库的DirectDraw。 WPF可以让你得到你所需要的,但WinForms很可能不会。还有第三方工具。

如果希望只在您的应用程序窗口的界限这种能力,例如在绘图应用程序,它变得更容易。从Control继承的Windows.Forms名称空间中的每个类都暴露了一个CreateGraphics()方法。此方法返回一个表示覆盖控件屏幕区域的绘图表面的对象,并且是几乎任何您想在涉及自定义图形的窗口上执行的任何操作的基础(在内部,它用于首先绘制控件) 。

一旦你有图形对象,你可以在上面画图。绘制动画或游戏等自定义图形的常用方法是在Bitmap对象上进行实际绘制(从抽象图像派生),然后完成后在图形区域绘制位图。这样做是为了减少闪烁;如果图形区域在绘制时显示给用户,那么用户在“擦除”和重绘之前只能看到完整的图像一秒钟,并且半途画出的形状将在那里一会儿并且消失接下来等待被绘制。绘制到位图,然后在完成后在屏幕上显示位图,意味着用户一次可看到完整的图像。

您可以使用透明度功能扩展此功能以创建多层图像。为您希望操作的每个图层都有一个位图。分别对它们进行处理,然后按照它们从后到前的正确顺序将它们中的每一个绘制到主位图上,然后在屏幕上绘制该位图。这允许您使用PhotoShop类型的操作,其中一部分图像是一个图层,并且可以独立于其他图层进行操作。

对于每像素过滤,Bitmap对象公开了GetPixel()和SetPixel()方法,这些方法允许您获取单个像素的颜色,执行滤镜计算并重新绘制它。这个过程将完全不加速,因此受到CPU速度的限制,但可以非常精细地控制图像或重复执行任务,如过滤器。

+0

我想要一个区域或桌面,而不只是在你的窗口范围内。任何想法如何用DirectDraw做到这一点? – raisyn 2010-09-17 17:44:23

+0

您需要VS的XNA Game Studio插件。它将允许访问Microsoft.XNA.Framework命名空间。在Graphics子空间下,你会发现GraphicsAdapter,它有一些方法允许你引用一部分屏幕进行绘制,并设置对象来应用纹理(在这种情况下,你只需要一个与区域大小相同的面部你正在引用)。您将在user32和gdi32 DLL中将它与Windows API方法结合使用,以便您可以抓取屏幕区域,以便在重新绘制它们之前使用.NET代码处理它们。 – KeithS 2010-09-17 18:05:11