首页 > 其他分享 >FreeType编译与使用

FreeType编译与使用

时间:2024-03-26 19:55:07浏览次数:21  
标签:FreeType FT freetype library face 编译 使用 glyph

FreeType是一款免费用于渲染字体的开源库。

在使用该类库时,最好先过一遍官方文档,其中FreeType Glyph Conventions部分的文章必读。

编译

我们可以进入下载界面,点击任意一个地址下载源码。

这里笔者使用的是2.13.2版本,解压后会获得一个freetype-2.13.2文件夹。 进入目录freetype-2.13.2\builds\windows\vc2010,然后点击freetype.sln即可打开工程。

编译后进入freetype-2.13.2\objs\x64\Release可以获得freetype.dll以及 freetype.lib。

使用

静态链接Freetype

新建一个C++工程。将freetype.lib复制到工程目录下,接着右键工程->属性->VC++目录->头文件目录。这里添加freetype-2.13.2\include目录。(如果编译的是Debug,那么配置也需要是Debug。Release同理),复制freetype.lib文件到工程目录下面,并且对main函数所在代码添加#pragma comment(lib, "freetype.lib")指令。

然后复制#include <ft2build.h> #include FT_FREETYPE_H到main函数所在的代码。如果编译通过,表示工程已经正确加载freetype库。

渲染准备

在渲染字体之前,我们首先需要声明一个FT_Library类型的变量library ,然后对其调用FT_Init_FreeType初始化一下FreeType。FT_Init_FreeType( &library )
然后通过调用FT_New_Face函数初始化FT_Face类型的对象,这样我们就加载了对应的字体文件。
在渲染之前,我们还需要指定字体或者像素的大小。这里我们选择FT_Set_Pixel_Sizes函数直接设置像素的大小。

FT_Library  library;   /* handle to library     */
FT_Face     face;      /* handle to face object */

error = FT_Init_FreeType( &library );
error = FT_New_Face( library,"/usr/share/fonts/truetype/arial.ttf", 0, &face );
error = FT_Set_Pixel_Sizes(face,  0, 24);   //0表示宽度和长度一样

渲染文字

最后在渲染之前我们需要设置需要渲染的字符的编码,默认编码是Unicode。
我们选择“中"这个字符来渲染,他的编码是0x4E2D,我们可以通过编码网站来查询对应字符的编码。
得到编码之后,我们需要将调用FT_Get_Char_Index将字符编码转化为字符图形的索引glyph_index = FT_Get_Char_Index( face, charcode );
获得索引后,我们就可以调用FT_Load_Glyph将字符图形(glyph image)加载到face->glyph中。这个字符图形可以是点阵图,轮廓线或者其他格式。
加载图形后,我们可以通过face−>glyph−>format查看图片的格式,如果它不是FT_GLYPH_FORMAT_BITMAP点阵图,那么我们可以接着通过FT_Render_Glyph函数将其转化为点阵图。
详细过程可以查看FreeType获取字符图形

int charcode = 0x4E2D;
auto glyph_index = FT_Get_Char_Index(face, charcode);
int load_flags = FT_LOAD_DEFAULT;
error = FT_Load_Glyph(
    face,          /* handle to face object */
    glyph_index,   /* glyph index           */
    load_flags);  /* load flags, see below */

FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL;
error = FT_Render_Glyph(face->glyph,   /* glyph slot  */
    render_mode); /* render mode */

这个时候我们就已经获得了点阵图,可以通过face->glyph->bitmap获取,并且通过ConsoleRenderGlyph函数将其输出到控制台。具体代码看下面的完整代码小节。

完整代码

#include <iostream>
#include <ft2build.h>
#include FT_FREETYPE_H

#pragma comment(lib, "freetype.lib")

FT_Library  library;   /* handle to library     */
FT_Face     face;      /* handle to face object */


void ConsoleRenderGlyph(FT_GlyphSlot slot)
{
    for (int y = 0; y < slot->bitmap.rows; ++y)
    {
        for (int x = 0; x < slot->bitmap.width; ++x)
            putchar(" .:ioVM@"[slot->bitmap.buffer[y * slot->bitmap.width + x] >> 5]);
        putchar('\n');
    }
}

int main()
{
    auto error = FT_Init_FreeType(&library);

    error = FT_New_Face(library,"simsun.ttc", 0, &face);
    error = FT_Set_Pixel_Sizes(face,  0, 24);  

    int charcode = 0x4E2D;
    auto glyph_index = FT_Get_Char_Index(face, charcode);

    int load_flags = FT_LOAD_DEFAULT;
    error = FT_Load_Glyph(
        face,          /* handle to face object */
        glyph_index,   /* glyph index           */
        load_flags);  /* load flags, see below */

    FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL;
    error = FT_Render_Glyph(face->glyph,   /* glyph slot  */
        render_mode); /* render mode */

    ConsoleRenderGlyph(face->glyph);

    //std::cout << "Hello World!\n";
}

其他

字体对象

FT_Face face是 FT_FaceRec的句柄,一个字体对象存储了这个字体的全部全局信息。比如,我们可以通过face->num_glyphs获取该字体有几个字符图形。

参考资料

FreeTpye库学习笔记:将矢量字体解析为位图

C/C++:Windows编程—调用DLL程序的2种方法

FreeType Tutorial Simple Glyph Loading

标签:FreeType,FT,freetype,library,face,编译,使用,glyph
From: https://www.cnblogs.com/dewxin/p/18096729

相关文章

  • Git使用分支最常遇到的问题
    目录Git使用分支最常遇到的问题无法进入分支一、忽略.idea文件二、删除.idea文件三、进入分支四、正常的提交程序分支不能拉取2024/3/26Git使用分支最常遇到的问题无法进入分支前言:原项目克隆下来后,无法进入分支;原因是:检测到未追踪的文件(.idea文件),idea为了运行程序自动生成......
  • 使用 GoAccess 分析 Nginx 日志
    来源:https://cloud.tencent.com/developer/article/1449085 GoAccess是一款开源的且具有交互视图界面的实时Web日志分析工具,通过你的Web浏览器或者*nix系统下的终端程序(Terminal)即可访问。GoAccess能为系统管理员提供快速且有价值的HTTP访问统计,并以在线可视化......
  • 上传图片前端使用base64数据格式展示,后端数据库存储二进制文件
    添加时上传图片upload.render({elem:'#docImg',url:Feng.ctxPath+'/doctor/upload'//改成您自己的上传接口,before:function(obj){//预读本地文件示例,不支持ie8obj.preview(function(index,file,result){......
  • C#代码混淆器 ipaguard 的优势与使用
     摘要本文探讨了iOS开发的优势、费用以及软件开发方面的相关内容。通过分析iOS开发所采用的编程语言、开发环境、用户界面设计、应用审核流程以及应用领域等方面,展示了iOS开发的诸多优势和特点。虽然iOS开发具有高用户体验、统一的硬件和软件环境、良好的市场份额等优势,但也存......
  • VS、Qt编译遇到的错误
    ---1、404  NOTFOUND  downloading'http://mitk.org/download/thirdparty/DCMQI.tar.gz'failed       camke中的ep路径没有配置好---2、C4996'strcpy':Thisfunctionorvariablemaybeunsafe.Considerusingstrcpy_sinstead.Todisabledepre......
  • 关于WPF进度条的使用
    本文讲述如何在软件启动和窗体按钮操作时弹出进度条。运行环境:Win10、VS2022一、新建WPF项目。 二、新建WPF窗体。1、新建窗体,取名DefProcessBar.xaml。 2、设置窗体属性、样式。<Windowx:Class="WpfApp4.DefProcessBar"xmlns="http://schemas.microsoft.c......
  • 使用 Kotlin DSL 编写网络爬虫
    本博文将会通过一个网络爬虫的例子,向你介绍Kotlin的基本用法和其简洁有力的DSL。关于DSL按照维基百科的说法,DSL(domain-specificlanguage)是一种专注于某一特定应用领域的计算机语言。和我们常用的通用目的型语言(类如C,Java,Python等)相反,DSL并不承诺可用来解决一切可计算......
  • Go使用rocketmq实现分布式事务-demo
    本示例只是demo,没有接入mysqlrocketmq自行安装severpackagemainimport( "context" "fmt" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/primitive" "github.com/apache/rocketmq-clien......
  • Linux V4l2简单使用
    V4L2:VideoforLinuxtwo,缩写Video4Linux2,是Linux内核中的一个框架,提供了一套用于视频设备驱动程序开发的API。它是一个开放的、通用的、模块化的视频设备驱动程序框架,允许Linux操作系统和应用程序与各种视频设备(如摄像头、视频采集卡等)进行交互。V4L2提供了通用的API,使......
  • 使用TensorRT-LLM部署ChatGLM3
    说明:TensorRT-LLM是NVIDIA开发的高性能推理TensorRT-LLM是NVIDIA推出的一个专门用于编译和优化大语言模型推理的综合程序库。可在NVIDIAGPU上加速和优化最新的大语言模型(LLM)的推理性能。官网地址为:https://github.com/THUDM/ChatGLM3/blob/main/tensorrt_llm_demo/READ......