用python介绍 Cairo

Cairo 是一个绘制矢量图形的类库。矢量图形很有趣,因为它们在调整大小或转换时不会失去清晰度。

pycairo是一组用于cairo的绑定。它提供了cairo模块,可用于从python调用cairo命令。

了解如何使用 Cairo

了解如何使用cairo的最佳方法是想象您是一个使用画笔在画布上绘制形状的艺术家。

首先,您可以选择画笔的一些特性。你可以选择画笔的厚度和你想用的颜色。你也可以选择你的笔尖的形状-你可以选择一个圆形或正方形。

一旦你选择了你的画笔,你就可以开始画画了。你必须非常准确地描述你想要出现的东西。

首先,决定你想把画笔放在画布上的什么地方。您可以通过提供X&Y坐标来实现这一点。接下来定义画笔笔画的外观-圆弧、直线等。最后,通过提供X&Y坐标定义笔画结束的点。三角形和正方形很容易做到!

更复杂的图形是使用上述主题的变体生成的,并添加了一些附加内容,如填充(着色)、转换(放大、移动)等,使用到cairo的python接口。

几乎所有的工作都围绕着使用 cairo.Context (或) cairo_t 在cairo c api中)。这是向其发送绘图命令的对象。有几个选项可用于以不同方式初始化此对象。

正在初始化cairo.context对象

  • 要认识到的一件非常重要的事情是,描述图形的坐标和显示图形的坐标之间存在差异。

    (例如,在做演示时,你先用透明的醋酸纤维画出来,然后在投影仪上显示出来——cairo称透明的醋酸纤维为用户空间坐标,投影图像为设备空间坐标)

    在初始化cairo上下文对象时,我们告诉它如何将描述转换为应该如何显示它。为此,我们提供了一个变换矩阵。修改变换矩阵可以得到一些非常有趣的结果。

  • Cairo 最强大的功能之一是它可以以多种不同的格式输出图形(它可以使用多个后端)。对于打印,我们可以让cairo将图形转换为PostScript,然后发送到打印机。对于屏幕显示,我们可以让cairo将我们的图形转换为Glitz可以理解的内容,以实现硬件加速渲染!它有许多更重要和有用的目标后端。在初始化时 cairo.Context 我们设置了它的目标后端,提供了一些细节(例如颜色深度和大小),如下面的示例中所示。

例子

#!/usr/bin/env python

import math
import cairo

WIDTH, HEIGHT = 256, 256

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)

ctx.scale(WIDTH, HEIGHT)  # Normalizing the canvas

pat = cairo.LinearGradient(0.0, 0.0, 0.0, 1.0)
pat.add_color_stop_rgba(1, 0.7, 0, 0, 0.5)  # First stop, 50% opacity
pat.add_color_stop_rgba(0, 0.9, 0.7, 0.2, 1)  # Last stop, 100% opacity

ctx.rectangle(0, 0, 1, 1)  # Rectangle(x0, y0, x1, y1)
ctx.set_source(pat)
ctx.fill()

ctx.translate(0.1, 0.1)  # Changing the current transformation matrix

ctx.move_to(0, 0)
# Arc(cx, cy, radius, start_angle, stop_angle)
ctx.arc(0.2, 0.1, 0.1, -math.pi / 2, 0)
ctx.line_to(0.5, 0.1)  # Line to (x,y)
# Curve(x1, y1, x2, y2, x3, y3)
ctx.curve_to(0.5, 0.2, 0.5, 0.4, 0.2, 0.8)
ctx.close_path()

ctx.set_source_rgb(0.3, 0.2, 0.5)  # Solid color
ctx.set_line_width(0.02)
ctx.stroke()

surface.write_to_png("example.png")  # Output to PNG