如何在屏幕上选择一个区域并用Python调暗不受欢迎的区域?

时间:2013-07-04 01:22:05

标签: python wxpython screenshot

我正在构建一个屏幕捕获应用程序,我正在使用wxPython,但可以随意为此任务建议另一个库。

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

裁剪图像之前我遇到过这个问题。我不得不使用两个图像,一个隐藏,另一个是用户选择要裁剪的区域。一旦用户做出选择,我计算坐标,剪切隐藏图像并将其显示在半透明图像的顶部。如果可能的话,我想在这里避免。如果用户想要捕获视频或移动对象的屏幕怎么办?

1 个答案:

答案 0 :(得分: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(其中大写字母表示外部矩形边缘,小写字母内部矩形边缘) 。这根本不是一个多边形,但如果你问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像素宽的虚线。绘制笔划以及填充应该修复它,但我不确定是否会这样做。

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