FreeType简介及在vs2010的编译使用

2023-11-17

FreeType库是一个开源、高质量、可扩展、可定制、可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。

FreeType有两个License,一个是BSD-stype,它兼容GPLv3;另一个是GPLv2,在使用时可以根据需要选择其中一种。

FreeType特点:(1)、它使得客户应用程序可以方便地访问字体文件,无论字体文件存储在哪里,并且与字体格式无关;(2)、能方便地提取全局字体数据,这些数据普遍存在于一般的字体格式中(例如,全局度量标准、字符编码/字符映射表等);(3)、能方便地提取某个字符的字形数据(例如,度量标准、图像、名字等其它任何数据);(4)、具备访问字体格式特定的功能(例如,SFNT表、多重控制、OpenType轮廓表等)。
         FreeType字体引擎执行流程:首先需要初始化FreeType库,然后依次根据字符的编码处理一个字符,把它转化为点阵的位图信息,最后根据字符的信息,在相应的地方把它显示出来。

字体是一组可以被显示和打印的多样的字符映像,在单个字体中共享一些共有的特性,包括外表、风格、衬线等。

字符映像叫做字形,根据书写、用法和上下文,单个字符能够有多个不同的映像,即多个字形。多个字符也可以有一个字形(例如Roman)。

每个字符映像都关联多种度量,被用来在渲染文本时,描述如何放置和管理它们。

字体轮廓的源格式是一组封闭的路径,叫做轮廓线。每个轮廓线划定字体的外部或内部区域,它们可以是线段或是Bezier曲线。

每个字形都有叫跨距和步进的距离,它们的定义是常量,但是它们的值依赖布局,同样的字形可以用来渲染横向或纵向文字。

字距调整指用来在一个文本串中调整重合字形的相对位置的特定信息。

FreeType轮廓:一个轮廓是2D平面上一系列封闭的轮廓线。每个轮廓线由一系列线段和Bezier弧组成,根据文件格式不同,曲线可以是二次和三次多项式,前者叫quadratic或conic弧,它们在TrueType格式中用到,后者叫cubic弧,多数用于Type1格式。每条弧由一系列起点、终点和控制点描述,轮廓的每个点有一个特定的标记,表示它用来描述一个线段还是一条弧。

边界框(bbox)是一个完全包含指定轮廓的矩形,所要的是最小的边界框。

控制框(cbox)是一个包含轮廓所有点的最小矩形,很明显,它包含bbox,通常它们是一样的。

一个位图和像素图通过一个叫FT_Bitmap的单一结构描述。

FreeType可以看作是一组组件,每个组件负责一部分任务,它们包括:(1)、客户应用程序一般会调用FT高层API,它的功能都在一个组件中,叫做基础层;(2)、根据上下文和环境,基础层会调用一个或多个模块进行工作,大多数情况下,客户应用程序不知道使用哪个模块;(3)、基础层还包含一组例程来进行一些共通处理,例如内存分配、列表处理、io流解析、固定点计算等,这些函数可以被模块随意调用,它们形成了一个底层基础API。

虽然FreeType是使用ANSI C编写,但是采用面向对象的思想,使这个库非常容易扩展,因此,有一些代码规约:(1)、每个对象类型/类都有一个对应的结构类型和一个对应的结构指针类型,后者称为类型/类的句柄类型;(2)、类继承通过将基类包装到一个新类中实现。

在FreeType中有若干种模块:(1)、渲染模块:用来管理可缩放的字形映像;(2)、字体驱动模块:用来支持一种或多种特定字体格式;(3)、助手模块:用来处理一些共享代码,通常被多个字体驱动,甚至是其它模块使用;(4)、autohinter模块:当一个字体驱动没有提供自己的hint引擎时,它可以在字形装载时处理各自的字形轮廓。

如果我们只希望对特定字体做简单的事情,则可以对FreeType进行裁决,有两种方式:(1)、修改/modules.cfg文件;(2)、修改/include/config/ftmodule.h文件。

         下载的源代码中freetype-2.5.5,/builds/windows/vc2010目录下有配置好的vs2010工程,打开编译,将会在/objs/vc2010,Win32或x64目录里生成相应的freetype255.lib和freetype255d.lib相应静态库。由于后期可能需要对FreeType进行裁决,所以这里通过源码自己编译下:

 

1.        从https://sourceforge.net/projects/freetype/files/下载最新的稳定版本ft255,解压缩;

2.        新建一个libFreeType静态库工程,将/include和/src下的.h和.c文件加入到此工程中,除/src/tools目录下的.h、.c文件,/src下的其它大部分模块,每个模块仅添加一个模块名的.c文件即可,如autofit模块,仅添加autofit.h即可,因为此文件中include了此模块中相应的.c文件,还有另外一些.c文件需添加,ftbitmap.c、ftglyph.c、ftinit.c、ftsystem.c;

3.        将/include目录添加到C/C++ --> General --> Additional Include Directories;

4.        将FT2_BUILD_LIBRARY添加到C/C++ --> Preprocessor --> Preprocessor Definitions;

5.        新建一个FreeTypetest控制台工程,验证生成库的正确性,各个文件内容为(测试代码来自于http://www.freetype.org/freetype2/docs/tutorial/step1.html):

stdafx.h:

 

#pragma once

#include "targetver.h"

#include <stdio.h>

//It contains various macro declarations that are later used to #include the
//appropriate public FreeType 2 header files.
#include "ft2build.h"
//FT_FREETYPE_H is a special macro defined in file ftheader.h. It contains some
//installation-specific macros to name other public header files of the FreeType 2 API.
#include FT_FREETYPE_H

#include "ftglyph.h"


stdafx.cpp:

 

 

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
#ifdef _DEBUG
	#pragma comment(lib, "../../../lib/dbg/x86_vc10/libFreeType[dbg_x86_vc10].lib")
#else
	#pragma comment(lib, "../../../lib/rel/x86_vc10/libFreeType[rel_x86_vc10].lib")
#endif


FreeTypetest.cpp:

 

 

#include "stdafx.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	FT_Library library; /* handle to library */
	FT_Error error;  
	FT_Face face; /* handle to face object */

	//1. Library Initialization
	//To initialize the FreeType library, create a variable of type FT_Library named, and call the function FT_Init_FreeType.
	error = FT_Init_FreeType(&library);  
	if (error) {  
		cout<<"an error occurred during library initialization"<<endl;  
		return -1;  
	}  

	//2. Loading a Font Face
	//From a Font File, Create a new face object by calling FT_New_Face. A face describes a given typeface and style.
	char* filename = "../../../testdata/kaiu.ttf";
	error = FT_New_Face(library, filename, 0, &face);

	if (error == FT_Err_Unknown_File_Format) {
		cout<<"the font file could be opened and read, its font format is unsupported"<<endl;
		return -1;
	} else if (error) {
		cout<<"the font file could not be opened or read, or that it is broken"<<endl;
		return -1;
	}

	//3. Accessing the Face Data
	//A face object models all information that globally describes the face.
	//Usually, this data can be accessed directly by dereferencing a handle, like in face−>num_glyphs.
	FT_Long numGlygphs = face->num_glyphs;
	FT_Long numFaces = face->num_faces;
	FT_String* familyName = face->family_name;
	cout<<"num_glyphs = "<<numGlygphs<<", num_faces = "<<numFaces<<", family_name = "<<familyName<<endl;

	//4. Setting the Current Pixel Size
	//FreeType 2 uses size objects to model all information related to a given character size for a given face.
	//error = FT_Set_Pixel_Sizes(face, 0, 16);
	error = FT_Set_Char_Size(face, 50 * 64, 0, 100, 0); 
	if (error) {
		cout<<"an error occurs when trying to set the pixel size to a value"<<endl;
		return -1;
	}

	//5. Loading a Glyph Image
	//Converting a Character Code Into a Glyph Index
	FT_UInt charIndex = FT_Get_Char_Index(face, 65); //65 => 'A'
	//Once you have a glyph index, you can load the corresponding glyph image
	error = FT_Load_Glyph(face, charIndex, FT_LOAD_DEFAULT);
	if (error) {
		cout<<"an error occurs when trying to load the corresponding glgyh image"<<endl;
		return -1;
	}

	//6. Simple Text Rendering
	error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
	if (error) {
		cout<<"an error occurs when trying to render glyph"<<endl;
		return -1;
	}

	FT_Glyph glyph;
	error = FT_Get_Glyph(face->glyph, &glyph);
	if (error) {
		cout<<"get glyph error"<<endl;
		return -1;
	}

	//convert glyph to bitmap with 256 gray 
	FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, 0, 1);  
	FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph;  
	FT_Bitmap& bitmap = bitmap_glyph->bitmap;  
	for (int  i = 0 ; i < bitmap.rows;  ++ i) {  
		for (int  j = 0 ; j < bitmap.width;  ++ j) {  
			//if it has gray > 0 we set show it as 1, 0 otherwise  
			printf(" %d ", bitmap.buffer[i * bitmap.width + j] ? 1 : 0); 
		}  
		cout<<endl; 
	}

	FT_Done_Glyph(glyph);
	FT_Done_Face(face);
	FT_Done_FreeType(library);

	cout<<"ok!"<<endl;
	return 0;
}

 

参考文献:

 

1.      http://wenku.baidu.com/link?url=66OQSAxrwbLGuaeylVH-fyDm1KDEe9hEvreZKzkwuJVCNlOa1Tth598tEDzskuKvW6yrpl8qcym1BbCPJFS_W4xSTsRmNu18zVFyy_Hcgcu

2.      http://www.docin.com/p-595358316.html  

 

3.      http://www.cnblogs.com/kex1n/archive/2010/11/24/2286445.html

 

GitHubhttps://github.com/fengbingchun/FreeType_Test

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeType简介及在vs2010的编译使用 的相关文章

  • 对抗锯齿文本进行 OCR

    我必须从 PDF 文档中 OCR 表格 我编写了简单的 Python opencv 脚本来获取单个单元格 之后新的问题又出现了 文本已抗锯齿且质量不佳 tesseract 的识别率很低 我尝试过使用自适应阈值来预处理图像 但结果并没有好多少
  • 如何将 Tesseract OCR 库集成到 C++ 程序中

    我正在尝试使用Tesseract OCR 库 https code google com p tesseract ocr 为了创建一个程序来读取电梯楼层号码的图片 我还没有找到任何关于如何将 Tesseract 库包含到 C 文件中的示例
  • 用于 OCR 的 Python OpenCV 倾斜校正

    目前 我正在开发一个 OCR 项目 需要读取标签上的文本 请参见下面的示例图片 我遇到了图像倾斜的问题 我需要帮助修复图像倾斜 以便文本是水平的而不是成角度的 目前 我正在使用的过程尝试从给定范围 下面包含代码 对不同角度进行评分 但这种方
  • PHP/jQuery/JavaScript 中的免费 OCR 处理 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费的 PHP OCR API 在 PHP jQuery 或 JavaScript 中有详细
  • OCR 处理前的图像预处理

    我当前的项目涉及将 pdf 中的文本转录为文本文件 我首先尝试将图像文件直接放入 OCR 程序 tesseract 中 但效果不佳 原始图像文件基本上是旧报纸 并且有一些背景噪音 我确信 tesseract 存在问题 因此 我尝试在将图像输
  • Android 中最好的 OCR(光学字符识别)示例 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个在android中运行OCR的例子 我做了一些研究并找到了一个在android中实现OCR的例子 https github co
  • 使用 Google App Script 从 google 驱动器中进行 OCR 图像

    我已经实现了以下脚本 使用图像 URL 对单个和多个图像进行 OCR function doOCRALL var selected SpreadsheetApp getActiveSheet getActiveRange getValues
  • Pytesseract 对于实时 OCR 来说非常慢,有什么方法可以优化我的代码吗?

    我正在尝试使用 python 创建实时 OCRmss and pytesseract 到目前为止 我已经能够捕获整个屏幕 其 FPS 稳定为 30 如果我想捕获大约 500x500 的较小区域 我已经能够获得 100 FPS 然而 一旦我包
  • 使用 python 和 opencv 检测图像中的文本区域

    我想使用 python 2 7 和 opencv 2 4 9 检测图像的文本区域 并在其周围画一个矩形区域 就像下面的示例图片所示 我对图像处理很陌生 所以任何想法如何做到这一点将不胜感激 有多种方法可以检测图像中的文本 我建议看看这个问题
  • 使用贝叶斯类进行数字识别

    我需要编写一个仅用于数字的 OCR 程序 我将使用 MNIST 数据集 问题是我不知道从哪里开始 有很多论文并没有真正解释算法 我对模式识别真的了解不多 所以我有几个问题 Q1 在哪里可以找到算法 或教程 Q2 如何对数字进行分类 我不需要
  • 提高 Python Tesseract OCR 的准确性

    我在用pytesseract https pypi org project pytesseract 随着openCV https pypi org project opencv python 在 Python 中的简单 django 应用程
  • Windows 7 OCR API

    我一直在审查 Office 2007 MODI OCR 的替代品 OneNote 2010 解决方案的质量 结果低于 2007 我注意到 一旦您安装了可选 tiff 过滤器 http technet microsoft com en us
  • Python Tesseract 无法识别这种字体

    我有这个图像 我想使用 python 将其读取为字符串 我认为这并不难 我发现了 tesseract 然后是使用 tesseract 的 python 脚本的包装器 所以我开始阅读图像 效果很好 直到我尝试阅读这张图像 我是否需要训练它来读
  • tesseract (v3.03) 输出为 PDF [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么会返回这个错误呢 root amd 3700 2gb ocr test tesseract l dan pdf png out pd
  • 用于屏幕文本的 OCR(光学字符识别)

    我正在尝试创建一个软件 通过捕获屏幕截图来自动化 PC 然后使用 OCR 光学字符识别 来查找要单击的特定按钮 例如 我已经有了鼠标和键盘控制部分 但现在 我需要 OCR 来处理屏幕截图 我发现 Tesseract OCR 似乎不能很好地处
  • 使用 python 突出显示图像中的特定文本

    我想突出显示网站屏幕截图中的特定单词 句子 截取屏幕截图后 我使用提取文本pytesseract and cv2 效果很好 我可以获得有关它的文本和数据 import pytesseract import cv2 if name main
  • 在 google Vision OCR 中被识别为单个单词的特殊字符?

    我试图让谷歌视觉 OCR 正则表达式可搜索 我已经完成了它 并且当文档仅包含英文字符时效果很好 但当有其他语言的文本时 它就会失败 发生这种情况是因为我在谷歌视觉单词组件中只有英文字符 如下所示 VISION API WORD COUNTE
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • 找不到仅适用于数字的 Tesseract 4.0 tessdata

    正如这篇文章中所说 pytesseract 仅使用 tesseract 4 0 数字不起作用 https stackoverflow com questions 46574142 pytesseract using tesseract 4
  • 从笔记本中提取文本

    我正在尝试从图像中提取手写文本 我使用 python 和 opencv 函数 例如 find contours 当我使用像这样的图像时 一切进展顺利 它工作得很好 因为我有一个简单的背景 但后来我用这张图片测试了它 由于背景中有笔记本的线条

随机推荐

  • PySide6-控件教程-005-QLabel标签控件-内边距、缩放、伙伴关系

    QLabel 标签控件 本文摘录自我的开源教程 PySide6 代码式教程 QLabel CSDN 平台仅做镜像 答疑 纠错请至 GitHub 提交 issue 内边距 QLabel还可以调整内边距 启用内容缩放 以更细致地调节显示效果 s
  • 与游戏世界交互作业

    一 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏内容要求 游戏有 n 个 round 每个 round 都包括10 次 trial 每个 trial 的飞碟的色彩 大小 发射位置 速度 角度 同时出现的个数都可能不同 它们由该 ro
  • 如何将Python项目部署到新电脑上运行?

    如何将Python项目部署到新电脑上运行 在工作中 可能需要在新服务器上部署项目代码 例如新增服务器 把测试环境的代码部署到生产环境等 在生活中 也会遇到换新电脑 需要将自己在旧电脑上写的 项目 代码拷贝到新电脑上运行 本文将这个过程中的关
  • SSH版本信息可被获取漏洞解决方法CVE-1999-0634

    直接执行 cd etc touch ssh banner change echo Version is empty gt gt etc ssh banner change cd etc ssh cp sshd config sshd con
  • log4j漏洞复现

    第一步 下载marshalsec 源码进行编译 https github com mbechler marshalsec 下载后进行编译打包 mvn clean package DskipTests 得到jar文件 在这里插入图片描述 第二
  • Stable Diffusion 系列教程

    目录 1 提示词 基本的规则 2 提示词分类 2 1内容性提示词 2 2 画风艺术派提示词 2 3 画幅视角 2 4画质提示词 3 反向提示词 3 1 内容性反向提示词 3 2 画质性反向提示词 4 实例分析 5 权重 5 1 方法一 5
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • java七大排序——7_归并排序

    归并排序 将数组分为2块 再到每一小块再分为两块 直到最后一个元素为一块 然后进行有序数组合并 最终合并为一个有序数组 代码实现 public static void mergeSorts int array mergeSortsInter
  • 软件设计师--结构化开发

    结构化开发 耦合 真题 内聚 真题 设计原则 真题 系统文档 真题 数据流图 数据流图基本数据元素 外部实体 数据存储 加工 数据流 父图子图平衡 加工既要有输入数据流也要有输出数据流 数据守恒 真题 数据字典 真题 杂题精选 耦合 真题
  • [1051]python yagmail发邮件

    文章目录 安装 开通SMTP服务 常用邮箱host以及port yagmail 可以更简单的来实现自动发邮件功能 github项目地址 https github com kootenpv yagmail 安装 pip install yag
  • 备战金九银十: GitHub 上标星 46k+的《10 万字Java面试总结》,助你搞定面试官

    不论是校招还是社招都避免不了各种面试 笔试 如何去准备这些东西就显得格外重要 不论是笔试还是面试都是有章可循的 我这个有章可循 说的意思只是说应对技术面试是可以提前准备 运筹帷幄之后 决胜千里之外 不打毫无准备的仗 我觉得大家可以先从下面几
  • python tkinter 点击按钮选择文件,返回文件路径

    关于python tkinter 点击按钮选择文件 返回文件路径 这个方法我找了好几天 终于曲线救国实现了 首先分为两步 1 设计对话框选择文件 下面的代码搞了好几天 才发现全局变量的获取 必须放在root mainloop的最后 反正网上
  • MAC软件推荐(Java方向)

    MAC软件推荐 Tabby 终端控制工具 keka 解压工具 typora Markdown工具 QuickRedis Redis视图工具 UTM 虚拟机 Navicat Premium 数据库工具 Adobe Photoshop CC 2
  • Android-App的设计架构经验谈,终获offer

    前言 想要成为一名优秀的Android开发 你需要一份完备的知识体系 在这里 让我们一起成长为自己所想的那样 学算法真的很痛苦 虽然大数据现在很火 但找到适合自己定位的职业也未尝不是一种合理选择 投百度的经历非常坎坷 想写出来和大家分享一下
  • runtimeService 运行时服务组件

    在Activiti中 启动一个流程后 会创建一个流程实例 ProcessInstance继承Execution 两个都是接口 每个流程实例至少会有一个执行流 Execution 当流程实例没有流程分支时 一般情况下只会存在一个执行流 假设出
  • 计算机采用二进制每秒,计算机为什么采用二进制

    计算机为什么采用二进制 2018 09 12 电脑为什么要采用二进制计算 计算机中的一切计算都是用二进制进行的 平时我们用的十进制是逢十进一 二进制则是逢二进一 我们用的算盘事实上有两种用法 一种是十进制 一种是十六进制 算盘中代表 五 的
  • 嵌入式Linux下用C语言写后端接口——CGI实现

    文章目录 简介 实验环境 下载CGIC库源码 配置CGIC编译 测试CGI接口 编写一个简单的获取表单的CGI接口 测试login cgi CGIC接口API 简介 CGI Common Gateway Interface 公共网关接口 是
  • Python更改文件的编码格式

    Python更改文件的编码格式 import os from chardet universaldetector import UniversalDetector def change encode file change 2 type d
  • MySQL Flashback 闪回功能详解

    1 简介 mysqlbinlog flashback 闪回 用于快速恢复由于误操作丢失的数据 在DBA误操作时 可以把数据库恢复到以前某个时间点 或者说某个binlog的某个pos 比如忘了带where条件的update delete操作
  • FreeType简介及在vs2010的编译使用

    FreeType库是一个开源 高质量 可扩展 可定制 可移植的字体引擎 它提供统一的接口来访问多种字体格式文件 包括点阵字 TrueType OpenType Type1 CID CFF Windows FON FNT X11 PCF等 F