FreeType矢量字符库的介绍、交叉编译以及安装

FreeType矢量字符库的介绍

FreeType 是一个开源的跨平台字体引擎库,广泛用于 Linux 嵌入式系统中实现字符显示的功能。它提供了高效的 TrueType、OpenType 和其他字体格式的解析和渲染功能,在嵌入式开发中尤其适合用来绘制矢量字体和位图字体。

FreeType 的特点

  1. 多字体格式支持

    • 支持 TrueType (TTF)、OpenType (OTF)、PostScript 字体等主流字体格式。
    • 可解析嵌入式字体文件或通过文件系统加载字体。
  2. 高可移植性

    • FreeType 是纯 C 实现,可以轻松移植到各种嵌入式平台。
  3. 轻量级

    • 设计简洁,适用于资源受限的嵌入式设备。
  4. 渲染能力强

    • 支持矢量字体的抗锯齿渲染。
    • 支持位图字体的缩放和变形。
    • 提供字形的详细轮廓信息,可用于高级排版需求。

使用 FreeType 的流程

FreeType 的基本用法分为以下几个步骤:

  1. 初始化 FreeType 库
    使用 FT_Init_FreeType() 函数创建并初始化库对象。

  2. 加载字体
    使用 FT_New_Face() 加载字体文件,创建一个字体 face 对象。

  3. 设置字体大小
    调用 FT_Set_Pixel_Sizes()FT_Set_Char_Size() 设置字符的像素大小。

  4. 加载字符字形
    使用 FT_Load_Char() 加载单个字符,并获取它的字形信息。

  5. 渲染字形
    调用 FT_Render_Glyph() 将字形转换为位图数据,随后可以将位图数据绘制到显示设备。

  6. 释放资源
    释放 face 和库对象。


示例代码

以下是一个简单的使用 FreeType 渲染字符的示例代码:

#include <ft2build.h>
#include FT_FREETYPE_Hvoid render_text(const char *font_path, const char *text, int font_size) {FT_Library library;FT_Face face;// 初始化 FreeType 库if (FT_Init_FreeType(&library)) {printf("Could not initialize FreeType library\n");return;}// 加载字体if (FT_New_Face(library, font_path, 0, &face)) {printf("Could not load font\n");FT_Done_FreeType(library);return;}// 设置字体大小FT_Set_Pixel_Sizes(face, 0, font_size);// 遍历渲染每个字符for (const char *p = text; *p; p++) {if (FT_Load_Char(face, *p, FT_LOAD_RENDER)) {printf("Could not load character '%c'\n", *p);continue;}// 获取字形位图FT_GlyphSlot slot = face->glyph;FT_Bitmap bitmap = slot->bitmap;// 处理 bitmap 数据(例如绘制到屏幕)printf("Rendered character '%c' with width %d and height %d\n",*p, bitmap.width, bitmap.rows);}// 释放资源FT_Done_Face(face);FT_Done_FreeType(library);
}

嵌入式开发中的注意事项

  1. 字体资源的管理

    • 嵌入式设备通常存储空间有限,应选择合适的字体文件(例如简化版的 TTF 文件)。
    • 可以将字体文件存储在只读文件系统或嵌入程序中。
  2. 字符渲染的性能优化

    • 避免频繁加载字体文件。
    • 可预渲染常用字符到缓存中以减少实时渲染的开销。
  3. 显示设备适配

    • FreeType 输出的是字形的位图数据,需要结合显示设备的驱动将其绘制到屏幕上。
  4. 国际化支持

    • FreeType 提供 Unicode 支持,可以方便地显示多语言文本。
    • 开发时需注意字符编码的转换。

FreeType的交叉编译

01-确认交叉编译器gcc中有zlib库和libpng库

freetype 依赖于 libpng,libpng 又依赖于 zlib,所以我们应该:先编译
安装 zlib,再编译安装 libpng,最后编译安装 freetype。
但是,有些交叉编译器工具链里已经有 zlib库和freetype,所以我们需要确认下我们的gcc编译器工具链中有没有zlib库和libpng库,怎么看呢?
看交叉编译器工具链里有没有zlib库和libpng库的方法见下面这篇博文:
https://blog.csdn.net/wenhao_ir/article/details/144752237
确认有zlib库和libpng库后方可进行下面的操作。

如果没有zlib库和libpng库,则两个库的源码如下:
zlib库的源码下载链接:
https://pan.baidu.com/s/1Mn7AZZbXGJm-ajK04-zK3w?pwd=cmkv
libpng库的源码下载链接:
https://pan.baidu.com/s/10MG29Bw1-H88NkKlc-Aydw?pwd=kgbu

02-源码下载并解压

freetype-2.10.2源码下载地址:
https://pan.baidu.com/s/1rcAnUxwmugiMrNuR4UDsCg?pwd=hr5u

源码下载好后放到目录/home/book/usedlib
在这里插入图片描述
然后解压:
在这里插入图片描述

说明:以下编译、配置、安装过程参考我的另一篇博文:
tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录

03-编译配置(生成Makefile文件)

cd /home/book/usedlib/freetype-2.10.2
./configure --host=arm-buildroot-linux-gnueabihf --prefix=/

在这里插入图片描述

04-make及make install

首先确认交叉编译器gcc中有zlib库和libpng库
freetype 依赖于 libpng,libpng 又依赖于 zlib,所以我们应该:先编译
安装 zlib,再编译安装 libpng,最后编译安装 freetype。
但是,有些交叉编译器工具链里已经有 zlib库和freetype,所以我们需要确认下我们的gcc编译器工具链中有没有zlib库和libpng库,怎么看呢?
看交叉编译器工具链里有没有zlib库和libpng库的方法见下面这篇博文:
https://blog.csdn.net/wenhao_ir/article/details/144752237

确认有zlib库和libpng库后方可进行make的操作。

如果没有zlib库和libpng库,则两个库的源码如下:
zlib库的源码下载链接:
https://pan.baidu.com/s/1Mn7AZZbXGJm-ajK04-zK3w?pwd=cmkv
libpng库的源码下载链接:
https://pan.baidu.com/s/10MG29Bw1-H88NkKlc-Aydw?pwd=kgbu

确认有zlib库和libpng库后方可进行make的操作。

make

在这里插入图片描述
然后 make install

make install DESTDIR=$PWD/tmp

在这里插入图片描述
在这里插入图片描述

05-检查生成的动态库文件是否是运行于目标架构之上的

完成之后首先用readelf命令检查下生成的so动态库文件是否是运行于ARM架构的,有时候我们在编译配置阶段提供的gcc编译前缀是错的,但此种情况下系统make时不会报错,而会去用系统默认的编译器。

cd /home/book/usedlib/freetype-2.10.2/tmp/lib

在这里插入图片描述

readelf -h /home/book/usedlib/freetype-2.10.2/tmp/lib/libfreetype.so

运行结果如下:

ELF Header:Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF32Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              DYN (Shared object file)Machine:                           ARMVersion:                           0x1Entry point address:               0x6c60Start of program headers:          52 (bytes into file)Start of section headers:          2719560 (bytes into file)Flags:                             0x5000400, Version5 EABI, hard-float ABISize of this header:               52 (bytes)Size of program headers:           32 (bytes)Number of program headers:         5Size of section headers:           40 (bytes)Number of section headers:         35Section header string table index: 34

在这里插入图片描述
从结果截图可以清晰看出这个ELF的动态库文件是32位还是64位,并且还是运行于ARM架构上的动态库文件。

06-把头文件和库文件放到gcc交叉编译器能扫描到的位置

头文件放到指定目录

在这里插入图片描述

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include

命令如下:

cp -rd /home/book/usedlib/freetype-2.10.2/tmp/include/freetype2 /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/

在这里插入图片描述

库文件放到指定目录

在这里,我们把它复制到目录/usr/local/lib中,并重命为freetypelib,这样编译器编译别的工程时就能用到这个库了,这里得能命令复制,因为目录/usr/local/lib不是能随便写文件的,运行下面的命令:
在这里插入图片描述

sudo cp -rfd /home/book/usedlib/freetype-2.10.2/tmp/lib /usr/local/lib/freetypelib

在这里插入图片描述
这样就完成了库文件的放置。

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

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

相关文章

vue css box-shadow transition实现类似游戏中的模糊圈游走的感觉

先看效果&#xff1a; 代码如下&#xff1a; <template><div style"height: 800px"></div><divclass"rainbow-position"ref"host"><divv-for"config in colorStyles"class"one-shadow":style&q…

欧拉计划启航篇(一)

目录 1.什么是欧拉计划 2.简单介绍 3.访问不上去怎么办 4.第一题的代码编写 5.代码的优化 1.什么是欧拉计划 欧拉计划是和我们的数学知识相关的一个网站&#xff0c;但是这个网站上面的相关的问题需要我们去使用编程的知识去进行解决&#xff0c;因此这个适合对于想要提升…

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次&#xff0c;点赞17次&#xff0c;收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明&#xff1a;简单的布局组件&#xff0c;可容纳其他组件&#xff0c;并依据alignment属性精确指定内部组件的对…

无人零售 4G 工业无线路由器赋能自助贩卖机高效运营

工业4G路由器为运营商赋予 “千里眼”&#xff0c;实现对贩卖机销售、库存、设备状态的远程精准监控&#xff0c;便于及时补货与维护&#xff1b;凭借强大的数据实时传输&#xff0c;助力深度洞察销售趋势、优化库存、挖掘商机&#xff1b;还能远程升级、保障交易安全、快速处理…

springboot 配置跨域访问

什么是 CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&#xff0c;用于控制不同源的资源之间的交互。 在Web应用程序中&#xff0c;CORS定义了一种机制&#xff0…

Ubuntu离线安装Docker容器

前言 使用安装的工具snap安装在沙箱中&#xff0c;并且该沙箱之外的权限有限。docker无法从其隔离的沙箱环境访问外部文件系统。 目录 前言准备环境卸载已安装的Docker环境快照安装的Dockerapt删除Docker 安装docker-compose下载执行文件将文件移到 /usr/local/bin赋予执行权限…

【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData

组件继承于IBufferElementData&#xff0c;可以让一个实体拥有多个相同的组件。 using Unity.Entities;public struct MyBuffComponentData : IBufferElementData {public int num; }using System.Collections; using System.Collections.Generic; using UnityEngine; using U…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …

15、【OS】【Nuttx】OS裁剪,运行指定程序,周期打印当前任务

背景 接之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771 OS还是比较庞大&#xff0c;且上面搭载了Nsh&#xff08;Nuttx Shell&#xff09;&#xff0c;需要接入串口才能正常工作&#xff0c;一般调试的时候用&#xff0c;非调试…

学习 Python 编程的规则与风格指南

文章目录 1. Python 编程规则1.1 Python 的哲学&#xff1a;The Zen of Python1.2 遵守 PEP 81.3 Python 是大小写敏感的1.4 使用 Pythonic 风格 2. Python 编程风格2.1 命名风格2.2 注释风格2.3 文档字符串&#xff08;Docstring&#xff09;2.4 空格使用2.5 文件和代码组织 3…

Seata AT 模式两阶段过程原理解析【seata AT模式如何做到对业务的无侵入】

在分布式事务中&#xff0c;Seata 的 AT 模式&#xff08;Automatic Transaction&#xff09;是一种基于两阶段提交协议的事务模式。它通过自动生成数据快照&#xff08;before image 和 after image&#xff09;&#xff0c;实现了对分布式事务的高效管理。本文将详细解析 Sea…

中关村科金外呼机器人智能沟通破解营销难题

当今&#xff0c;传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性&#xff0c;难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员&#xff0c;成为企业的难题。中关村科金外呼机器人通过智能化沟通技术&#xff0c;为企业提供了一站…

旅游景点票价预测02

5.数据预处理 经过4的数据分析环节&#xff0c;我们得出了一些和目标特征‘price’关联度比较高的特征&#xff0c;现在将这些特征列进行提取 df.head(5)# 筛选对应的数据列 rs_df df[[price,comment,sight_comment_score,level,city,address]] # 判断是否有缺失值 rs_df.isnu…

“事务认证平台”:个人日常事务管理系统的诚信体系建设

3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为个人日常事务管理系统&#xff0c;属于开放式的平台&#xff0c;所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求&#xff0c;…

单片机与MQTT协议

MQTT 协议简述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布 / 订阅&#xff08;publish/subscribe&#xff09;模式的 “轻量级” 通讯协议&#xff0c;该协议构建于 TCP/IP 协议上&#xf…

小程序基础 —— 07 创建小程序项目

创建小程序项目 打开微信开发者工具&#xff0c;左侧选择小程序&#xff0c;点击 号即可新建项目&#xff1a; 在弹出的新页面&#xff0c;填写项目信息&#xff08;后端服务选择不使用云服务&#xff0c;开发模式为小程序&#xff0c;模板选择为不使用模板&#xff09;&…

【js】记录预览pdf文件

接口调用拿到pdf的文件流&#xff0c;用blob处理这个文件流拿到url&#xff0c;使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

“拍卖认证平台”:网上拍卖系统的诚信体系建设

2.1 B/S结构介绍 在早期&#xff0c;一些使用HTML语言编写的文件&#xff0c;再集合一些其它资源文件就可以组成一个最简单的Web程序&#xff0c;了解了Web程序也需要了解Web站点&#xff0c;它们之间的关系就是一个或者多个Web程序可以放在Internet上的一个Web站点&#xff08…

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

&#xff1a;羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言&#xff1a; 在当今数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师&#xff0c;…