首页 > 其他 > 详细

Cairo编程

时间:2015-03-25 00:25:57      阅读:471      评论:0      收藏:0      [点我收藏+]

一、简介

cairo 是一个免费的矢量绘图软件库,它可以绘制多种输出格式。cairo 支持许多平台,包括 Linux、BSD、Microsoft? Windows? 和 OSX(BeOS 和 OS2 后端也正在开发)。Linux 绘图可以通过 X Window 系统、Quartz、图像缓冲格式或 OpenGL 上下文来实现。另外,cairo 还支持生成 PostScript 或 PDF 输出,从而产生高质量的打印结果。在理想情况下,cairo 的用户可以在打印机和屏幕上获得非常接近的输出效果。

 

专业术语

 

1、环境 (Context)
使用 Cairo 绘图,必须要首先创建 Cairo 环境 (Context)。Cairo 环境保存着所有的图形状态参数,这些参数描述了图形的构成,譬如线条宽度、颜色、要绘制的外观 (Surface) 以及其它一些信息。Cairo 环境允许真正的绘图函数使用很少的一部分参数,以此提高接口的易用性。调用 gdk_cairo_create () 函数可为所绘制的图形创建一个 Cairo 环境。

cairo_t * cr;
cr = gdk_cairo_create (widget->window);

这两行代码创建了一个 Cairo 环境,并且这个 Cairo 环境是关联到 GdkDrawable 对象上的。cairo_t 结构体包含了当前渲染设备的状态,也包含了所绘制图形的坐标。从技术上来讲,cairo_t 就是所谓的 Cairo 环境。

Cairo 所有的绘图函数都要去操作 cairo_t 对象。一个 Cairo 环境可以被关联到一种特定的外观,譬如 pdf、svg、png、GdkDrawable 等。

GDK 没有对 Cairo API 进行封装,它只允许创建一个可基于 GdkDrawable 对象绘制图形的 Cairo 环境。有一些 GDK 函数可以将 GDK 的矩形或填充区域转换为 Cairo Path (路径),然后使用 Cairo 绘图与渲染。

2、路径 (Path)
一条 Path(路径)通常是由一条或多条首尾相接的直线段构成的,也可以由直线段与曲线段构成。路径可分为 Open(开放)类型与 Closed(闭合)类型,前者的首尾端点不重合,后者的首尾端点重合。

在 Cairo 中,绘图要从一条空路径开始,首先定义一条路径,然后通过绘制/填充操作使之可见。要注意的是,每次调用 cairo_stroke () 或 cairo_fill () 函数之后,路径会被清空,不得不再定义新的路径。
一条路径可由一些子路径构成。

3、源 (Source)
源好比绘图中所使用的画笔/颜料,使用它来绘制/填充图形轮廓。有 4 种基本的源:color、gradient、pattern 与 image。

4、外观 (Surface)
Surface 就是要绘制图形的最终体现形式,譬如可使用 PDF 或 PostScript 外观实现文本内容的渲染,或者使用 Xlib、Win32 外观实现屏幕绘图。
Cairo 具体有那些外观类型,可参考其定义:

typedef enum _cairo_surface_type {
  CAIRO_SURFACE_TYPE_IMAGE,
  CAIRO_SURFACE_TYPE_PDF,
  CAIRO_SURFACE_TYPE_PS,
  CAIRO_SURFACE_TYPE_XLIB,
  CAIRO_SURFACE_TYPE_XCB,
  CAIRO_SURFACE_TYPE_GLITZ,
  CAIRO_SURFACE_TYPE_QUARTZ,
  CAIRO_SURFACE_TYPE_WIN32,
  CAIRO_SURFACE_TYPE_BEOS,
  CAIRO_SURFACE_TYPE_DIRECTFB,
  CAIRO_SURFACE_TYPE_SVG,
  CAIRO_SURFACE_TYPE_OS2
} cairo_surface_type_t;

5、蒙板 (Mask)
在源作用于外观之前,可对其实现过滤,蒙板 (mask) 即是过滤器。蒙板决定哪些源可被显示。蒙板不透明的部分允许复制源至外观,蒙板透明的部分则禁止复制源至外观。、

6、图案 (Pattern)
图案表示被绘制到外观的源。在 Cairo 中,图案是一种可以读取的内容,可用作绘图操作的源或蒙板。图案可以是纯色模式、基于外观的模式以及渐变模式。

 

 

二、编译与安装

参考:http://cairographics.org/download/

执行以下命令,即可完成安装

sudo yum install cairo-devel
如下图

技术分享

 

 

三、编程

程序1:用于生成 PNG 图像

#include <cairo.h>

int main (int argc, char *argv[])
{
        cairo_surface_t *surface;
        cairo_t *cr;

        surface =cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400, 800);
        cr = cairo_create (surface);

        cairo_set_source_rgb (cr, 1, 0, 0);
        cairo_rectangle(cr,0,0,400,800);
        cairo_fill(cr);
         cairo_select_font_face (cr, "Adobe Heiti Std", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
        cairo_set_font_size (cr, 30.0);

        cairo_move_to (cr, 100, 400);
        cairo_set_source_rgb (cr, 0, 1, 0);
        cairo_show_text (cr, "I Love Chinese !");

        cairo_surface_write_to_png (surface, "image.png");

        cairo_destroy (cr);
        cairo_surface_destroy (surface);

        return 0;
}

编译

gcc -o example-1.o example-1.c -lcairo -I/usr/include/cairo

运行

技术分享

 

程序2:用于生成 PDF 图像

#include <cairo.h>
#include <cairo-pdf.h>

int main (int argc, char *argv[])
{
        cairo_surface_t *surface;
        cairo_t *cr;

        surface = cairo_pdf_surface_create ("pdffile.pdf", 20, 40);
        cr = cairo_create (surface);

        cairo_set_source_rgb (cr, 1, 0, 0);
        cairo_rectangle(cr,0,0,20,40);
        cairo_fill(cr);
         cairo_select_font_face (cr, "WenQuanYi Zen Hei", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
        cairo_set_font_size (cr, 5);

        cairo_move_to (cr, 0, 20);
        cairo_set_source_rgb (cr, 0, 1, 0);
        cairo_show_text (cr, "热爱编程");

        cairo_show_page (cr);

        cairo_destroy (cr);
        cairo_surface_destroy (surface);

        return 0;
}

编译

gcc -o example-2.o example-2.c -lcairo -I/usr/include/cairo

运行

技术分享

 

程序3:用于生成 SVG 图像

#include <cairo.h>
#include <cairo-svg.h>

int main (int argc, char *argv[])
{
        cairo_surface_t *surface;
        cairo_t *cr;

        surface = cairo_svg_surface_create ("svgfile.svg", 20, 40);
        cr = cairo_create (surface);

        cairo_set_source_rgb (cr, 1, 0, 0);
        cairo_rectangle(cr,0,0,20,40);
        cairo_fill(cr);
         cairo_select_font_face (cr, "WenQuanYi Zen Hei", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
        cairo_set_font_size (cr, 5);

        cairo_move_to (cr, 0, 20);
        cairo_set_source_rgb (cr, 0, 1, 0);
        cairo_show_text (cr, "热爱编程");

        cairo_destroy (cr);
        cairo_surface_destroy (surface);

        return 0;
}

编译

gcc -o example-3.o example-3.c -lcairo -I/usr/include/cairo

运行

技术分享

Cairo编程

原文:http://www.cnblogs.com/274914765qq/p/4364261.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!