Cairo学习(一)

本文介绍了如何在Linux环境下使用Cairo库进行PDF和PNG图片绘制,包括Surface(画布)、Context(上下文)、Path(路径)和Mask(遮罩)的基本概念。通过实例展示了直线、矩形、圆和文字的绘制方法,后续将探讨渐变和矩阵转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cairo 介绍

最近在看Cairo,准备做ofd生成图片。技术选型选了几天,编译过Mesa3D,但是好像不太适合。最后选择Cairo 2D绘图库,因为是在Linux下跑的,特地安装了个CentOS7编译Demo,发现可以运行。Cairo有直接绘制图片,也有渐变和矩阵转换,比较适合。

Windows编译和Linux编译参考官网:https://www.cairographics.org/download/

绘图之前需要理解几个概念:

  • surface(画布)
  • context(上下文)
  • path(路径)
  • mask(遮罩)

暂时这些就够了,首先surface,我的理解是画布。有的画布是图片,有的画布是窗口。

cairo_surface_t *surface;
//pdf 画布
surface = cairo_pdf_surface_create ("helloworld.pdf", width, height)
//png 画布
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 400, 400);

// 销毁画布
cairo_surface_destroy(surface);

有了画布,需要一个管理员,也就是上下文。

// 如果是gtk窗口就可以直接调用创建上下文的函数,无需创建surface(画布)
cairo_t *cr = gdk_cairo_create (widget->window);
// 有了画布,通过画布来创建上下文
cairo_t* cr = cairo_create(surface);

// 销毁上下文
cairo_destroy(cr);

路径很重要,绘图都会依赖它。如果学过PS就很容易理解路径,路径类似于PS中的选区。一定要有路径,我们才能绘图,通过描边或者填充绘制各种各样的图形。

遮罩就相当于掩码,可以进行透明遮罩。

为了演示方便,所以绘图都会在png上作画。以下就绘图之前和绘图之后通用代码:

int main()
{
    cairo_surface_t* surface =
        cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 400, 400);
    cairo_t* cr =
        cairo_create(surface);

    // 绘制,并获取图片名称
    // 调用不同的函数可以绘制不同的图形
    string fileName = line(cr);
    
    // 给图片添加后缀
    fileName += ".png";
    // 销毁上下文
    cairo_destroy(cr);
    //将绘制的结果写到图片中
    cairo_surface_write_to_png(surface, fileName.c_str());
    //销毁画布
    cairo_surface_destroy(surface);
	return 0;
}

直线

// 画直线
string line(cairo_t* cr)
{
    //设置颜色
    cairo_set_source_rgb(cr, 0, 0, 0);
    //设置线宽
    cairo_set_line_width(cr, 5);
    // 画第一条直线路径
    cairo_move_to(cr, 0, 0);
    cairo_line_to(cr, 400, 400);
    //画第二条直线路径
    cairo_move_to(cr, 400, 0);
    cairo_line_to(cr, 0, 400);
    //描边
    cairo_stroke(cr);

    return __FUNCTION__;
}

画直线的效果

画矩形

// 画矩形
string rectangle(cairo_t* cr)
{
    //设置颜色
    cairo_set_source_rgb(cr, 0, 0, 0);
    // 画一个矩形路径
    cairo_rectangle(cr, 50, 50, 200, 300);
    // 填充路径
    cairo_fill(cr);
    return __FUNCTION__;
}

画矩形的效果

画圆

#define M_PI 3.1415926535898
// 画圆
string circle(cairo_t* cr)
{
    //设置颜色
    cairo_set_source_rgb(cr, 0, 0, 0);
    // 画一个圆弧路径
    cairo_arc(cr,100,100,100,0,2* M_PI);
    // 填充路径
    cairo_fill(cr);

    return __FUNCTION__;
}

画圆的效果

画圆弧

// 画圆弧
string arc(cairo_t* cr)
{
    //设置颜色
    cairo_set_source_rgb(cr, 0, 0, 0);
    //设置线宽
    cairo_set_line_width(cr, 5);
    // 画一个圆弧路径
    cairo_arc(cr, 120, 120, 100, 0, M_PI);
    // 描边
    cairo_stroke(cr);

    return __FUNCTION__;
}

画圆弧的效果

画文字

//画文字
string text(cairo_t* cr)
{
    // 设置字体类型
    cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    // 设置字体大小
    cairo_set_font_size(cr, 32.0);
    // 设置颜色
    cairo_set_source_rgba(cr, 5.0, 0.0, 1.0, 0.5);
    // 设置开始坐标
    cairo_move_to(cr, 10.0, 50.0);
    // 绘制文字
    cairo_show_text(cr, "diff3.com");

    return __FUNCTION__;
}

画文字的效果

结尾

上面例子具体参数,可以参考官网文档。绘制的流程基本上就这些,接下来会更新怎么绘制渐变。渐变包括线性渐变和径向渐变,线性渐变和径向渐变将会在下篇文章讲。

官方教程:https://www.cairographics.org/tutorial/

注意:官方教程有个坑,利用了工作空间,参数的长度基本上都在1和0之间,如果你绘制一条直线,把参数照抄下来,会发现一片空白,什么也没有绘制。

Cairo 概念 ................................................................................................................................... 3 环境 (Context) ............................................................................................................................. 3 路径 (Path) ................................................................................................................................... 3 源 (Source) ................................................................................................................................... 3 外观 (Surface) .............................................................................................................................. 3 蒙板 (Mask) ................................................................................................................................. 4 图案 (Pattern) ............................................................................................................................... 4 二Cairo 后端 ................................................................................................................................... 4 1. PNG 图像 ................................................................................................................................. 4 2. PDF 文件 ................................................................................................................................. 5 3. SVG 文件 ................................................................................................................................. 6 4. GTK 窗口 ................................................................................................................................ 7 三 基本绘图 ..................................................................................................................................... 9 直线段 .......................................................................................................................................... 9 描绘 (Stroke) 与填充 (Fill) ..................................................................................................... 12 虚线 (Dash) ................................................................................................................................ 14 线帽 (Line caps) ........................................................................................................................ 17 线的交合 (Line joins) ................................................................................................................ 19 四 高级形状绘制 ........................................................................................................................... 21 基本形状..................................................................................................................................... 21 复杂的图形................................................................................................................................. 24 填充 (Fill) .................................................................................................................................. 27 纯色 (Solid color) .................................................................................................................. 27 图案 (Pattern) ......................................................................................................................... 28 渐变 (Gradient) ...................................................................................................................... 32 五 透明........................................................................................................................................... 35 透明的矩形................................................................................................................................. 35 淡出的效果................................................................................................................................. 37 “等待”的演示 ............................................................................................................................. 40 六 合成........................................................................................................................................... 43 七 裁剪与遮蔽 ............................................................................................................................... 46 裁剪 ............................................................................................................................................ 46 裁剪矩形..................................................................................................................................... 49 遮蔽 ............................................................................................................................................ 53 变换 ............................................................................................................................................ 55 平移......................................................................................................................................... 55 旋转......................................................................................................................................... 56 缩放......................................................................................................................................... 58 错切......................................................................................................................................... 60 椭圆......................................................................................................................................... 63 星星......................................................................................................................................... 65 七 文本........................................................................................................................................... 68 灵魂伙伴..................................................................................................................................... 68 个字接个字…… ................................................................................................................. 71 膨胀 ............................................................................................................................................ 73 八 图像........................................................................................................................................... 76 图像的显示................................................................................................................................. 77 垂帘效果(Blind Down) ......................................................................................................... 78 光谱效果..................................................................................................................................... 81
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值