FreeType2使用总结
一、FreeType2简介
1. 是一个免费、开源、可移植且高质量的字体引擎;
2. 支持多种字体格式文件,并提供了统一的访问接口;
3. 支持单色位图、反走样位图渲染,这使字体显示质量达到Mac的水平;
4. 采用面向对象思想设计,用户可以灵活的根据需要裁剪。
二、FreeType2字形约定
2.1 基本概念
字形:
字符映像叫做字形,单个字符能够有多个不同的映像,即多个字形。多个字符也可以有一个字形。
(可以理解为一个字形就是一种书写风格)
字符图:
字体文件包含一个或多个表,叫做字符图。用来将某种字符码转换成字形索引。一种字符编码方式(如ASCII、Unicode、Big5)对应一张表。
2.2字形轮廓
点:
字形文本的大小通常用点(point)表示。点是一种简单的物理单位,数字印刷中,一点等于1/72英寸。
设备的分辨率通常使用dpi(每英寸点数)表示的两个数。
点数大小和像素数的转换公式:
像素大数 = 点数*分辨率/72
轮廓线:
字形轮廓的源格式是一组封闭的路径,称为轮廓线。每个轮廓线划定字形的外部或内部区域,它们可以是线段或者Bezier曲线。
EM正方形:
字体在创建字形轮廓时,字体创建者所使用的假象的正方形。他可以将此想象成一个画字符的平面。它是用来将轮廓线缩放到指定文本尺寸的参考;它的尺寸越大,可以达到更大的字形分辨率。
注意:字形可以自由的超出EM正方形。
位图渲染:
指从字形轮廓转换成一个位图的过程。
2.3 字形度量
基线、笔和布局:
基线是一个假象的线,用来在渲染文本时知道字形,它可以是水平或垂直的。而且,为了渲染文本,在基线上有一个虚拟的点,叫做笔位置或原点,它用来定位字形。每种布局使用不同的规约来放置字形:
对水平布局,字形简单地搁在基线上;
对于垂直布局,字形在基线上句中放置。
图1. 水平布局及其度量
图2.垂直布局及其度量
重要的字体度量参数:
上下高度(ascent): 从基线到放置轮廓点最高(上)的距离;
下行高度(descent):从基线到放置轮廓点最低(下)的距离;
左跨距(bearingX): 从当前笔位置到轮廓左边界的水平位置;
上跨距(bearingY): 从当前笔位置到轮廓上边界的垂直位置;
步进宽度(advanceX): 相邻两个笔位置的水平距离(字间距);
字形宽度(width): 字形的水平长度;
字形高度(height): 字形的垂直长度。
三、FreeType2基本数据结构及API
3.1 基本数据结构
FT_Library(库对象):
FreeType库句柄对象
(不用关心其成员)
FT_Face(外观对象):
成员:
num_faces: 字体文件所含外观数
face_index: 当前外观索引值
num_glyphs: 当前外观所含字形文件数
num_charmaps: 字符表数
charmaps: 字符表数组
charmap: 当前字符表
glyph: 字形槽对象
size: 字形尺寸
FT_Size(尺寸对象):
成员:
face: 指向父对象(FT_Face对象)
metrics: 字形尺寸对象
FT_Size_Metrics(EM度量对象):
成员:
x_ppem: EM正方形水平像素数
y_ppem: EM正方形垂直像素数
ascender: EM正方形上行距离
descender: EM正方形下行距离
height: EM正方形高度
max_advance: 最大步进宽度
FT_GlyphSlot(字形槽对象):
成员:
face: 指向父对象(FT_Face对象)
metrics: 字形尺寸对象
advance: 步进对象
format: 字形槽格式
bitmap: 字形位图
bitmap_top: 位图上行距离
bitmap_left: 位图左行距离
outline: 字形轮廓线
FT_Vector(步进向量):
成员:
x: 水平步进值
y: 垂直步进值
FT_Bitmap(字形位图对象):
成员:
row: 位图行数(高度)
width: 位图宽度
buffer: 位图数据(默认8位灰度值)
FT_Glyph_Metrics(字形槽度量对象):
成员:
width: 字符映像宽度
height: 字符映像高度
horiBearingX: 左跨距(水平布局)
horiBearingY: 右跨距(水平布局)
horiAdvance: 水平步进
vertBearingX: 左跨距(垂直布局)
vertBearingY: 右跨距(垂直布局)
vertAdvance: 垂直步进
3. 2 基本API
FT_ErrorFT_Init_FreeType(FT_Library *alibrary):
函数功能:
实例化一个FreeType库对象,并返回给alibrary;
返回值:
若实例化成功则返回0。
FT_ErrorFT_Done_FreeType(FT_Library library):
函数功能:
销毁FreeType库对象library,包括其所有子对象;
FT_ErrorFT_New_Face(FT_Library library, const char*
filepathname, FT_Longface_index,FT_Face*aface ):
函数功能:
打开filepathname所指定的字体文件,加载第index个字体外观,并返回给aface指定的地址。
FT_ErrorFT_Set_Char_Size(FT_Face face,
FT_F26Dot6 char_width, FT_F26Dot6 char_height,
FT_UInthorz_resolution,FT_UIntvert_resolution ):
函数功能:
设置字体大小;
输入参数:
char_width: 以1/64点为单位的字符宽度;
char_height: 以1/64点为单位的字符高度;
horz_resolution: 设备水平分辨率;
vert_resolution: 设备垂直分辨率。
注意:
字符宽度或高度可设置为0,这意味着宽度或高度与另一个参数(高度或宽度)相同;
水平或垂直分辨率设置为0时表示使用默认的72dpi。
FT_UIntFT_Get_Char_Index(FT_Face face,
FT_ULong charcode):
函数功能:
在选定的字符表中,查找与给出的字符码对应的字形索引。
返回值:
如果没有字符表被选中,这个函数简单返回字符码;
如果该字符表总没有该字符码对应的字形图像,返回0。
注意:
0对应特殊的字符图像,通常会显示一个框或空格;
新建一个face时,默认是Unicode编码的字符表。
FT_Error FT_Load_Glyph( FT_Face face, FT_UInt
glyph_index, FT_Int32load_flags):
函数功能:
从face中装载第index个字形图像到字形槽中(face->glyph)。
输入参数:
load_flags:装载标志,默认FT_LOAD_DEFAULT。此时优先装载嵌入位图,若无,则装载该字形的缩放后的轮廓线。
face->glyph->format描述了字形图像的格式。若它的值是FT_GLYPH_FORMAT_OUTLINE,则可调用FT_Outline_Embolden加粗轮廓线;若它的值不是FT_GLYPH_FORMAT_BITMAP,则可通过FT_Render_Glyph把它转换成位图。
FT_Error FT_Outline_Embolden(FT_Outline* outline,FT_Pos strength):
函数功能:
将轮廓线加粗strength(26.6像素格式)。
FT_Error FT_Render_Glyph(FT_GlyphSlot slot,FT_Render_Moderender_mode):
函数功能:
将字形槽对象(slot)中的字形图像转换成字形位图。
输入参数:
render_mode:渲染模式位标志集合,默认使用
FT_RENDER_MODE_NORMAL渲染模式,表示渲染为一个高质量的抗锯齿(256级灰度)位图。
int main()
{FT_Library library;FT_Face face;FT_Error error;FT_UInt charIdx;wchar_t wch = 'a';char* buffer; // 用户申请的显示区域空间int startX, startY; // 字符图像开始装入的位置// 1. 初始化freetype2库error = FT_Init_FreeType(&library);// 2. 创建一个faceerror = FT_New_Face(library, "C:\\windows\\font\\SURSONG.TTF", 0, &face);// 3. 设置字体尺寸error = FT_Set_Char_Size(face, 16*64, 16*64, 96, 96);// 4. 获取字符图像索引charIdx = FT_Get_Char_Index(face, wch);// 5. 加载字符图像FT_Load_Glyph(face, charIdx, FT_LOAD_DEFAULT);if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE){FT_Outline_Embolden(&(face->glyph->outline), 16); // 加粗轮廓线}// 6. 获取字符位图if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP){FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);}// 7. 拷贝字符位图到用户的buffer中(用户私人函数)// 注意左边的计算方法ft2CopyBitmapToBuf(buffer, startX+face->glyph->bitmap_left,startY+face->size->metrics.ascender/64-face->glyph->bitmap_top,face->glyph->bitmap);startX += face->glyph->advance.x/64;
}
FreeType2使用总结相关推荐
- OpenGL学习笔记--字体库freetype2、FTGL
freetype2 FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, ...
- Ubuntu下mingw和aarch64交叉编译x264/x265/openssl/freetype2的ffmpeg
1.ffmpeg下载 前往ffmpeg官网下载地址下载需要的最新ffmpeg发布版本 2.ffmpeg编译选项说明 在ffmpeg官网中有对ffmpeg编译选项的部分说明内容如下: --enable- ...
- FLTK Debian 安装中make报错 X11 libraries No package ‘xft‘ found No package ‘freetype2‘ found
Q:Configure could not find required X11 libraries A:sudo aptitude install libx11-dev Q: to the PKG_C ...
- freetype2 使用
记录每天学习的内容 freetype2 使用 下载源代码在linux下编译 make make install https://blog.csdn.net/bryce_xiao/article/d ...
- linux调节字体大小加粗,支持任意大小字体freetype2显示(linux frambuffer)版
#include #include #include #include #include "gb2312.h" #include "freetype2.h" s ...
- freetype2 下载编译以及测试代码
源码: https://sourceforge.net/projects/freetype/files/freetype2 下载解压后,进入源码目录执行cmake-gui,界面中配置源码目录与编译目录 ...
- [电子书]项目储备二:用FreeType2绘制矢量字体、多行文字
[电子书]项目储备二:用FreeType2绘制矢量字体.多行文字 0 矢量字体 VS 点阵字体 1 FreeType2的介绍与基本使用 2 在LCD显示一个矢量字体,且可旋转 3 在LCD任意位置显示 ...
- linux上freetype2安装编译和使用
目前正在做linux上的opengl开发,是做视频图像处理的,需要叠加一下文字动画和特效.用opengl的做法是先生成文字贴图然后用opengl渲染在视频帧上就可以了,所以关键是要获得文字的图片,网上 ...
- FreeType2中文手册
前言:最近有个项目需要将中文英文泰文可以进行osd叠加到照片上.泰文处理转换成Unicode编码之前的博客已经详细介绍了,目前准备使用freetype矢量字体进行显示.在网上找到一个大佬的一篇文章写的 ...
最新文章
- Office 365发送超大附件
- C++作用域为类的常量
- 学python必会英语单词_Python必备常用英语词汇(一)
- Python文件的操作2
- 全局中断_【安全圈】微软更新造成Office 365等多个在线服务中断!
- MATLAB最新官方中文文档
- 【读书笔记->统计学】12-02 置信区间的构建-t分布概念简介
- php木马在线查杀_网站木马监控查杀扫描 ASP木马 PHP木马上传拦截
- 电信IHO-3000机顶盒高安版 悦ME刷机固件
- Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
- 3D体验平台品牌应用——ENOVIA
- java openCV调用摄像头并以窗体显示出来
- The GE Offer
- Applet【总结】
- kmp算法例题 登山
- 高中计算机学科教学计划,高中信息技术学科教学计划
- 字符串中的表达式计算
- python mongodb 随机抽取数据
- 微信中页面二次分享小图标丢失问题
- java员工试用期工作总结