图形库)"/>
cairo(2D图形库)
介绍
cairo是一款开源的2d矢量图形库,它支持包括X-Windos,Win32,图像,pdf在内的各种输出设备。支持多种后端输出,cairo是用C编写的,但是为大多数常用的语言提供了绑定,qt和Python也支持。本文主要是在Ubuntu里面进行开发,未使用qt工具。
下载安装
sudo apt-get install libcairo2-dev
cairo的基本模型和概念
1、表面(surface)
Surface是Cair绘图的目标区域,在Cairo中使用cairo_surface_t表示,我们绘图的目标区域可以是一张png的图像,一个pdf文件不同目标的绘制,底层实现也各不相同,而surfac对这些绘图的目标进行了一个抽象,所以我们在创建了相应的surface之后,只需要调用统一的函数对surface进行绘制即可。
2、源(source)
指的是我们绘图具体的材料和格式,包括画笔的粗细、颜色等等。source不光可以是笔的颜色,也可以是一种图案(patter)比如渐变色,甚至可以是一个表面(surface)。
3、遮盖(mask)
Mask相当于我们在绘图过程中,用一张挖空了某些部分的纸遮挡在画布上,这样,在绘图过程中,只有挖空的部分会被我们所使用的源影响到,其余部分不受影响。
4、路径(path)
path是指cairo的绘制表面上一些虚拟的路径,可能是一条线段、一个闭合的四边形、或者是更加复杂的曲线,path可以由cairo的函数所创建(verb),但是由于path只是虚拟的路径,所以对path的创建并不代表对表面绘制,我们需要使用绘制函数进行绘制,比如我们可以通过cairo_rectangle函数创建一个闭合的长方形路径,然后通过cairo函数进行填充。
5、上下文(context)
context是cairo的核心结构,在cairo中使用cairo_t来表示,它记录了当前状态下,与绘制有关的各种信息,包括之前介绍的表面、源、遮盖、字体等,在任何绘制之前,我们都必须先创建一个cair_t结构,同时将它绑定到绘制表面上,下面代码创建了一个cairo_t,并绑定到一个640x480的png图像
cairo_surface_t *surface;
cairo_t *cr;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 640, 480);
cr = cairo_create (surface);
5、函数(verb)
cairo中与绘制相关的函数被称为verb,目前cairo支持五种绘制函数:画线(stroke)、填充(fill)、text(文字)、滤镜(paint)、遮盖(mask),其中paint相当于是整个源进行了一次操作,比如cairo_paint_with_alpha函数可以设置一个alpha值,来对整个图象进行灰度的减少。
6、变换(transformation)
cairo提供类似OpenGL的坐标变换操作,变换操作包括:平移(cairo_translate)、伸缩(cairo_scale)、旋转(cairo_rotate)。
示例1
绘制一个矩形到png图片上。
#include <cairo.h>
int main (int argc, char *argv[])
{ cairo_surface_t *surface; cairo_t *cr; int width = 640; int height = 480; surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); cr = cairo_create (surface); /* Drawing code goes here */ cairo_set_line_width (cr, 10); cairo_set_source_rgb (cr, 0, 0, 0); cairo_rectangle (cr, width/4, height/4, width/2, height/2); cairo_stroke (cr); /* Write output and clean up */ cairo_surface_write_to_png (surface, "rectangle.png"); cairo_destroy (cr); cairo_surface_destroy (surface); return 0;
}
编译:
gcc png.c -o png -I/usr/include/cairo -L/usr/local/lib/ -lcairo
运行:
./png
结果:
示例2
绘制hello world到pdf上
#include <cairo.h>
#include <cairo-pdf.h>
int main (int argc, char *argv[])
{ cairo_surface_t *surface; cairo_t *cr; cairo_text_extents_t te; /* Prepare drawing area */ int width = 200; int height = 120; surface = cairo_pdf_surface_create ("helloworld.pdf", width, height); cr = cairo_create (surface); /* Drawing code goes here */ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, 20); cairo_text_extents (cr, "helloworld", &te); cairo_move_to (cr, width/2 - te.width / 2 - te.x_bearing, height/2 - te.height / 2 - te.y_bearing); cairo_show_text (cr, "helloworld"); cairo_destroy (cr); cairo_surface_destroy (surface); return 0;
}
编译:
gcc pdf.c -o pdf -I/usr/include/cairo -L/usr/local/lib/ -lcairo
运行:
结果:
更多推荐
cairo(2D图形库)
发布评论