cairo学习简单总结
https://www.aliyun.com/jiaocheng/55560.html
- 阿里云 > 教程中心 > android教程 > cairo学习简单总结
- cairo学习简单总结
发布时间:2018-01-18 来源:网络 上传者:用户
关键字: 简单 总结 学习 cairo
发表文章
- 摘要:Cairo将成为Linux2D绘图的未来内容:1,什么是Cairo2.理解cairo3.常用函数4.常用代码片断举例注意:目前"有理论没有实践"^_^=======================1,什么是Cairo=======================cairo是一个支持多种输出的向量图形库。也就是说,cairo是种画图的工具库,他可以向多种设备上画图,比如:cairo可以输出到png,可以输出到pdf,可以输出到ps,可以输出到xlib,可以输
Cairo将成为Linux 2D 绘图的未来
内容:
1,什么是Cairo
2.理解cairo
3.常用函数
4.常用代码片断举例
注意:目前"有理论没有实践"^_^
=======================
1,什么是Cairo
=======================
cairo是一个支持多种输出的向量图形库。也就是说,cairo是种画图的工具库,他可以向多种设备上画图,比如: cairo可以输出到png,可以输出到pdf,可以输出到ps,可以输出到xlib,可以输出到XCB,可以输出到win32,以后还要输出到svg
=======================
2.理解cairo
=======================
如果单纯的从代码上理解cairo,可能容易让人迷惑,所以,我们需要这么去理解cairo:
cairo是一个画笔,你可以为这个画笔设置颜色、设置字体、设置alpha,也可以用这个画笔去画出任何图形。 就像画家作画一样,你可以用画布,也可以用宣纸,也可以用其他的材料。cairo这支画笔,可以在png,ps,pdf或者Xlib上画东西。
例子如下:
/*利用cairo绘制一个png图形*/
#include
#include
#include
#include
int main()
{
FILE *file;
file=fopen("a.png","w");//打开一个文件,写入,文件名为a.png
cairo_t *cr; //声明一支画笔
cr=cairo_create();//创建画笔
cairo_set_target_png(cr,file,CAIRO_FORMAT_ARGB32,400,400);//设置画布,就是文件,a.png
cairo_set_rgb_color(cr,0,1,0);//设置画笔颜色,也就是红,绿,蓝,这里设置成绿色。
cairo_rectangle(cr,10,10,200,200);//画一个方块,位置从坐标(10,10)开始,宽200,高200
cairo_fill(cr);//填充,使用的颜色当然是上面设置的颜色。
cairo_move_to(cr,250,200);//将画笔移动到(250,200)
cairo_select_font (cr, "DongWen--Song",
CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);//为cairo设置一个字体,字体名DongWen--Song,非斜体,非粗体。
cairo_scale_font(cr,60);//缩放字体到60倍
cairo_show_text(cr,"hello world");//画出一个串
cairo_destroy(cr);//销毁画笔
fclose(file);//关闭文件
}
存成t1.c,然后使用下面的命令编译
gcc -o t1 t1.c -lcairo -I/usr/include/cairo
运行./t1,就生成了一个png图片文件,自己用工具打开看就可以了。
=======================
3.常用函数
=======================
操作画笔:
创建画笔。
cairo_create();
增加引用计数1。
cairo_reference();
减少引用计数1,如果返回0,所有的资源均被释放。
cairo_destroy();
保存当前cairo画笔。
cairo_save();
恢复上一次保存的cairo画笔,也就是说必须跟cairo_save()配对。
cairo_restore();
------------
描绘函数:
将一个path用线把轮廓描出来(这个函数绘制的是“空心”的图)。
cairo_stoke(cr);
将你前面画的东西(一个path)用指定颜色填充起来(这个函数绘制的是“实心”的图)。
cairo_fill(cr);
--------------
绘制图形:
方块:
cairo_rectangle(cr,10,10,100,100);
通过三点定义一道弧线:
cairo_curve_to(cr,x1,y1,x2,y2,x3,y3)
顺时针画一个圆弧,圆心x,y,半径radius,起始弧度from,终止弧度to.
比如从0,M_PI(在math.h里),就可以是一个半圆(开口的不会补上直线)。从0到2*M_PI就是一个整圆。
cairo_arc(cr,x,y,radius,from,to);
逆时针画一个圆弧.
cairo_arc_negative(cr,x,y,radius,from,to);
----------------
字体相关:
/*暂时不用,所以具体略过*/
创建字体,返回cairo_font_t * 。
cairo_ft_font_create();
设置字体,接受参数cairo_t *和cairo_font_t * 。
cairo_set_font();
选择正体Nimbus Sans L,请根据你系统的fc-list自己选择一个字体.
cairo_select_font(cr,"Nimbus Sans L", 0,0);
缩放字体,设置为60,虽然是scale,但是cairo内部实际上用的是字号
cairo_scale_font(cr,60);
显示hehe,蓝色,60号,Nimbus Sans L字体
cairo_show_text(cr,"hehe");
----------------
绘制路径相关:
好像是用了path就不用使用restore防止画笔移动的时候绘制额外直线了,见例子。
cairo_new_path(cr);
cairo_close_path(cr);
显示字体,类似cairo_show_text但可把字体当成path处理,所以,可以作出任何特效和变换。
cairo_text_path(char * utf8);
---------------
特殊图形绘制:
旋转函数,接受弧度做参数(用M_PI去除)
注意,使用时,它是影响全局的,也就是旋转了之后,后面画的一切都是旋转的.
所以旋转之前,做一下cairo_save,完成需要的旋转之后做一下cairo_restore能方便一点。
cairo_rotate(cr,angle);
缩放图形,谨慎使用,注意使用cairo_save和cairo_restore,这个函数可以在不同的surface上使用。
x指宽度缩放倍数,y指高度缩放的倍数。
cairo_scale(cr,x,y);
相对坐标,就是以你当前的点为坐标的原点,然后在移动或者画到制定的位置。
cairo_rel_move_to();
cairo_rel_line_to();
cairo_rel_curve_to();
=======================
4.常用代码片断举例
=======================
绘制:
画一个方块(stroke):
cairo_rectangle(cr,10,10,100,100);
cairo_set_line_width(cr,10)
cairo_set_rgb_color(cr,0,0,1);
cairo_stroke(cr);
画一条斜线(从0,0到100,100)(stroke):
cairo_move_to(cr,0,0);
cairo_line_to(cr,100,100);
cairo_set_rgb_color(cr,1,0,0);
cairo_stroke(cr);
画一个空心圆圈(stroke):
cairo_arc(cr,100,100,40,0,2*M_PI);
cairo_set_line_width(cr,3);
cairo_set_rgb_color(cr,1,0,0);
cairo_stroke(cr);
一个红色的实心圆(fill):
cairo_arc(cr,100,100,40,0,2*M_PI);//以100,100坐标为圆心画一个半径为40的圆(整圆)。
cairo_set_rgb_color(cr,1,0,0);//红色
cairo_fill(cr);//这时候得到的就是一个红色的实心圆。
----------------
写字:
/*将画笔移动到 60x60坐标。
注意:画文字的时候,这个坐标是文字左下角坐标,
如果你这时候移动到0,0坐标,其实你的文字将被画到400x400的画布之外。*/
cairo_move_to(cr,60,60);
//选择正体Nimbus Sans L,请根据你系统的fc-list自己选择一个字体
cairo_select_font(cr,"Nimbus Sans L", 0,0);
//设置为60,虽然是scale,但是cairo内部实际上用的是字号
cairo_scale_font(cr,60);
//显示hehe,蓝色,60号,Nimbus Sans L字体
cairo_show_text(cr,"hehe");
作一个空心字:
//使用了textpath这是通过cairo_show_text()做不到的。
cairo_text_path("Hello");
cairo_set_line_width(cr,1);
cairo_stroke(cr);
----------------
相对坐标:
cairo_move_to(cr,10,10);
//这时候点就在20,20上
cairo_rel_move_to(cr,10,10);
----------------
保存画笔:
/*大体过程:
1)保存画笔cairo_save(cr);
2)使用画笔...导致画笔发生变化...
3)恢复画笔cairo_restore(cr);
为保持完整性,代码有点多但不影响实质
*/
cairo_t * cr;
cr = cairo_create(); //声明画笔并创建
FILE *file;
file=fopen("c.png","w");
//设置目标为一个png文件,大小为400x400,色彩32位。
cairo_set_target_png(cr,file,CAIRO_FORMAT_ARGB32,400,400);
//$$$SAVE_1 保存画笔,这时候,画笔是干干净净的,没有任何操作。
cairo_save(cr);
//画一个矩形框,蓝色
cairo_rectangle(cr,10,10,200,200);
cairo_set_rgb_color(cr,0,0,1);
cairo_set_line_width(cr,4);
cairo_stroke(cr);
//写字
cairo_move_to(cr,60,60);
cairo_select_font(cr,"Nimbus Sans L", 0,0);
cairo_scale_font(cr,60);
cairo_show_text(cr,"hehe");
//$$$恢复到 SAVE_1,这时候的画笔又是干干净净的了。
cairo_restore(cr);
//SAVE_2 再保存一下,没准以后还会用到这个干净的画笔
cairo_save(cr);。
//写字
cairo_move_to(cr,70,70);
cairo_set_rgb_color(cr,1,0,0);
cairo_scale_font(cr,60);
//如果上面不作restore,而又进行了scale_font,这时候,字体就是60x60倍了
cairo_show_text(cr,"hehe");
//恢复到SAVE_2,这时候画笔仍然是初始状态。
cairo_restore(cr);
/*画了一个大半圆曲线。
如果,上面你没有恢复到画笔的初始状态,那么,这时候cairo画笔位于70,70,将画一条直线,捎带一个大半圆曲线,画线的方向是这样的,从当前坐标(70,70)到大半圆的开头,然后到大半圆结尾, 也就是顺时针方向。
*/
cairo_set_rgb_color(cr,0,1,0);
cairo_arc(cr,100,100,60,0, 1.5*M_PI);
cairo_set_line_width(cr,3);
cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND);
cairo_stroke(cr);
cairo_destroy(cr);
cairo_destroy(cr);
fclose(file);
--------------------
使用路径:
/*当前点在(70,70)那么在(100,100)处画圆会首先移动到该圆点,导致一条直线
*所以path可以解决这个问题见下面:
*/
cairo_move_to(70,70);
cairo_new_path(cr);
cairo_set_rgb_color(cr,0,1,0);
cairo_arc(cr,100,100,60,0, 1.5*M_PI);
cairo_set_line_width(cr,3);
cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND);
cairo_stroke(cr);
cairo_close_path(cr);
----------------
旋转:
cairo_t *cr;
cr = cairo_create();
cairo_set_target_.....;
//顺时针旋转30度。如果是-M_PI/6,也就是逆时针旋转30度了。
cairo_rotate(cr,M_PI/6);
cairo_rectangle(cr,10,10,100,100);//正方形
cairo_set_rgb_color(cr,1,0,0);
cairo_set_line_width(cr,10);
cairo_stroke(cr);
缩放:绘制一个平行四边形
cairo_t *cr;
cr = cairo_create();
cairo_set_target_.....;
//水平方向不变,垂直方向缩小为一半。
cairo_scale(cr,1,0.5);
//顺时针旋转30度。如果是-M_PI/6,也就是逆时针旋转30度了。
cairo_rotate(cr,M_PI/6);
cairo_rectangle(cr,10,10,100,100);//正方形,经过了scale之后,变成了长方形。
cairo_set_rgb_color(cr,1,0,0);
cairo_set_line_width(cr,10);
/*首先,上下两条边的粗细变成了原来的一半,同时这个图形不是一个直角矩形,而是一个平行四边形。
因为:
进行了scale之后,影响垂直方向的所有变换,都变成了原来的一半。所以,本来应该是每条边都旋转30度,现在 上下两条边都变成了旋转一半的度数,也就是15度。
当然,如果你要旋转一个长方形,只要直接用cairo_rectangle画一个长方形就OK了
注意,cairo_rotate只影响其后的内容,所以,不能在画完了在rotate。
*/
cairo_stroke(cr);
=======================
参考:
http://blog.chinaunix.net/uid-9525959-id-2001567.html
cairo学习简单总结相关推荐
- 表盘时针的html代码,html5画布操作的简单学习-简单时钟
html5画布操作的简单学习-简单时针 效果图 一.什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. ...
- 从零开始学习python编程-从零开始的Python学习 -- 简单的练习题
从零开始的Python学习 – 简单的练习题 目录: 从零开始的Python学习 -- 简单的练习题 前言: 顺序结构 A+B problem 苹果采购 分支结构 数的性质 闰年判断 Apple 循环 ...
- Kotlin学习——简单运用协程网络下载图片并更新到UI
kotlin学习 协程Coroutines学习 简单小Demo:通过协程下载一张网络图片并显示出来 文章目录 kotlin学习 前言 一.如何开启一个协程? 二.如何在项目中使用协程 增加对 Kotl ...
- Java网络编程学习——简单模拟在线聊天
Java网络编程学习--简单模拟在线聊天 学了java网络,也是该做个小案例来巩固一下了. 本次案例将使用UDP和多线程模拟即时聊天,简单练练手. 1.前提知识 需要知道简单的IO流操作,以及简单的U ...
- opencv学习—简单车牌识别操作(python)
opencv学习-简单车牌识别操作(python) 目录 opencv学习-简单车牌识别操作(python) 利用opencv进行车牌识别的详细流程如下: 1.车牌检测 2.分割车牌号并进行识别 3. ...
- STM32CubeMX与HAL库学习--简单的CAN回环测试
STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...
- 003.[python学习] 简单抓取豆瓣网电影信息程序
003.[python学习] 简单抓取豆瓣网电影信息程序 声明:本程序仅用于学习爬网页数据,不可用于其它用途. 本程序仍有很多不足之处,请读者不吝赐教. 依赖:本程序依赖BeautifulSoup4和 ...
- 项目学习——简单工厂模式优化
项目学习--简单工厂模式优化 一.前言 最近接触了一个项目,在这个项目中有一个EventHandler的概念,用于解决KAFKA不同类型的数据. 为了架构设计,开发成员在这里使用了工厂模式来处理这块请 ...
- 从零开始的Python学习 -- 简单的练习题
从零开始的Python学习 – 简单的练习题 目录: 从零开始的Python学习 -- 简单的练习题 前言: 顺序结构 A+B problem 苹果采购 分支结构 数的性质 闰年判断 Apple 循环 ...
最新文章
- 继承映射关系 TPH、TPT、TPCEntityFramework6.0
- 【Docker】网络模式
- yolov配置之:cuda、 cudnn安装
- 持续集成及部署利器:Go
- C# Redis之ServiceStack
- win10如何升级win11
- 动作捕捉系统用于模仿学习
- java闰年_编写java程序判断闰年。
- 举个栗子!Tableau 技巧(152):横向对比堆叠柱形图的各部分占比
- 廖雪峰——练习 请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']。
- 用C#写差异文件备份工具
- 【成神之路】开放设计编程相关面试题
- 修改“IP属地“,我们说不
- 仪器数据自动化采集,助力提升实验室管理效率
- 智慧档案馆一体化监控系统设计所需要的10条依据
- 修改Windows server远程桌面连接端口3389
- cf服务器优化,穿越火线走过12年存在服务器何时能得到优化?
- php空间xpyun_php云人才系统官方版-phpyun下载 v4.0 官方正式版 - 安下载
- 恩施好地方徒步旅游美不胜收
- ImportError: cannot import name ‘text_classification‘ from ‘torchtext.datasets‘