Mint_21.3 drawing-area和goocanvas的FB笔记(四)

Cairo图形输出

cairo的surface可以是pixbuf, 可以是screen, 可以是png图,也可以是pdf文件 、svg文件、ps文件,定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图,如果surface是pdf, 则直接就输出pdf文件了,画图之前不妨按标准纸张设置图的尺寸,比如A4尺寸,这样即可生成A4尺寸的 pdf 文件。

下面的freebasic示例example输出 pdf svg ps 三种格式文件:

' This is file cairo_output.bas, an example for cairo library
' (C) 2011 by Thomas[ dot ]Freiherr[ at ]gmx{ dot }net
' License GPLv 3
'
' See for details
' http://www.freebasic.net/forum/viewtopic.php?p=163599&highlight=#163599
' http://cairographics.org/documentation/#INCLUDE ONCE "cairo/cairo.bi"
#INCLUDE ONCE "cairo/cairo-pdf.bi"
#INCLUDE ONCE "cairo/cairo-ps.bi"
#INCLUDE ONCE "cairo/cairo-svg.bi"'{612, 792},     /* PAGE_SIZE_LETTER */
'{612, 1008},    /* PAGE_SIZE_LEGAL */
'{841.89, 1199.551},    /* PAGE_SIZE_A3 */
'{595.276, 841.89},     /* PAGE_SIZE_A4 */
'{419.528, 595.276},     /* PAGE_SIZE_A5 */
'{708.661, 1000.63},     /* PAGE_SIZE_B4 */
'{498.898, 708.661},     /* PAGE_SIZE_B5 */
'{522, 756},     /* PAGE_SIZE_EXECUTIVE */
'{288, 432},     /* PAGE_SIZE_US4x6 */
'{288, 576},     /* PAGE_SIZE_US4x8 */
'{360, 504},     /* PAGE_SIZE_US5x7 */
'{297, 684}      /* PAGE_SIZE_COMM10 */CONST Pag_W = 595.276, Pag_H = 841.89 '                        A4 format
CONST M_PI = 4 * ATN(1) '                                             PiTYPE arc_seg_dataAS cairo_t PTR c_tAS DOUBLE xc, yc, ri, ra, a1, a2, fg, fb
END TYPE' draw a colored circle segment / farbiges Kreissegment zeichnen
SUB arc_seg(BYVAL seg AS arc_seg_data PTR)VAR pa = NEW cairo_path_tWITH *segcairo_arc_negative(.c_t, .xc, .yc, .ri, .a2, .a1)cairo_arc(.c_t, .xc, .yc, .ra, .a1, .a2)cairo_close_path(.c_t)pa = cairo_copy_path(.c_t)cairo_set_source_rgba(.c_t, 1, .fg, .fb, 0.9)cairo_fill(.c_t)cairo_append_path(.c_t, pa)cairo_set_source_rgb(.c_t, 0.0, 0.0, 0.0)cairo_stroke(.c_t)END WITHcairo_path_destroy(pa)
END SUB' draw / zeichnen
SUB DoDrawing(BYVAL C AS cairo_surface_t PTR)VAR seg = NEW arc_seg_data, t = "Press a key to output PS, PDF and SVG."WITH *seg.c_t = cairo_create(C)cairo_set_source_rgb(.c_t, 1.0, 1.0, 1.0) '         white backgroundcairo_paint(.c_t) '                                        fill pagecairo_set_line_width(.c_t, 0.5)VAR f = 0.3 * Pag_W.xc = f.yc = fFOR z AS INTEGER = 0 TO 1 '                        two center points.ri = 0.1 * fFOR j AS INTEGER = 1 TO 5 STEP 1 '                     five radius.ra = .ri + 0.35 * f / jFOR i AS INTEGER = 0 TO 5 STEP 2 '                three segments.a1 = 60.0 * M_PI / 180 * i.a2 = 60.0 * M_PI / 180 * (i + 1).fg = .ra / f.fb = .a1 / M_PI / 2arc_seg(seg)NEXT.ri = .raNEXT
'      cairo_stroke(.c_t).yc = Pag_H - f.xc = Pag_W - fNEXTcairo_set_font_size (.c_t, 0.15 * f)DIM AS cairo_font_extents_t fe '                         font datacairo_font_extents (.c_t, @fe)DIM AS cairo_text_extents_t te '                         text sizecairo_text_extents (.c_t, t, @te)cairo_move_to (.c_t, _ '                 lower left corner of textPag_W / 2 - (te.width / 2 + te.x_bearing), _Pag_H / 2 + (te.height / 2) - fe.descent)cairo_show_text(.c_t, t)cairo_show_page(.c_t)cairo_destroy(.c_t)END WITHcairo_surface_flush(C)cairo_surface_destroy(C)
END SUB' screen output / Bildschirmausgabe
SUB write_screen()VAR S_W = CUINT(Pag_W) + 1, S_H = CUINT(Pag_H) + 1SCREENRES S_W, S_H, 32VAR c_s_t = cairo_image_surface_create_for_data( _SCREENPTR, CAIRO_FORMAT_ARGB32, _S_W, S_H, S_W * LEN(single))SCREENLOCKDoDrawing(c_s_t)SCREENUNLOCKSLEEP
END SUB' file output / Schreibt eine Datei, pdf/svg/ps je nach Endung in fname
SUB write_file(BYREF fname AS STRING = "")DIM AS cairo_surface_t PTR c_s_tSELECT CASE LCASE(RIGHT(fname, 4))CASE ".pdf"c_s_t = cairo_pdf_surface_create(fname, Pag_W, Pag_H)CASE ".svg"c_s_t = cairo_svg_surface_create(fname, Pag_W, Pag_H)CASE ELSEc_s_t = cairo_ps_surface_create(fname, Pag_W, Pag_H)END SELECTDoDrawing(c_s_t)
END SUB' main / Hauptprogramm
write_screen()VAR f = "cairo_circle."
write_file(f & "pdf")
write_file(f & "ps")
write_file(f & "svg")
END 0

以往pdf格式输出的pdflib库在windows下非常受欢迎(协议:个人可用,但商业使用需交license费,QT应该也是类似的协议约束)。freebasic对初期的pdflib-lite.h做了bi重写,这样在freebasic下能够直接操作pdflib库进行pdf编程,和cairo的surface做图有些相似之处,也是move_to , line_to 的画线,show_text写字。

网上已经找不到编译好的 pdflib.so 库了,高版本的库与自带的.bi不匹配。意味着,使用高版本的pdflib需要改写 pdflib.bi ; 使用pdflib-lite, 则需要自己编译,也需要稍改动一下 pdflib.bi。

编译:

打开终端,进入PDFlib-Lite目录,执行:

./configure

make

sudo make install

编译完成后,在/usr/local/include/freebasic下找到 pdflib.bi, 用任意一款文本编辑器打开它,然后,替换所有的 as single 为 as double

库放在 /usr/local/lib下应该可以找到,如果找不到的话,在/etc/ld.so.conf.d下写一个自己的配置文件,系统的lib搜寻路径就会带上它去找lib 。它是个文本文件,里面放的是库的路径,文件名自己起,符合操作系统要求即可。

下面的freebasic的示例程序,生成 pdflib_test.pdf 文件。

#include once "pdflib.bi"dim as PDF ptr p
dim as integer font, textx, texty, x, y, w, h, fontsize, c, image
dim as string textp = PDF_new()
'' open new PDF file
if (PDF_open_file(p, "pdflib_test.pdf") = -1) thenprint "Error: could not open PDF file. Check to see if it is open by another application"print "Press any key to end..."  '' pause to allow error message to be readsleepend 1
end if'' some document information
PDF_set_info(p, "Creator", "pdflib_test.bas")
PDF_set_info(p, "Author", "GOK")
PDF_set_info(p, "Title", "FreeBASIC")'' start a new page, set font and size
PDF_begin_page(p, a4_width, a4_height)
font = PDF_findfont(p, "Helvetica-Bold", "host", 0)PDF_setfont(p, font, 12)'' Insert the logo
dim as string logofilename = exepath() & "/../../fblogo.gif"
image = PDF_open_image_file(p, "gif", logofilename, "", 0)
if image = -1  thenprint "Error: Couldn't read image file """ & logofilename & """"
elsew = PDF_get_value(p, "imagewidth", image)h = PDF_get_value(p, "imageheight", image)PDF_place_image(p, image, (a4_width - w)/2, a4_height-h-50, 1)'' Note: only close the image when you are finished with it. Keep it in'' memory if you plan on reusing it.PDF_close_image(p, image)
end if'' line drawing test
PDF_moveto(p, 25, a4_height-50 - h)
PDF_lineto(p, a4_width-50, a4_height-50 - h)
PDF_stroke(p)'' some output
texty = a4_height-50 - h -50                              '' Move down from line by 50
PDF_set_text_pos(p, 50, texty)
PDF_show(p, "This is horizontal text in Helvetica-Bold")  '' output texttextx = PDF_get_value(p, "textx", 0)                      '' determine text position
texty = PDF_get_value(p, "texty", 0)                      '' determine text position'' save state
PDF_save(p)
PDF_translate(p, textx, texty)                            '' move origin to end of text'' change coordinate system
PDF_rotate(p, -90)                                        '' rotate coordinates
PDF_set_text_pos(p, 30, 100)                              '' provide for distance from horiz. text
PDF_show(p, "vertical text")'' restore saved state
PDF_restore(p)PDF_continue_text(p, "horizontal text continues")'' text in red
PDF_save(p)
PDF_set_text_pos(p, 50, 440)
PDF_setcolor(p, "both", "rgb", 1, 0, 0, 0)
PDF_show(p, "Write some text in a box (Courier 10 - left justified)")
PDF_restore(p)'' Print in a box
text = "PDF Viewers support a set of 14 core fonts which need not be embedded in any PDF file. They are:" + chr(10) + chr(13) + _"Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, " + _"Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol & ZapfDingbats"fontsize = 10
font = PDF_findfont(p, "Courier", "host", 0)PDF_setfont(p, font, fontsize)x = 50
y = 350
w = 500
h = 7 * fontsize
c = PDF_show_boxed(p, text, x, y, w, h, "left", "")
if (c > 0 ) then'' C = number of characters truncated (0 means a fit)print "Not all characters could be placed in the box"
end if'' draw a box around text
PDF_rect(p, x-2, y-2, w+4, h+4)
PDF_stroke(p)'' tidy up
PDF_end_page(p)                                           '' close page
PDF_close(p)                                              '' close PDF document
PDF_delete(p)                                             '' delete the PDF "object"print
print "pdflib_test.pdf generated."
print
print "Press any key to continue..."                      '' pause to allow error message to be read
sleep

用它做个简历应该还行,可能也只是方便而已,现在的浏览器差不多都可以选中后保存为pdf文件,各种office也是直接就生成了。pdf虽有许多其它功能(水印、文本框等),但用的地方好像并不多,如果只是少量页面,cairo画图生成pdf方便,它是free的。

PDFlib-Lite 源码及编译库放在CSDN 了, lib-and-so文件夹中放的是freebasic用的修改好的pdflib.bi头文件和编译好的 libpdflib.so 库及软链接 libpdf.so ,没安装编译环境的话可直接将它们分别放在 /usr/local/include/freebasic下和/usr/lib/x86_64-linux-gnu下使用。

点击链接下载PDFlib-Lite 源码及编译库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270081.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本命令

一、基本命令 修改mysql端口号 vim /etc/my.cnf云服务器ssh端口修改 vim /etc/ssh/sshd_config1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启1.2…

使用mysqld --install命令时出现MSVCR120.dll文件丢失错误

Visual C 2013 and Visual C Redistributable Package https://support.microsoft.com/en-us/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package 进去之后先找到自己的版本,x64还是x86,下载 vcredit ,进行安装即…

小程序固定头部:CSS实现

效果图 代码逻辑:设置头部的高度,浮动固定后,再加个这个高度的大小的外边距 .weui-navigation-bar {position: fixed;top: 0px;left: 0px;right: 0px;height:90px; } .weui-navigation-bar_bottom{height:90px; }

高转化利器】Xinstall实现H5唤醒App,打开指定页面,轻松满足营销需求!

在移动互联网时代,App的拉新促活对于企业的发展至关重要。为了提升用户体验和转化率,Xinstall推出了一项强大的功能——H5唤醒App。通过这一功能,用户可以直接从Web页面拉起App,并在拉起过程中通过传参打开指定页面,满…

【Vue3】Hooks:一种全新的组件逻辑组织方式

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

MATLAB环境下基于离散小波变换的体外血管图像处理

下面简要介绍小波变换的部分应用。 信号去噪。小波去噪是根据有效信号和噪声信号在小波变换后表现出的不同特性实现的,一般可用于去除语音、图像、视频等中的噪声信号。小波去噪方法根据对小波系数的非线性处理方式分为三类,分别是小波变换模极大值去噪…

qt QRadioButton 及QButtonGroup 使用

QRadioButton 放在组合框QGroupBox中,再点击时,即使有多个QRadioButton按钮,同时选中的也就只有一个。 如下图所示, 对于多个QRadioButton,每个按钮都写一个槽函数是不太明智的选择,需要将QRadioButton放在…

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

excel导出标准化

虽然标题叫标准化,只不过是我自己的习惯,当一件事情变得流程标准化之后,开发程序就会飞快,开发评估工作总是 搞个1~2天,实则前端后端一起开发,1个小时就可以搞定。 1 前端 const exportXls async () >…

Hadoop配置日志的聚集——jobhistory不显示任务问题

问题: 一开始job history是正常的,配置了日志的聚集以后不管做什么任务都不显示任务,hdfs是正常运行,而且根据配置步骤都重启过了。 下面先po出日志聚集的操作步骤,再讲问题 1.配置yarn-site.xml cd $HADOOP_HOME/e…

常见的几种echarts类型

一:折线图 let option {tooltip: {},animation: false,grid: {top: "20%",bottom: "33%", //也可设置left和right设置距离来控制图表的大小left: 5%,right: 5%},xAxis: {boundaryGap:false,data: [1,2,3,4,5],axisLine: {show: true, //隐藏X轴…

工作微信统一管理(还带监管功能)

1.会话页面(可统一管理多个微信号、聚合聊天、手动搜索添加好友、通过验证请求、查看好友的朋友圈等) 2.聊天历史(可查看 所有聊天记录,包括手机.上撤回、删除的消息) 3.群发助手(可以一 -次群发多个好友和群,还可以选择定时发送,目前还在内测…

操作系统---第一课

操作系统: 控制和管理整个计算机系统的硬件和软件资源。向上层提供方便易使用的服务,是最接近硬件的一层软件。 功能:文件管理,存储器管理,设备管理,处理机管理。 操作系统的四个特征: 并发 &…

爬虫实战——scrapy框架爬取多张图片

scrapy框架的基本使用,请参考我的另一篇文章:scrapy框架的基本使用 起始爬取的网页如下: 点击每张图片,可以进入图片的详情页,如下: 代码实现: 项目文件结构如下 img_download.py文件代码 im…

【kubernetes】关于k8s集群的存储卷

目录 一、存储卷的分类 二、empty存储卷以及特点 三、hostpath存储卷以及特点 四、nfs存储卷以及特点 五、pvc存储卷 查看pv的定义 查看pvc的定义 实操:静态创建pv的方式 实现pvc存储卷 步骤一:先完成nfs的目录共享,需要准备不同的目…

自动驾驶革命:解密端到端背后的数据、算力和AI奇迹

作者 |毫末智行数据智能科学家 贺翔 编辑 |祥威 最近,特斯拉FSD V12的发布引发了业界对端到端自动驾驶的热议,业界纷纷猜测FSD V12的强大能力是如何训练出来的。从马斯克的测试视频可以大致归纳一下FSD V12系统的一些核心特征: 训练数据&am…

Linux笔记--make

使用上一节的 main.c、add.c、sub.c文件进行编译,编译的过程有很多步骤,如果要重新编译,还需要再重来一遍,能不能一步完成这些步骤?将这些步骤写到makefile文件中,通过make工具进行编译 一个工程中的源文件不计其数&a…

Sora:AI视频模型的无限可能与挑战

随着人工智能技术的突飞猛进,AI视频模型已成为科技领域的新焦点。OpenAI推出的AI视频模型Sora,凭借其卓越的技术性能和前瞻性,为AI视频领域的发展揭开了新的篇章。本文将从技术解析、应用场景、未来展望、伦理与创意以及用户体验与互动五个方…

<C++>【继承篇】

​ ✨前言✨ 🎓作者:【 教主 】 📜文章推荐: ☕博主水平有限,如有错误,恳请斧正。 📌机会总是留给有准备的人,越努力,越幸运! 💦导航助手&#x1…

03. Nginx入门-Nginx虚拟主机

Nginx虚拟主机简介 yum安装与源码安装一样,只是Nginx配置文件路径不一致,这里用的yum安装的配置文件路径。 利用虚拟主机的功能,可以在一台Nginx服务器上部署一个或多个虚拟主机。 虚拟主机主配置文件 注意:配置完成Nginx主配置…