1

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

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

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

4

1 回答 1

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 表示矩形外边,小写矩形内边)。那根本不是一个真正的多边形,但是如果您询问该多边形内部有哪些像素(就像您告诉它用填充绘制多边形时所做的那样),wx 必须做一些事情。wx 有两个规则可供您选择:奇偶规则计算从一个像素到无限远某个点的线穿过多边形的次数,而缠绕数规则计算多边形围绕一个像素绕圈的次数。

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

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

于 2013-07-04T01:29:47.110 回答