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的编译使用 的相关文章

  • 如何将 Tesseract OCR 库集成到 C++ 程序中

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

    我使用此链接克隆了 OCR 的 git 库 git clone git github com thiagoalessio tesseract ocr for php git 然后我只需按照以下步骤包含所需的文件example http th
  • 超正方体的替代方案

    Python 或 OpenCV 中是否有替代软件或任何库可以替代 Tesseract 进行字符识别 有什么建议的可以用Python实现的字符识别方法吗 Thanks This site https github com kba awesom
  • 目录:资产/tessdata

    我从 github 下载了 OCR 文本识别器 我的问题是 我想在不在线的情况下启动我的应用程序 但每次我在手机上安装 apk 时 它都会开始下载英语和 tesseract OCR 引擎 我找到了一个在线指南 其中说我必须在资产文件夹中创建
  • OCR 解决方案可以检测数字手写体吗?

    有没有一种解决方案可以很好地书写数字 1 10 我尝试了超正方体 但我只得到垃圾 理想情况下是 OSS 但商业也可以 OpenCV 现在附带手写数字识别 OCR 示例 你可以参考一下 http code opencv org project
  • 使用 Google App Script 从 google 驱动器中进行 OCR 图像

    我已经实现了以下脚本 使用图像 URL 对单个和多个图像进行 OCR function doOCRALL var selected SpreadsheetApp getActiveSheet getActiveRange getValues
  • OCR:图像转文本?

    在标记为复制或重复问题之前 请先阅读整个问题 我目前能做的如下 获取图像并裁剪 OCR 所需的部分 使用处理图像tesseract and leptonica 当应用的文档被裁剪成块 即每个图像 1 个字符 时 它提供 96 的准确度 如果
  • Microsoft Azure 认知服务手写检测边界框参数

    我目前正在使用Microsoft Azure 认知服务手写检测 API https learn microsoft com en in azure cognitive services computer vision quickstarts
  • Pytesseract 对于实时 OCR 来说非常慢,有什么方法可以优化我的代码吗?

    我正在尝试使用 python 创建实时 OCRmss and pytesseract 到目前为止 我已经能够捕获整个屏幕 其 FPS 稳定为 30 如果我想捕获大约 500x500 的较小区域 我已经能够获得 100 FPS 然而 一旦我包
  • 使用 OCR 识别上标字符

    我已经开始了一个简单的项目 其中它必须获取包含带有上标的文本的图像 然后通过使用 OCR 目前我使用的是 tesseract 它必须识别上标字符 普通字符 例如 我们有一个化学方程式 例如 Cl 但是当我使用超立方体识别它时 它给出了 Cl
  • 什么是可以检测手写的好的 OCR? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要一个库 可以在扫描手写纸后从其中提取文本 正常拉丁文本 它可以是一个免费的解决方案 甚至是我必须付费的解决方案 只要它可以处理大写字
  • 超正方错误 - 图像太大

    对于大小为 5 MB 的图像 我从 tesseract 收到以下错误 Tesseract 开源 OCR 引擎 v3 01 与 Leptonica 第0页 图片太大 39667 56133 处理过程中出错 文件大小是否有限制 或者是否有参数可
  • tess4j 与 Spring mvc

    我已经尝试将 tess4j 作为独立的 java 程序 并且它可以正常工作并给出文本输出 现在我正在尝试创建一个 spring mvc web 项目 在 pom 中添加 tess4j 的依赖项 并且我已在我的项目中添加了 tess4j 源
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • Tesseract 是否会忽略扫描文档中的任何非文本区域?

    我正在使用 Tesseract 但我不知道它是否忽略任何非文本区域并仅针对文本 我是否必须删除任何非文本区域作为预处理步骤以获得更好的输出 Tesseract 有一个非常好的算法来检测文本 但它最终会给出误报匹配 理想情况下 您应该在将图像
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 训练 tesseract 与 iPhone 一起使用

    我正在尝试在我的 iPhone 应用程序中使用 tesseract 2 04 只想检测数字 我在这里所做的首先是使用这篇文章交叉编译 tesseract 以生成 lib 文件http robertcarlsen net 2009 07 15
  • 如何从图像生成 tiff/box 文件以在 Windows 中训练 Tesseract

    我正在尝试在 Windows 中训练 Tesseract 为此我需要一对 tiff box 文件 并且我正在尝试使用 jTessBoxEditor 创建它 但它不接受图像作为输入 我也尝试过 boxFactory 但它无法正常运行 有谁知道
  • 无法将 Tesseract OCR 模块添加到 Android Studio

    我按照此处找到的分步指南进行操作 https www codeproject com Articles 840623 Android Character Recognition https www codeproject com Artic
  • 去除 OCR 图像处理中的背景颜色

    我正在尝试删除背景颜色 以提高 OCR 对图像的准确性 示例如下所示 我会将所有字母保留在后处理图像中 同时仅删除浅紫色纹理背景 是否可以使用一些开源软件如Imagemagick将其转换为二值图像 黑 白 来实现这一目标 如果背景有不止一种

随机推荐

  • 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