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

news2025/1/11 14:56:11

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) '                                             Pi

TYPE arc_seg_data
  AS cairo_t PTR c_t
  AS 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_t
  WITH *seg
    cairo_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 WITH
  cairo_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 background
    cairo_paint(.c_t) '                                        fill page
    cairo_set_line_width(.c_t, 0.5)
    VAR f = 0.3 * Pag_W
    .xc = f
    .yc = f
    FOR z AS INTEGER = 0 TO 1 '                        two center points
      .ri = 0.1 * f
      FOR j AS INTEGER = 1 TO 5 STEP 1 '                     five radius
        .ra = .ri + 0.35 * f / j
        FOR 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 / 2
          arc_seg(seg)
        NEXT
        .ri = .ra
      NEXT
'      cairo_stroke(.c_t)

      .yc = Pag_H - f
      .xc = Pag_W - f
    NEXT
    cairo_set_font_size (.c_t, 0.15 * f)
    DIM AS cairo_font_extents_t fe '                         font data
    cairo_font_extents (.c_t, @fe)

    DIM AS cairo_text_extents_t te '                         text size
    cairo_text_extents (.c_t, t, @te)
    cairo_move_to (.c_t, _ '                 lower left corner of text
                   Pag_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 WITH
  cairo_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) + 1
  SCREENRES S_W, S_H, 32
  VAR c_s_t = cairo_image_surface_create_for_data( _
                SCREENPTR, CAIRO_FORMAT_ARGB32, _
                S_W, S_H, S_W * LEN(single))
  SCREENLOCK
  DoDrawing(c_s_t)
  SCREENUNLOCK
  SLEEP
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_t

  SELECT 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 ELSE
    c_s_t = cairo_ps_surface_create(fname, Pag_W, Pag_H)
  END SELECT
  DoDrawing(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 text

p = PDF_new()
'' open new PDF file
if (PDF_open_file(p, "pdflib_test.pdf") = -1) then
	print "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 read
	sleep
	end 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  then
	print "Error: Couldn't read image file """ & logofilename & """"
else
	w = 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 text

textx = 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.coloradmin.cn/o/1493567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode-第137题-只出现一次的数||

1.题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 2.样例描述 3.思路描述 先把数组排序&am…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟:“师兄,我又被鄙视了。说我的系统太差,测试不过关。” 我:“怎么说?” 师弟:“每次发布版本给程夏,都被她发现一些bug,太丢人了。师兄,有什么方法来衡量测试的…

vue2源码分析-vue入口文件global-api分析

文章背景 vue项目开发过程中,首先会有一个初始化的流程,以及我们会使用到很多全局的api,如 this.$set this.$delete this.$nextTick,以及初始化方法extend,initUse, initMixin , initExtend, initAssetRegisters 等等那它们是怎么实现,让我们一起来探究下吧 源码目录 global-…

2024年展望Android原生开发的现状,2024网易Android高级面试题及答案

没有稳定的工作,只有稳定的能力。 又到了万物复苏的季节,在程序猿这个行当里,作为 Android 开发出生的,在经历了八年的脱发生涯后,有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起,在 ReactNati…

基于SpringBoot+Vue实现的人力资源管理系统

系统介绍: 基于SpringBootVue实现的人力资源管理系统是为了提高企业人力资源管理水平而开发的。主要目标是通过对员工及人力资源活动信息(考勤、工资)等的编制来提高企业效率。 系统一共分为五大菜单项,分别是首页、薪资管理、权限管理、系统…

魔行观察-每日品牌监测-沪上阿姨-开店趋势

今日监测对象:沪上阿姨,监测时间段:2014年9月至2023年12月,发布时间:2024-03-05 数据获取地址:魔查查https://www.moxingdata.com/品牌基础信息 现有门店人均消费覆盖省份经营模式投资金额814416.531特许/…

工时管理软件:为什么企业需要工时跟踪?

工时跟踪对于企业经营来说,可能不是首要事项。工时跟踪有什么用? 管理学大师彼得德鲁克曾说过:If you can’t measure it, you can’t improve it(如果无法衡量,就无法改进)。企业经营也是同样道理&#x…

分布式系统中常用的缓存方案

1. 引言 随着互联网应用的发展和规模的不断扩大,分布式系统中的缓存成为了提升性能和扩展性的重要手段之一。本文将介绍几种在分布式系统中常用的缓存方案,包括分布式内存缓存、分布式键值存储、分布式对象存储和缓存网关等。 1.1 缓存在分布式系统中的…

FEP容量瓶多应用于制药光电光伏行业

常用规格:25ml、50ml、100ml、250mlFEP容量瓶也叫特氟龙容量瓶,容量瓶是为配制一定物质的量浓度的溶液用的精确定容器皿,常和移液管配合使用。广泛用于ICP-MS、ICP-OES等痕量分析以及同位素分析等高端实验。地质、电子化学品、半导体分析测试…

挑战杯 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

安防摄像头(IPC)的步进马达及IR-CUT驱动国产芯片——D6212

应用领域 安防摄像头(IPC)的步进马达及IR-CUT驱动。 02 功能介绍 D6212内置8路带有续流二极管的达林顿驱动管阵列和一个H桥驱动,单芯片即可实现2个步进电机和一个IR-CUT的直接驱动,使得电路应用非常简单。单个达林顿管在输入电…

android开发教程百度网盘,高并发系统基础篇

展望未来 操作系统 移动操作系统的演变过程,从按键交互的塞班功能机到触摸屏交互的Android/IOS智能机,从小屏幕手机到全面屏、刘海屏、水滴屏。任何系统无非干两件事:输入和输出,接收到外部输入信号后经过操作系统处理后输出信息…

如何减少AI中的偏见问题:八种方法避免AI偏见渗入模型

克服与避免 AI 偏见的八大方法 AI 中的算法偏见是一个普遍存在的问题,它虽然不可能完全消除,但却可以通过科学的方法积极地防止这种偏见。我们将在本文中围绕如何应对AI中的偏见问题展开深入的讨论。 您可能会回想起新闻中报道的一些存在偏见的算法示例…

深入理解RAM与ROM:计算机存储技术的核心

深入理解RAM与ROM:计算机存储技术的核心 在计算机科学领域,理解各种存储技术对于开发和维护高效、可靠的系统至关重要。本文旨在深入探讨两种基础且关键的存储形式:随机存取存储器(RAM)和只读存储器(ROM&am…

每日一练:LeeCode-面试题 02.07. 链表相交 【链表+迭代】 LeeCode-142. 环形链表 II【链表+集合】

每日一练:LeeCode-面试题 02.07. 链表相交 【链表迭代】 LeeCode-142. 环形链表 II【链表集合】 LeeCode-面试题 02.07. 链表相交思路 LeeCode-142. 环形链表 II思路set集合方法 本文是力扣 每日一练:每日一练:LeeCode-面试题 02.07. 链表相交…

全自动气象站的工作原理

TH-CQX5全自动气象站是一款野外高精度监测气象数据的环境气象站设备。它结合了先进的传感器技术、自动化控制系统和远程通信技术,能够提供准确、实时的气象数据,为环境保护、气象研究、农业生产等领域提供重要的数据支持。 高精度传感器:全自…

PSINS工具箱笔记——函数定义

绘图函数: 时间进度条: timebar(用起来简单) 姿态转换: 欧拉角、姿态矩阵、等效旋转矩阵、姿态四元数、运载火箭使用的欧拉角之间的转换。 轨迹生成: seg trjsegment(seg, segtype, lasting, w, a, var…

BUUCTF-Misc-百里挑一

题目链接:BUUCTF在线评测 (buuoj.cn) 下载附件打开是一个流量包文件: 全是在传图片时候的流量,先把图片保存出来文件–>导出对象–>HTTP–>保存到一个文件夹 然后使用kali下的exiftool找到了一半flag exiftool *|grep flag 另外一半…

【C语言】编程题专项练习+答案

目录 1.删除有序数组中重复的数 2.用除二取余的方法,把任意一个十进制正数的二进制序列输出(不考虑溢出) 2.1如果是把任意一个十进制整数的二进制序列输出呢? 3.输出一个六行六列的整形矩阵,并输出其转置矩阵。矩阵…

保修期内经营者收取维修费用应遵循正当程序原则

↑↑↑“上海高院”头条号为您讲述精彩的法律科普内容 上海市第一中级人民法院在履行司法审判职能的同时,始终高度重视高质量案件工作,总结司法审判经验,努力提高司法审判质量。 在2020年全国法院系统优秀案例分析评选活动中,上海…