Cairo初探

cairo(2D图形库) 阅读详情

关于Cairo

Cairo是非常流行的开源2D图形渲染引擎库,它支持包括X-Windos,Win32,图像,pdf在内的各种输出设备。目前,Cairo已被广泛的使用在多个平台上来渲染图形界面,包括Firefox/Webkit-EFL/GTK+/Poppler等等。


编译安装Cairo


我们可以直接从Ubuntu的上下载cairo的稳定版:
sudo apt-get install libcairo2-dev
这里,为了使用Cairo的最新版,我们选择从git上下载源代码,并编译安装。

git clone git://anongit.freedesktop.org/git/cairo
cd cairo
mkdir cairobuild
./autogen.sh #这里可以加上配置选项
make 
sudo make install

Cairo的基本绘图模型与概念

在使用Cairo编程前,我们应该对于Cairo的基本绘图模型做一了解。这些模包括:表面(surfac),源(source),遮盖(mask),路径(path),上下文(context)和函数(verb)。
表面(surface)
Surface是Cair绘图的目标区域,在Cairo中使用cairo_surface_t表示。前面讲到Cair支持多种输出设备,因此我们绘图的目标区域可能是一张png图象也可能是一个pdf文件。不同目标的绘制的底层实现各不相同,而surfac对这些绘图的目标进行了一个抽象。因此,我们在创建了相应的surface后,只需要调用统一的函数对surface进行绘制,而不需要关心其后端(backend)的具体实现。
源(source)
Source指的是我们绘图是的具体的材料与格式,它包括画笔的粗细、颜色等等。在Cairo中,source不光可以是简的颜色,也可以是一种图案(patter)比如渐变色,甚至可以是一个表面(surface)。
遮盖(mask)
Mask相当于我们在绘图过程,用一张挖空了某些部分的纸遮挡在画布上。这样,在绘图过程中,只有挖空的部分会被我们所使用的源影响到,其余部分不受影响。
路径(path)
Path是指Cairo的绘制表面上一些虚拟的路径,它可能是一条线段,一个闭合的四边形,也可能是更加复杂的曲线。Path可以由Cairo的函数(在Cairo中被称为verb)所创建。但是,由于Path只是虚拟的路径,所以对Path的创建并不代表对表面绘制。接下来,我们还需要使用绘制函数(Cairo里称为drawing verb)进行绘制。比如,我们可以通过cairo_rectangle函数创建一个闭合的长方形的路径,然后通过cairo_fill函数填充这个长方形。
上下文(context)
Context是Cairo的核心结构,在Cairo中使用cairo_t来表示。它记录了当前状态下,与绘制有关的各种信息,包括之前介绍过的表面、源、遮盖、字体等等。 在任何绘制之前,我们都必须先创建一个cair_t结构,同时将它绑定到一个绘制表面上(surface)。下面的代码段创建了一个cairo_t,并将其绑定到一个640x480的png图象上。
cairo_surface_t *surface;
cairo_t *cr;


surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 640, 480);
cr = cairo_create (surface);
函数(verb)
Cairo中与绘制相关的函数被称为verb。目前Cairo支持五种drawing verb,分别是stroke(画线), fill(填充),text(文字),paint(滤镜),mask(遮盖)。其中,paint相当于是整个源进行了一次操作,比如cairo_paint_with_alpha函数可以设置一个alpha值,来对整个图象进行灰度的减少。
变换(transformation)
Cairo还提供类似OpenGL的坐标变换操作。变换操作包括:平移(cairo_translate),伸缩(cairo_scale),旋转(cairo_rotate)。我们也可以通过cairo_transform函数来指定一个复杂的变换。

例子

绘制一个矩形到rectangle.png图片上。
#include <cairo.h>

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

    int width = 640;
    int height = 480;
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
    cr = cairo_create (surface);

    /* Drawing code goes here */
    cairo_set_line_width (cr, 10);
    cairo_set_source_rgb (cr, 0, 0, 0);
    cairo_rectangle (cr, width/4, height/4, width/2, height/2);
    cairo_stroke (cr);

    /* Write output and clean up */
    cairo_surface_write_to_png (surface, "rectangle.png");
    cairo_destroy (cr);
    cairo_surface_destroy (surface);

    return 0;
}

绘制helloworld到helloworld.pdf上。
#include <cairo.h>
#include <cairo-pdf.h>
int
main (int argc, char *argv[])
{
    cairo_surface_t *surface;
    cairo_t *cr;
    cairo_text_extents_t te;


   /* Prepare drawing area */
    int width = 200;
    int height = 120;
      
    surface = cairo_pdf_surface_create ("helloworld.pdf", width, height);
    cr = cairo_create (surface);


    /* Drawing code goes here */
    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
    cairo_select_font_face (cr, "Georgia",
        CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_font_size (cr, 20);
    cairo_text_extents (cr, "helloworld", &te);
    cairo_move_to (cr, width/2 - te.width / 2 - te.x_bearing,
          height/2 - te.height / 2 - te.y_bearing);
    cairo_show_text (cr, "helloworld");


    cairo_destroy (cr);
    cairo_surface_destroy (surface);


    return 0;
}

gcc编译
使用gcc编译调用了cairo的源文件时,应指定cairo的头文件目录和库文件所在目录。假设源文件文件名为cairotest.c,cairo.h等头文件所在目录为/usr/include/cairo,cairo库文件所在目录为/usr/local/lib,则可以使用以下命令编译:
gcc cairotest.c -o cairotest -I/usr/include/cairo -L/usr/local/lib/ -lcairo
我们也可以使用pkg-config来配置cairo的目录,然后使用如下命令来编译:
gcc -o cairotest $(pkg-config --cflags --libs cairo) cairotest.c


Wayland的HDC:cairo绘图库 int os_create_anonymous_file(int size); // 创建临时文件,用于mmap。用完即删。 typedef cairo_t* HCAIRO; typedef struct _PAINTBUFFER { HBUFFER hBuffer; void *data; int bBusy; HCAIRO hdc; } PAINTBUFFER, *LPPAIN 阅读详情

相关推荐

Cairo使用指南

Cairo是一个用于创建矢量图形的开源库,它支持多种操作系统和平台,并提供了丰富的图形绘制功能。cairo_arccairo_fill以下是Cairo库中关于画线、画圆弧、填充颜色、填充图案、颜色渐变、设置透明度以及图片淡出等功能的示例说明。

哈哈星云 2222

Windows下编译Cairo

      Cairo是著名的图形引擎,通常但凡著名的东西都有它可取之处。于是乎拿来研究一下,研究的首要工作当然是编译它的源代码。综合考虑,在Windows的VS下编译,整个过程如下,详见参考资料1。

陈俞飞的专栏 7381

ubuntu Cairo图形库 环境搭建

Cairo官网:http://cairographics.org/ 根据官网指示,我使用如下语句安装好cairo库 sudo apt-get install libcairo2-dev 从官网拷贝代码(http://cairographics.org/FAQ/#compilation_flags):hello.c #include int main (int argc, c

zh19921107的专栏 9284

Cairo图形指南(3)

Cairo 后端Cairo 支持多种后端,本文基于几个示例讲述如何使用 Cairo 各种后端创建 PNG 图像、PDF 文件与 SVG 文件以及如何使用 Cairo 在 GTK 窗口中绘图。1. PNG 图像第一个示例 (example-1.c) 用于生成 PNG 图像。#include intmain (int argc, char *ar

shenbin1430的专栏 4052

cairo学习

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

Teresa-smida的专栏 1021

VLC编译错误难解 4 fatal error: cairo/cairo.h: 没有那个文件或目录

接着上一个错误继续编译,又出现了这个奇葩的错误,为什么说他是奇葩呢见截图 又是头文件没有找到,几乎都是这个问题,不用想了应该还是包含路径的问题。我们全局搜索一下cairo.h这个文件,如下图 1、看到上图的奇葩了吧,这个文件就在/usr/include/cairo这个目录内,再看看第一个错误的截图的包含路径里居然有,-I/usr/include/cairo,然后在tiger_inter...

cumtwys的专栏 2542

Cairo 初探

关于Cairo Cairo是非常流行的开源2D图形渲染引擎库,它支持包括X-Windos,Win32,图像,pdf在内的各种输出设备。目前,Cairo已被广泛的使用在多个平台上来渲染图形界面,包括Firefox/Webkit-EFL/GTK+/Poppler等等。 编译安装Cairo 我们可以直接从Ubuntu的上下载cairo的稳定版: [plain] vie

非常道的博客 7252

PSM倾向匹配详细步骤和程序

目录1.安装psmatch2统计包。2.数据准备3.数据分析及命令解读4.结果解读4.1模型拟合结果,此处无太多实际意义。4.2试验组可匹配的观测概览,按照命令中设定的匹配规则,试验组有8例患者未能匹配到合适对照。4.3结果解读的重点应该是对stata新生成的中间变量的解读。4.4均衡性检验结果4.5匹配结果的图示化5.Stata命令汇总最后留下两个问题给大家思考:题目 试验设计中,匹配的目的在于确保干预效应估计是建立在可比个体之间的不同结果的基础上。最简单的匹配方式是将干预组和对照组中协变量值相同的两个个

平平淡淡,戒急用忍,一生学闭嘴。 5万+

cairo 教程一

<!-- p {margin-bottom:0.08in} --> <!-- p {margin-bottom:0.08in} --> PC平台:linux(unbutu 10.04) 示例采用C语言实现,可使用gcc编译它们,编译命令格式如下: $gcc-o example `pkg-config --cflags --libs gtk+-2.

2422

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5768

抖音Web端私信Protobuf逆向解析实战

本文详细解析了抖音Web端私信通信的逆向过程,发现其核心采用WebSocket传输Protobuf序列化数据。通过抓包获取二进制样本,利用protoc工具进行原始解码,并逐步推导和编写出对应的.proto协议定义文件,最终实现模拟消息的编码与解码,为理解私有协议逆向提供了完整实战案例。

water的专栏 762

cairo学习简单总结

https://www.aliyun.com/jiaocheng/55560.html 阿里云  &gt;  教程中心   &gt;  android教程  &gt;  cairo学习简单总结   cairo学习简单总结 发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 简单 总结 学习 cairo 发表文章 摘要:Cairo将成为Linux2D绘图的未来内...

chengde6896383的专栏 3410

Angular 相关的知识点和项目汇总

Angular 知识点和项目汇总

weixin_45428910的博客 578

cairo 教程二

<!-- p {margin-bottom:0.08in} --> Cairo后端 Cairo支持多种后端,本文基于几个示例讲述如何使用Cairo各种后端创建PNG图像、PDF文件与SVG文件以及如何使用Cairo在GTK窗口中绘图。 1.PNG 图像 第一个示例(main.c)用于生成PNG图像。 #include int main (

2021

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

m0_62030579的博客 3608

AE 与 ISP 参数联动机制解析:自动曝光系统与图像信号处理模块协同设计实践

AE(自动曝光)并不是一个独立的图像控制模块,而是与 ISP(Image Signal Processor)深度耦合运作的系统协同体。其输出的曝光参数直接决定了图像处理链路中 Gamma 曲线选择、黑电平补偿、去噪级别、边缘增强等一系列关键参数的取值。本文基于主流平台(如高通、MTK、海思)的工程实战经验,详细剖析 AE 与 ISP 在曝光驱动、调节优先级、图像还原逻辑等环节的联动机制,并结合拍照与视频等不同场景,给出可落地的联调方法。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1528

cairo裁剪使用分析

cairo_arc (cr, 128.0, 128.0, 76.8, 0, 2 * M_PI); cairo_clip (cr); cairo_new_path (cr); /* current path is not consumed by cairo_clip() */ cairo_rectangle (cr, 0, 0, 256, 256); cairo_fill (cr); 一步一步分析: 1、cairo_arc其实只是在cairo_t里面.

sl8023dxf的专栏 1354

9、 量子支持向量机:从经典到量子的跨越

本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。

weixin_42433737的博客 184

[转载]Cairo 图形指南[转载]

欢迎阅读 Cairo 绘图指南,这份指南会向你讲述 Cairo 二维矢量绘图库的基本知识以及一些高级问题。指南中的示例采用 C 语言实现,其中大部分使用了 GTK+ 库。 二维矢量图形 计算机图形可分为两类,矢量图形与光栅图形。光栅图形是将图像表示为像素点集。矢量图形则是使用一些几何图元(点、直线、曲线、多边形等)表示图像,这些图元是使用数学公式生成的。 这两类计算机图形表达方式各有所长短。相较于光栅图形,矢量图形存在以下优越性: 图形文件更小 可任意缩放 平移、缩放、填充或旋转等图形变换...

maze的专栏 3531

告别 DIFY 构建卡顿 / 失败!巧用 Makefile 一键构建本地 WEB 镜像,附核心避坑指南

本文详细介绍了DIFY本地源码构建WEB镜像的完整流程,重点解决因官方npm源不稳定导致的构建失败问题。通过修改web/Dockerfile文件启用国内npmmirror镜像源,可大幅提升依赖下载速度和稳定性。在DIFY根目录执行封装好的make build-web命令即可一键完成构建,无需手动编写复杂docker命令。文章还提供了前置环境准备、构建结果验证等实用指导,帮助开发者高效完成DIFY前端二次开发后的镜像构建验证。

2501_93651177的博客 182

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

cairo填充_cairo图形库

简介提到cairo,估计很少知道这还是一个图形库的名字(http://cairographics.org),Linux的两大流行桌面环境KDE和Gnome,其对应的基础组件QT和GTK+,相对于框架性质的QT,GTK+依然保持着自由与开放的传统,从底层绘图到上层程序库都由其他开源库构成。cairo就是GTK+采用的底层图形库,负责构建图形界面。cairo是一款开源的2d矢量图形库,支持多种后端输出...

weixin_42365266的博客 754

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Ubuntu Cairo图形库 环境搭建

Cairo官网:http://cairographics.org/ 根据官网指示,我使用如下语句安装好cairo库 sudo apt-get install libcairo2-dev 从官网拷贝代码(http://cairographics.org/FAQ/#compilation_flags):hello.c #include <cairo.h> int main (in...

dingzj2000的专栏 5632

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Cairo学习(一)

Cairo 介绍 最近在看Cairo,准备做ofd生成图片。技术选型选了几天,编译过Mesa3D,但是好像不太适合。最后选择Cairo 2D绘图库,因为是在Linux下跑的,特地安装了个CentOS7编译Demo,发现可以运行。Cairo有直接绘制图片,也有渐变和矩阵转换,比较适合。 Windows编译和Linux编译参考官网:https://www.cairographics.org/download/ 绘图之前需要理解几个概念: surface(画布) context(上下文) path(路径) ma

q893332169的博客 6884

学习cairo的心得及资料

最近一直忙于cairo渲染接口的封装,目前该任务已接近尾声,在此记录一下学习cairo的心得体会。 cairo是linux系统上一款高质量2D图形渲染库,与Gdiplus库相比,其优势是支持绘制xlib、XCB、win32、svg的接口。关于cairo的简单介绍,详见这里。 学习cairo的过程,也是“山重水复疑无路,柳暗花明又一村”的一种体验。当前网上对cairo的介绍仅限于粗略的入门,想要

fifbro的博客 2962

cairo介绍一篇

Cairo将成为Linux 2D 绘图的未来,相信我,没错的。这是一个笔记,另外还有一个cairo粗斜体显示中文的补丁,这个补丁我永远也不会向外放,因为,这么作,就跟firefly和akito的做法一样,用一个错误的方法解决错误的问题。粗体实现,应该在freetype的GetBitmap之前就要完成,这样,任何基于freetype的东西都不再需要补丁了。这个文档会不断完善,也会跟着cairo的版本升级作修改,我希望最后这个文档能够涵盖cairo编程所有的东西,同时也希望有兴趣的能够一起来写这个文档。这个文档

bearJiang的专栏 7586

Qt中使用Cairo

因为工作中用Cairo来渲二维图形、所以下载了个Cairo来编译、同时编译了它的依赖库,这个过程还是比较曲折的。因为开始使用的编译方法不是很好,编译过程中出来了很多问题,后来将Zlib, Libpng,Pixman,Cairo的源代码直接剪出来。自己用VS建立工程,定义一些预定义宏编译。           在Qt中可以使用QPainter来渲染各种图形,但考虑到效率,和具体项目使用情况(渲染的

wang__sid的专栏 6341
上一篇: 在Ubuntu 14.04上安装最新版mesa
下一篇: 一周小节
flexwang_
博客等级 码龄14年 6粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值