一、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使用总结相关推荐

  1. OpenGL学习笔记--字体库freetype2、FTGL

    freetype2 FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, ...

  2. Ubuntu下mingw和aarch64交叉编译x264/x265/openssl/freetype2的ffmpeg

    1.ffmpeg下载 前往ffmpeg官网下载地址下载需要的最新ffmpeg发布版本 2.ffmpeg编译选项说明 在ffmpeg官网中有对ffmpeg编译选项的部分说明内容如下: --enable- ...

  3. 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 ...

  4. freetype2 使用

    记录每天学习的内容 freetype2 使用 下载源代码在linux下编译 make   make install https://blog.csdn.net/bryce_xiao/article/d ...

  5. linux调节字体大小加粗,支持任意大小字体freetype2显示(linux frambuffer)版

    #include #include #include #include #include "gb2312.h" #include "freetype2.h" s ...

  6. freetype2 下载编译以及测试代码

    源码: https://sourceforge.net/projects/freetype/files/freetype2 下载解压后,进入源码目录执行cmake-gui,界面中配置源码目录与编译目录 ...

  7. [电子书]项目储备二:用FreeType2绘制矢量字体、多行文字

    [电子书]项目储备二:用FreeType2绘制矢量字体.多行文字 0 矢量字体 VS 点阵字体 1 FreeType2的介绍与基本使用 2 在LCD显示一个矢量字体,且可旋转 3 在LCD任意位置显示 ...

  8. linux上freetype2安装编译和使用

    目前正在做linux上的opengl开发,是做视频图像处理的,需要叠加一下文字动画和特效.用opengl的做法是先生成文字贴图然后用opengl渲染在视频帧上就可以了,所以关键是要获得文字的图片,网上 ...

  9. FreeType2中文手册

    前言:最近有个项目需要将中文英文泰文可以进行osd叠加到照片上.泰文处理转换成Unicode编码之前的博客已经详细介绍了,目前准备使用freetype矢量字体进行显示.在网上找到一个大佬的一篇文章写的 ...

最新文章

  1. Office 365发送超大附件
  2. C++作用域为类的常量
  3. 学python必会英语单词_Python必备常用英语词汇(一)
  4. Python文件的操作2
  5. 全局中断_【安全圈】微软更新造成Office 365等多个在线服务中断!
  6. MATLAB最新官方中文文档
  7. 【读书笔记->统计学】12-02 置信区间的构建-t分布概念简介
  8. php木马在线查杀_网站木马监控查杀扫描 ASP木马 PHP木马上传拦截
  9. 电信IHO-3000机顶盒高安版 悦ME刷机固件
  10. Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  11. 3D体验平台品牌应用——ENOVIA
  12. java openCV调用摄像头并以窗体显示出来
  13. The GE Offer
  14. Applet【总结】
  15. kmp算法例题 登山
  16. 高中计算机学科教学计划,高中信息技术学科教学计划
  17. 字符串中的表达式计算
  18. python mongodb 随机抽取数据
  19. 微信中页面二次分享小图标丢失问题
  20. java员工试用期工作总结

热门文章

  1. DIY激光枪薄纱蟑螂!AI杀蚊子博士新作,项目已开源
  2. word转html linux java,Java-linux下如何代码实现word转换成html
  3. 游戏编程模式 - 观察者模式
  4. linux系统下解压缩
  5. 制造硅异质结太阳能电池的简化表面清洁
  6. 关于Ajax跨域的解决方案
  7. SQL 数字和字符串互转
  8. unity 删除父物体下所有子物体
  9. 第一个Flutter demo——实现无限循环列表
  10. 支付宝第三方支付保证数据的安全性