cairo(2D图形库)

编程入门 行业动态 更新时间:2024-10-08 07:38:07

cairo(2D<a href=https://www.elefans.com/category/jswz/34/1770818.html style=图形库)"/>

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图形库)

本文发布于:2024-02-14 08:53:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762745.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图形   cairo

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!