C# 屏幕颜色过滤

C# 屏幕颜色过滤,c#,screen,overlay,image-manipulation,C#,Screen,Overlay,Image Manipulation,我想在屏幕的特定区域上创建一个过滤器,以执行过滤操作 过滤操作的示例: -反转(例如,将黑色像素更改为白色像素,将红色更改为青色) -遮罩像素(例如遮罩=ff0000;输入c79001->c70000) -photoshop的图层效果等操作 下面是它应该是什么样子的示例: 有人知道如何在Windows操作系统下执行此操作吗。 (我喜欢的语言是C#) 谢谢 根据您需要“过滤器”更新的速度,一种快速的方法就是在过滤器窗口不可见时使用CopyFromScreen获取屏幕截图,将过滤器应用于图像数据,

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

过滤操作的示例:
-反转(例如,将黑色像素更改为白色像素,将红色更改为青色)
-遮罩像素(例如遮罩=ff0000;输入c79001->c70000)
-photoshop的图层效果等操作

下面是它应该是什么样子的示例:

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


谢谢

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

如果您不想先隐藏窗口,那么可能需要执行一些操作,例如在何处捕获单个窗口


一个更复杂但可能更快的方法是,几乎完全不需要使用p/invoke win32调用,即根本没有窗口,根据它们的坐标获取所需的捕获窗口,如上所述捕获图像,然后直接绘制到屏幕DC。

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

如果您不想先隐藏窗口,那么可能需要执行一些操作,例如在何处捕获单个窗口


一个更复杂但可能更快的方法是,几乎完全不用p/invoke win32调用,完全不用窗口,根据它们的坐标获取所需的捕获窗口,如上所述捕获图像,然后直接绘制到屏幕DC。

澄清一下:您想要一个桌面区域,不只是在窗口的范围内,而是在您的控制下,允许您应用每像素过滤器。如果是这样,我认为您需要的是使用XNA库的DirectDraw。WPF可能会满足您的需要,但WinForms很可能不会。还有第三方工具

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

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

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


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

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

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

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

可以使用透明度功能扩展此功能,以创建多层图像。为您希望创建的每一层创建一个位图