共有回帖数 0 个
-
地址: http://cairographics.org/
效果示例:
圆弧:





例子1: 直接生成一个PNG图片,在上面用自定义的字体和颜色写Hello World
#include cairo.h
int
main (int argc, char *argv[])
{
cairo_surface_t *surface =
cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
cairo_t *cr =
cairo_create (surface);
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size (cr, 32.0);
cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
cairo_move_to (cr, 10.0, 50.0);
cairo_show_text (cr, "Hello, world");
cairo_destroy (cr);
cairo_surface_write_to_png (surface, "hello.png");
cairo_surface_destroy (surface);
return 0;
}
一些重要的概念:
Context
要用Cairo画图,首先得创建一个Cairo 上下文(context)。Cairo 上下文(context)中定义了所有的图形状态变量,它们描述了绘图是怎样完成的。其中包括信息如:线宽(line width),颜色(color)以及要绘制的图面(surface)和其他很多相关的信息。
Path
路径(Path)由一条或者多条线组成。这些线由两个或者多个锚点(anchor point)连接而成。路径可以由直线和曲线组成。开放路径(Open path)和闭合路径(Closed path)是两种不同的路径(Path)。在开放路径中,起点和终点不相遇。在闭合路径中,起点和终点相遇。
在Cairo中,我们首先定义一个路径(Path),接着通过填充(filling)和描边(storking)使其可见。当调用cairo_stroke()或者cairo_fill()函数的时候,如果路径(Path)是空的,必须重新定义一个新的路径(Path)。
路径(Path)可以由子路径(Subpaths)组成。
Source
图源(Source)是我们绘图过程中的画笔。我们可以将图源(Source)比作画笔或者油墨,这样就可以绘制轮廓和填充图形。有四种基本的图源(Sourse)包括颜色(Colors),渐变(gradients),模板(patterns)和图像(images)。
Surface
图面(Surface)是绘图的最终目标。我们可以用PDF或者PostScript图面(surface)来渲染文档。
文档中提及了以下几种图面(Surfaces)
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;
Mask
在图源(Source)应用到图面(surface)之前,要进行一次过滤。遮罩(Mask)作为一个过滤器,决定一个图源(Source)哪部分被应用到图面(Surface),哪部分没有。遮罩(Mask)不透明的部分允许将图源(Source)拷贝到图面(surface),透明的部分不允许复制图源(Source)到图面(Surface)。
Pattern
Cairo pattern(模板)代表要绘画到图面(surface)上的source(图源)。在cairo中,你可以读取一个pattern,可以将它作为绘画操作的图源或者遮罩来使用。pattern可以是纯色,一个图面,甚至是渐变。
例子2:画圆弧
//定义圆弧的圆点
double xc = 128.0;
double yc = 128.0;
//半径
double radius = 100.0;
//起始弧度,45度转换为弧度:Cairo里用的都是弧度
double angle1 = 45.0 * (M_PI/180.0); /* angles are specified */
//结束弧度,180度
double angle2 = 180.0 * (M_PI/180.0); /* in radians */
//设置线宽:10个单位
cairo_set_line_width (cr, 10.0);
//画圆弧路径,此时只形成了Path,没有实际画出来
cairo_arc (cr, xc, yc, radius, angle1, angle2);
//描边,把之前的Path按设置好的样式实际画出来,到此时实际图像才落地成真
cairo_stroke (cr);
//画两条半径和一个圆点,作为辅助线
/* draw helping lines */
//设置不同的颜色
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
//设置辅助线不同的线宽
cairo_set_line_width (cr, 6.0);
//先画个小圆点,圆心跟之前的一样,半径为10,一样只是个Path
cairo_arc (cr, xc, yc, 10.0, 0, 2*M_PI);
//Fill则把路径填充起来,落地成真实的图像
cairo_fill (cr);
//画两条半径
cairo_arc (cr, xc, yc, radius, angle1, angle1);
cairo_line_to (cr, xc, yc);
cairo_arc (cr, xc, yc, radius, angle2, angle2);
cairo_line_to (cr, xc, yc);
cairo_stroke (cr);
楼主 2015-12-05 13:09 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知