【问题标题】:Display filter C#显示过滤器 C#
【发布时间】:2010-03-02 06:27:12
【问题描述】:

解释我需要什么有点困难,但我会尝试:

我需要编写应用程序(winform),它是某种过滤器来处理它背后的图像/其他形式。除了一个例外 - 表单后面的所有内容都应该看起来像红色(例如)颜色,必须替换为任何其他指定的颜色,例如白色。

让我们想象一下,我用几行文本打开了 Windows Word。带有红色和黑色字母。 因此,当我将我的应用程序放在此文本上方时 - 它应该“过滤”红色符号并将它们填充为白色。

因此,据我了解这项任务:我必须在表单后面捕捉区域,然后对其进行处理(替换颜色)并在我的表单主体上绘制此图像。

有什么链接或者关键词可以解决吗?

更新:

所以 - 这是我的最终解决方案:

  1. 使表单透明(使用 TransparencyKey 和 BackColor 属性)
  2. 将图片框放在表单上
  3. 当我们需要更新图片框中的图片时 - 我们将当前图片替换为图片框1.Image = null;,然后用 (this.Refresh()) 刷新表单并新建快照

谢谢大家 ;-)

UPD 2: sample http://dl.dropbox.com/u/4486681/result.png

UPD 3: 这里是sources

【问题讨论】:

  • +1 - 我认为这是一个很棒的问题。
  • 必须是winforms吗?我怀疑这种事情在 WPF 中可能更容易。
  • 没有限制或强制性。这应该是具有任何形式的 windows .net 应用程序(至少带有标题和关闭按钮);-)

标签: c# .net winforms screen-scraping image-manipulation


【解决方案1】:

您可以使用以下代码创建桌面快照:

public Bitmap CaptureScreen()
{
    Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
    Graphics g = Graphics.FromImage(b);
    g.CopyFromScreen(0, 0, 0, 0, b.Size);
    g.Dispose();
    return b;
}

将尺寸和位置替换为表单的坐标。通过这种方式,您可以获得表单背后的位图。然后您可以在该位图上进行颜色替换。

请注意,由于 ClearType 和其他抗锯齿机制等设置,您在进行颜色替换时还必须考虑“中间像素”。否则事情会看起来很有趣:-)

【讨论】:

  • 是的,我已经考虑过“接近”颜色。这将是下一个挑战 ;-) 那么 - 任何人都可以提出更好的解决方案吗?
  • 太棒了!我不知道 CopyFromScreen 方法,这正是我认为 @zerkms 必须求助于 C++ 的原因
【解决方案2】:

我不知道这是否可以做到(让我们看看其他人的回答:-)。

您可以获得屏幕设备上下文的句柄,它会为您提供屏幕的位图。

HDC dc = GetDC(NULL);

(这是 C++,你必须使用 P/Invoke,或者在 C++ 中创建一个混合模式库)

然后您可以使用过滤过程重绘屏幕区域。

现在问题开始了:

  • 你怎么知道你感兴趣区域的像素发生了变化?
  • 如果区域发生变化,这些变化是可见的还是被您自己的绘图隐藏了。

您可以在某处设置一个按钮,该按钮可暂时隐藏您自己的应用,并在再次按下时将其显示回来,并过滤新内容。

祝你好运。有没有可能分享用户场景?

【讨论】:

  • 在我的情况下 - 应用程序后面的像素将是静态的,它将简化我的解决方案。 (我希望我能做到这一点)所以只有在一种情况下才需要绘制:我的应用程序被移动或我的应用程序在失去焦点后重新获得焦点。
  • 这是一个很好的简化。我认为@Thorsten 的解决方案更好(没有 C++)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多