屏幕颜色过滤

时间:2010-09-17 17:02:02

标签: c# screen overlay image-manipulation

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

过滤操作的示例:
- 反转(例如,将黑色像素改变为白色像素,将红色改为青色) - 屏蔽像素(例如,mask = ff0000;输入c79001 - > c70000)
- 像photoshop的图层效果一样的操作

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

如果您想在不必先隐藏窗口的情况下执行此操作,则可能需要执行http://www.codeproject.com/KB/system/snapshot.aspx之类的操作来捕获单个窗口。

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

答案 1 :(得分:0)

澄清一下:您希望桌面区域(而不仅仅是在窗口范围内)受您控制,允许您应用每像素过滤器。如果是这种情况,我认为你需要的是使用XNA库的DirectDraw。 WPF可以为您提供所需,但WinForms很可能不会。还有第三方工具。

如果您只想在应用程序窗口的范围内使用此功能,例如在绘图应用程序中,它就会变得容易得多。从Control继承的Windows.Forms命名空间中的每个类都公开一个CreateGraphics()方法。此方法返回一个表示绘图表面的对象,该绘图表面覆盖控件的屏幕区域,并且是您在涉及自定义图形的窗口上执行任何操作的基础(在内部,它用于首先绘制控件)

获得Graphics对象后,可以在其上绘制图像。绘制动画或游戏等自定义图形的流行方法是在Bitmap对象上实际绘制(从抽象图像派生),然后在完成后,在Graphics区域绘制Bitmap。这样做是为了减少闪烁;如果在绘制图形区域时向用户显示图形区域,则用户只能在“擦除”并重新绘制之前一瞬间看到完整图像,并且中途绘制的形状将在那里停留一段时间然后消失接下来他们等待被吸引。绘制到位图,然后在完成后在屏幕上显示位图,表示用户一次看到完整的图像。

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

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