在 PyCairo 教程的这个部分,我们将讨论透明度。我们将提供一些基本的定义和三个有趣的透明度的例子。
透明度是指透过一种材料能够看到的品质。理解透明度最简单的方法是想象一块玻璃或水。技术上来说,光线可以穿过玻璃,因而我们可以看到玻璃后面的物体。
在计算机图形学中,我们可以用 alpha 合成 实现透明度效果。Alpha 合成是一个将一幅图片和背景结合起来创建部分透明的外观的过程。合成过程使用 alpha 通道。在用于表达半透明(透明度)的图像文件格式中,alpha 通道是一个 8-bit 的layer。每像素额外的 8 bits 被用作一个 mask 并代表256级的半透明度。
透明的矩形
第一个例子将绘制 10 个具有不同半透明度的矩形。
|
|
set_source_rgba()
方法有一个 alpha 参数来提供透明度。
|
|
这段代码创建了 10 个矩形,它们的 alpha 值分别为 0.1,…,1。
Puff 效果
在下面的例子中,我们创建一个 puff 效果。例子将显示一个增长的居中的文字,并从一些点开始逐渐褪色。这是一个非常常见的效果,我们经常可以在闪光动画中看到它。paint_with_alpha()
方法对于创建这个效果非常重要。
|
|
这个例子在窗口中创建一段不断增长并褪色的文本。
|
|
这里我们定义了一些将在例子中使用的常量。
|
|
这两个变量存储当前的 alpha 值和字体大小。
|
|
每隔 14 ms,on_timer()
方法被调用一次。
|
|
在 on_timer()
方法中,我们通过 queue_draw()
方法重绘 DrawingArea widget。
|
|
在 on_draw()
方法中,我们获取窗口的客户区域的宽度和高度。这些值被用于使文字居中。我们将以某种暗红色填充窗口的背景。我们为文字选择一个 Courier 字体。
|
|
我们获取文字的一些度量值。我们将只使用文字宽度。
|
|
我们移动到一个可以使文字在窗口中居中的位置。
|
|
我们用 text_path()
方法获取文字的 path。我们用 clip()
方法将绘制限定在当前的path。paint_with_alpha()
方法使用一个 alpha 值的 mask,在当前的裁剪区域内,绘制当前的 source。
图像倒影
在下一个例子中,我么将秀出一个倒影图像。这个效果创造了一种图像倒映在水中的感觉。
|
|
在语法方面,需要注意一下 Python 2.7 和 Python 3 在异常处理方面的差异。一个倒映的城堡的废墟就显示在窗口中了。
|
|
在 load_image()
方法中,由一幅 PNG 图片创建一个图像 surface。
|
|
在 init_vars()
方法中,我们获取图像的宽度和高度。同时定义两个变量。
|
|
窗口的背景由一个渐变绘制填充。绘制是一个平滑的由黑色到深灰色的混合。
|
|
这段代码翻转图像,并将它平移到原始图像的下方。平移操作是必须的,因为放缩操作使得图像翻转并将图像向上平移。为了理解发生了什么,可以简单地拍一张照片,将它放在桌子上,然后反转它。
|
|
这是最后的部分。我们使第二幅图片变得透明。但透明度不是固定的。这幅图片渐渐地褪色。倒影图像是一行接一行绘制的。clip()
方法将绘制限定在高度为 1 的矩形中。paint_with_alpha()
在绘制图像 surface 的当前裁剪区域时会将透明度也考虑进来。
等待效果 Demo
在这个例子中,我们使用透明效果创建一个等待效果的 demo。我们将绘制 8 跳线,它们逐渐的淡出,以创造一种假象,好像线在移动一般。这种效果经常被用于告知用户,一个耗时比较久的任务正在后台运行。一个例子是 Interne 上的流视频。
|
|
我们以八个不同的 alpha 值绘制了八条直线。
|
|
这是一个 Demo 中会用到的透明度值的二维元组。有 8 行,每一行表示一种状态。8 条直线中的每一条将连续使用这些值。
|
|
SPEED
常量控制动画的速度。CLIMIT
是 self.count
变量的最大值。达到这个限制之后,变量会被重置为 0。NLINES
是这个例子中绘制的直线的条数。
|
|
我们使用定时器函数创建动画。每一个 cv.SPEED
ms,on_timer() 方法会被调用一次。
|
|
在 on_timer()
方法中,我们增加 self.count
变量。如果变量达到了 cv.CLIMIT
常量,它会被设置为 0。我们避免溢出,并且不使用非常大的数字。
|
|
我们使线更粗一点,以使得它们更容易被看到。我们用圆形的帽子绘制直线。
|
|
我们将我们的绘制定位在窗口的中心。
|
|
在 for
循环中,我们用不同的透明度值,绘制了八条旋转的直线。线之间由 45 度角隔开。
本章我们讨论了透明度。
Done.