【问题标题】:How can I select an area on the screen and dim the unseleceted area with Python?如何在屏幕上选择一个区域并使用 Python 使未选择的区域变暗?
【发布时间】:2013-07-01 21:12:47
【问题描述】:

我正在构建一个屏幕捕获应用程序并且我正在使用 wxPython,但请随时为这项任务推荐另一个库。

我可以在屏幕顶部放置一个全屏、半透明的框架,并且可以在其上绘制一个矩形。但是如何使这个矩形完全透明而框架的其余部分保持半透明呢?

我之前在裁剪图像时遇到过这个问题。我必须使用两张图片,一张是隐藏的,另一张是用户选择要裁剪的区域。一旦用户做出选择,我计算坐标,剪下隐藏的图像并将其显示在半透明图像的顶部。如果可能的话,我想在这里避免这种情况。如果用户想要捕捉视频或移动物体的屏幕怎么办?

【问题讨论】:

  • 为什么不将捕获的区域限制在用户指定的尺寸范围内,然后一起省略遮罩呢?获取屏幕截图,剪辑到约束尺寸,保存。如果您想看中移动的视频对象 - 是否让受限区域跟随鼠标?
  • 我不确定我是否理解您的建议。整个调光未选择区域只是为了可用性,让它看起来不错。你是说要省略那部分,还是你的方法提供了这种能力而我不明白?

标签: python wxpython screenshot


【解决方案1】:

我可以在屏幕顶部放置一个全屏、半透明的框架,并且可以在其上绘制一个矩形。但是如何使这个矩形完全透明而框架的其余部分保持半透明?

你不能。一个完全透明的矩形只会显示它后面的东西,这是一个半透明的矩形。

但是您可以轻松地扭转局面。创建一个完全透明的框架,然后在框架顶部绘制一个半透明区域(即您的矩形之外的所有区域。

第一种方法不起作用的原因是你的全透明矩形只会显示它后面的东西,这是一个半透明的矩形。

有多种方法可以绘制这样的区域。

最简单的就是把它分解成四个矩形,像这样的伪代码:

drawrect(0, 0, top, -1)
drawrect(top, 0, bottom, left)
drawrect(top, 0, bottom, right)
drawrect(bottom, 0, -1, -1)

构建一个区域可能更具可读性(只需构建一个全帧区域,然后减去矩形),但绘制一个区域更痛苦。或者,您可以在矩形周围绘制一个未填充的矩形,然后在窗口边界周围绘制另一个像素,然后从 (1,1) 泛滥,但是您必须处理一个接一个的错误。或者您可以创建一个具有 8 个像素的多边形并欺骗缠绕规则。等等。但我认为这是最简单的。


假设您用这些点构建一个“多边形”:TL、TR、BR、BL、TL、tl、bl、br、tr、tl、TL(其中 caps 表示矩形外边,小写表示矩形内边) .这根本不是一个多边形,但如果你问what pixels are inside that polygon(就像你告诉它用填充绘制多边形时所做的那样),wx 必须做一些事情。 wx 有两个规则可供您选择:even-odd 规则计算从一个像素到无穷远某个点的线穿过多边形的次数,而winding-number 规则计算多边形围绕一个像素循环的次数。

使用奇偶规则:两个矩形内的每个像素都有 2 或 4 个交叉点(取决于无穷远点是否穿过线)。两者之外的每个像素都有 0、2、4 或 6(因为它可能只穿过外部矩形或两者都穿过,并且在任何一种情况下都可能穿过线)。它们之间但不在线上的每个像素都有 1、3 或 5(因为它将恰好穿过外部矩形一次,并且可能穿过内部矩形和/或线)。线上的每个像素......这就是它变得棘手的地方。 wx 将其留给每个平台后端来执行规则,并且在其中一些上,线上的某些点可能被计为从一条线开始并穿过另一条线,这意味着它们最终有 2(或 4)个交叉点,并且因此没有被填满。因此,您最终可以得到一组间隙,它们共同构成一条 1 像素宽的虚线。绘制描边和填充应该可以修复它,但我不确定它是否可以。

使用缠绕规则:理论上,屏幕上任何位置的每个像素都应该被视为外部,而不是填充。然而,它的实际实现方式,两个矩形内部或外部的像素都看到曲线的一半完全抵消了另一半,而矩形之间的像素只看到线取消自身,而矩形都显示为顺时针方向。即使平台做了一些奇怪的事情并且没有看到线路正确地取消,那也很好;它只能使像素被抵消得更少。

【讨论】:

  • 这个想法闪过我的脑海,但出于某种原因,我认为它太复杂了。在四行代码中看到它会让人感觉很容易。我会试一试,我会在几分钟后报告。
  • 我认为真正的代码将是 6 行,因为 wx 执行原点/大小矩形而不是对角矩形,并且没有指定右下角的好方法窗口/屏幕/剪辑区域...无论如何,它应该比使用Region 或试图欺骗多边形缠绕规则更简单。
  • 我选择了四个矩形的解决方案,但如果明天有时间,我可能会实施 Region。只是出于好奇,能否详细说明一下“欺骗多边形缠绕规则”?
  • 谢谢,我不熟悉这两个术语(奇偶规则和缠绕规则)。你刚刚给了我一些有趣的材料让我继续阅读。我最终实施了该地区。它比四个矩形要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多