我正在构建一个屏幕捕获应用程序,并且我正在使用wxPython,但是可以为这个任务推荐另一个库。
我可以在屏幕上放置一个全屏半透明的框架,也可以在上面画一个矩形。但是如何使这个矩形完全透明,而框架的其余部分保持半透明呢?
我以前在裁剪图像时遇到过这个问题。我必须使用两张图片,一张是隐藏的,另一张是用户选择要裁剪的区域。一旦用户做出选择,我计算坐标,裁剪隐藏的图像,并将其显示在半透明图像的顶部。如果可能的话,我想在这里避免这种情况。如果用户想要捕获视频或移动对象的屏幕,该怎么办?
发布于 2013-07-04 01:29:47
我可以在屏幕上放置一个全屏幕,半透明的框架,我可以在上面画一个矩形。但是如何使这个矩形完全透明,而框架的其余部分保持半透明呢?
你不能。一个完全透明的矩形只会显示它后面的任何东西,这是一个半透明的矩形。
但你可以很容易地扭转局面。创建一个完全透明的框架,然后在框架顶部绘制一个半透明区域-即,除矩形之外的所有区域。
第一种方法不起作用的原因是,你的全透明矩形只会显示它背后的东西,这是一个半透明的矩形。
有许多方法可以绘制这样的区域。
最简单的方法是将它分成四个矩形,如下面的伪代码所示:
drawrect(0, 0, top, -1)
drawrect(top, 0, bottom, left)
drawrect(top, 0, bottom, right)
drawrect(bottom, 0, -1, -1)
构建一个区域可能更具可读性(只需构建一个完整的框架区域,然后减去rect),但绘制一个区域会更痛苦。或者,您可以在您的矩形周围绘制一个未填充的矩形,然后在窗口边框周围绘制另一个矩形,然后从(1,1)泛洪,但随后您必须处理off-by-one错误。或者你可以创建一个有8个像素的多边形,然后欺骗缠绕规则。诸若此类。但我认为这是最简单的。
假设你用这些点构建了一个“多边形”:TL,TR,BR,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像素宽的虚线。绘制一个笔划和一个填充应该可以修复它,但我不确定它是否能做到。
缠绕规则:理论上,屏幕上任何地方的每个像素都应该考虑到外部,而不是填充。然而,它的实际实现方式是,在两个矩形内部或外部的像素都可以看到曲线的一半完全抵消了另一半,而矩形之间的像素只能看到直线自身抵消,而矩形都显示为顺时针方向。即使平台做了一些奇怪的事情,并且没有看到线条自动抵消,这仍然是好的;它只会使像素抵消得更少。
https://stackoverflow.com/questions/17460541
复制相似问题