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学习(一)相关推荐

  1. cairo学习简单总结

    https://www.aliyun.com/jiaocheng/55560.html 阿里云  >  教程中心   >  android教程  >  cairo学习简单总结 cai ...

  2. 深度学习中的遥感影像数据集~持续更新

    收集网络上公开的遥感数据集,欢迎补充 以下数据集均为网上开源数据集,若有遗误或不慎涉及侵权,烦请评论或留言联系 目前本项目共整理 场景分类数据集27个(整理完结): 目标检测数据集31+个(整理完结) ...

  3. 学习cairo的心得及资料

    最近一直忙于cairo渲染接口的封装,目前该任务已接近尾声,在此记录一下学习cairo的心得体会. cairo是linux系统上一款高质量2D图形渲染库,与Gdiplus库相比,其优势是支持绘制< ...

  4. cairo填充_Cairo学习笔记

    Cairo是一个支持多种输出设备的2D图形库.当前支持的输出目标(output target)包括:X Window System,Quartz,Win32,image buffers,PostScr ...

  5. 图像处理包magick - R版的PS - 学习笔记

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.在线绘图.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞 ...

  6. Linux bash学习

    更多生信和LInux学习,程序写作,请扫描关注生信宝典. https://mp.weixin.qq.com/mp/homepage?__biz=MzI5MTcwNjA4NQ==&hid=6&a ...

  7. 【python教程入门学习】用Python制作迷宫GIF

    安装 可以通过PyPi安装 或者通过Git 为什么你需要这个库? 问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣.我很羡慕别人能够做出生成迷宫的动画.我如何能够用Python自 ...

  8. 用 cairo 实现跨平台图形

    Table of Contents cairo 的优点和用途 为什么要学习一种新的绘图模型? cairo 呈现目标 cairo 的实际应用情况 用 cairo 进行概念性绘图 正确的 cairo 术语 ...

  9. C加加学习之路 1——开始

    C++是一门古老而复杂的语言,绝不是一门可以速成的语言,学习它需要有意识的刻意练习和长时间的持续不断的磨练.而大多数人不太能耐得住寂寞,喜欢速成,所以像<21天学通C++>这种书就比较受欢 ...

最新文章

  1. Java执行main方法,异常为:could not find the main class.program will exit
  2. python语言怎么输入-Python input()函数:获取用户输入的字符串
  3. python算不算编程_Python 并不适合职场编程
  4. 绿证交易全凭自愿 哪些企业会为其买单?
  5. Jenkins --SVN
  6. leetcode —— 24. 两两交换链表中的节点
  7. 换脸App爆红引发人脸盗刷担忧?看到支付宝的回应放心了...
  8. JavaScript中DOM的层次节点(一)
  9. httperf ---linux web站点压力测试
  10. tensorflow图片读取
  11. luogu3942将军令
  12. 计算机音乐乐谱打上花火,【B】打上花火
  13. 新的vulkan的SDK很难下载
  14. JS监听页面刷新及阻止页面刷新
  15. 计算机课程成绩认定管理办法,全日制普通本科生课程学分成绩对接认定管理办法...
  16. 一文搞懂tf.function
  17. svg 可视化操作_使用SVG和D3可视化浏览指标
  18. Websocket服务端和客户端通信(WSS、WS)
  19. 生产者与消费者的实现
  20. linux su -c 命令

热门文章

  1. 工作中遇到的小技巧 一(暂停更新)
  2. android解压rar方法,安卓手机如何解压rar/zip/7z等压缩包 详细图解教程
  3. 写作小技能:知识工作者的全套手艺
  4. vue 美食杰项目 登录验证
  5. OKHttp源码解析 (复用连接池)
  6. 前端框架介绍篇(小白专属)
  7. 在 uni-app 中 使用字体图标
  8. MySQL数据库实操教程(25)——权限管理
  9. Primitive Function 归一化方向角
  10. VMX(2) -- VMCS理解