最近一直忙于cairo渲染接口的封装,目前该任务已接近尾声,在此记录一下学习cairo的心得体会。

cairo是linux系统上一款高质量2D图形渲染库,与Gdiplus库相比,其优势是支持绘制<1.0的线宽、提供了直接输出到内存buffer、pdf文件、png文件、ps、xlib、XCB、win32、svg的接口。关于cairo的简单介绍,详见这里。

学习cairo的过程,也是“山重水复疑无路,柳暗花明又一村”的一种体验。当前网上对cairo的介绍仅限于粗略的入门,想要很好的完成封装cairo画图接口的任务,还必须结合实际情况,深入到cairo源码的底层,去分析它的具体实现思路。此外,价值量最大的就是去查阅官方文档,在这里先放上“导学”部分的翻译内容,以及官方的函数文档。

使用cairo,重点在于对path的理解,以及对内存图像缓冲区数据的灵活读取(例如,使用cairo_image_surface_get_data或者使用cairo_image_surface_create_for_data取出或绑定的内存,其半透明像素点的颜色值与实际保存到png文件的颜色值并不相同,解决这个问题最简单的办法就是使用cairo提供的cairo_surface_write_to_png_stream和cairo_image_surface_create_from_png_stream接口,并且自定义满足自己任务要求的回调函数,如下所示)。

struct st_png_data
{unsigned char* pdata;unsigned int length;
};static cairo_status_t cairo_read_func_mine (void *closure, unsigned char *data, unsigned int length)
{st_png_data* pPngData = (st_png_data*)closure;memcpy(data, pPngData->pdata + pPngData->length, length);pPngData->length += length;return CAIRO_STATUS_SUCCESS;
}static cairo_status_t cairo_write_func_mine (void *closure, const unsigned char *data, unsigned int length)
{vector<unsigned char>& vecData = *((vector<unsigned char>*)closure);for (unsigned int i = 0; i < length; ++i){vecData.push_back(data[i]);}return CAIRO_STATUS_SUCCESS;
}st_png_data pngData = {(unsigned char*)pImgBinary, 0};
m_surface = cairo_image_surface_create_from_png_stream(cairo_read_func_mine, &pngData);vector<unsigned char> vecData;
cairo_surface_write_to_png_stream(m_surface, cairo_write_func_mine, &vecData);

此外,在绘制字体部分,你会发现cairo默认不支持输出汉字。仔细分析其原因,是因为其接口仅接受utf-8格式的字符串,而我们输入的字符串是ANSI编码格式或者Unicode编码格式,因此,我们只需转化一下输入字符串的编码格式便可以支持输出汉字了,比如使用boost库提供的boost::locale::conv::between方法进行转化。

写本文的目的只是想给初学cairo的新手一个快速入门的方法指导,以及对我遇到的一些难点的简单分析,如果你对GDI+十分熟悉,学习cairo也是大同小异的,凡是GDI+能实现的功能,我们都可以使用cairo实现,在此处顺便向大家推荐一篇不错的GDI+博文,可供大家对比学习。

学习cairo的心得及资料相关推荐

  1. 人工神经网络与深度学习学习历程,心得及资料分享

    人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点.它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同 ...

  2. 学习计算机在化学中的应用的心得,学习计算机多媒体技术心得体会

    随着科学技术的发展,特别是计算机技术的推广和普及,多媒体技术在课堂教学中得到了广泛的应用,体会. 一.中学教师特别是青年教师要善于学习.乐于学习计算机多媒体技术 计算机多媒体技术作为教学的一项辅助手段 ...

  3. 51单片机c语言学习感想,学习51单片机心得体会

    在这里给大家分享一下学习51单片机心得体会: 1.我从不说51是基础,如果我这么说,也请把这句话理解为微机原理是基础. 2.对51单片机的操作本质上就是对寄存器的操作,对其他单片机也是如此.库只是一个 ...

  4. matlab实验学习心得,matlab实验心得体会-学习matlab的心得体会

    matlab实验心得体会-学习matlab的心得体会 导语:通过对MATLAB的系统环境,数据的各种运算,矩阵的分析和处理,程序设计,绘图,数值计算及符号运算的学习,初步掌握了MATLAB的实用方法. ...

  5. 说一点学习python的心得

    本文非技术型文章,仅是一些学习python的心得.感悟,希望能帮到正在学习python的小白和小小白们. 选择合适的IDE 在这里不去争论哪一款IDE最好,只想对刚开始学习Python的同学说,请选择 ...

  6. Git 个人学习笔记及心得

    作为程序员如果你还不知道 Git 和 GitHub,说不过去吧,赶紧来学习一波. 一.认识GitHub Git 是个版本控制系统,说明白点就是进行代码的各种管理,比如你写错代码进行回滚啊.追寻 Bug ...

  7. java学习体会论文_关于学习java的心得体会

    关于学习java的心得体会 高中毕业后直接踏入社会的我,开始并不知道java是什么,根本也没有想过会学习这个,甚至于到现在从事这个方面的工作,那么java到底是什呢?Java是一门面向对象编程语言,不 ...

  8. 计算机多媒体培训心得体会,学习计算机多媒体技术心得体会

    <学习计算机多媒体技术心得体会>由会员分享,可在线阅读,更多相关<学习计算机多媒体技术心得体会(6页珍藏版)>请在人人文库网上搜索. 1.学习计算机多媒体技术心得体会随着科学技 ...

  9. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

    史上最牛的Linux内核学习方法论   点击下载 我的arm_linux移植笔记   点击下载 S3C2440完全开发流程   点击下载 Linux系统命令及其使用详解完整版   点击下载 Linux ...

最新文章

  1. MATLAB——scatter的简单应用
  2. 一篇文章7.4万,Nature 33种期刊开放获取新政引争议,社区斥其「寄生虫」
  3. 市值破400亿美元! 2021最火爆的「元宇宙」让互联网走到尽头?
  4. Java内存回收机制基础[转]
  5. linux c 打印错误信息error errno perror和strerror的区别
  6. linux php不支持crypt,(PHP)如何在CRYPT_BLOWFISH中使用crypt()?
  7. flask框架的参数传递以及MVC模式的图解
  8. 我们应该搞清楚分支预测
  9. WritePrivateProfileString等读写.ini配置文件
  10. jsfor循环终止_js 终止 forEach 循环
  11. 转:DotNET企业架构应用实践-架构师成长之路-如何成为优秀架构师
  12. Web Components 系列(八)—— 自定义组件的样式设置
  13. js基础-7-数组去重的es5和es6写法、数组扁平化
  14. 交换机端口镜像配置大全【汇集 22个各种品牌交换机】
  15. 使用eclipse打包app以及AndroidStudio和Eclipse中app签名修改等问题(SH1和MD5)
  16. chmod 755 究竟是什么鬼?
  17. 2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计,赶紧收藏起来吧
  18. Microsoft SQL Server2005服务器安全与维护-李晨光-专题视频课程
  19. 计算机图形学(光线追踪)
  20. css样式的格式是什么,css的语法格式是什么

热门文章

  1. Deep Network with Stochastic Depth(阅读笔记)一种随机深度的正则化方法
  2. Stochastic Variance Reduced Ensemble Adversarial Attack for Boosting the Adversarial Transferability
  3. 个人项目----吴华文
  4. 传真百科:雷雨天对传真通讯有影响吗
  5. Gradle下载慢解决方案
  6. 神级软件—uTinyRipper
  7. 处理 yarn 项目 has unmet peer dependency
  8. 【论文翻译】异构网络的影响与相似性
  9. java newline_“\ n”和Environment.NewLine之间的区别
  10. 产品读书《数字化生存》