一、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级灰度)位图。

    1. int main()
    2. {
    3. FT_Library  library;
    4. FT_Face     face;
    5. FT_Error    error;
    6. FT_UInt     charIdx;
    7. wchar_t     wch = 'a';
    8. char*       buffer;     // 用户申请的显示区域空间
    9. int         startX, startY; // 字符图像开始装入的位置
    10. // 1. 初始化freetype2库
    11. error = FT_Init_FreeType(&library);
    12. // 2. 创建一个face
    13. error = FT_New_Face(library, "C:\\windows\\font\\SURSONG.TTF", 0, &face);
    14. // 3. 设置字体尺寸
    15. error = FT_Set_Char_Size(face, 16*64, 16*64, 96, 96);
    16. // 4. 获取字符图像索引
    17. charIdx = FT_Get_Char_Index(face, wch);
    18. // 5. 加载字符图像
    19. FT_Load_Glyph(face, charIdx, FT_LOAD_DEFAULT);
    20. if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
    21. {
    22. FT_Outline_Embolden(&(face->glyph->outline), 16); // 加粗轮廓线
    23. }
    24. // 6. 获取字符位图
    25. if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
    26. {
    27. FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
    28. }
    29. // 7. 拷贝字符位图到用户的buffer中(用户私人函数)
    30. // 注意左边的计算方法
    31. ft2CopyBitmapToBuf(buffer, startX+face->glyph->bitmap_left,
    32. startY+face->size->metrics.ascender/64-face->glyph->bitmap_top,
    33. face->glyph->bitmap);
    34. startX += face->glyph->advance.x/64;
    35. }

FreeType2使用总结(转)的更多相关文章

  1. freeType移植总结①——使用keil编译freeType2库

    在各个技术博客搜索相关资料后,终于将freeType的源码用keil工程编译通过,这里记录一下步骤和遇到的问题. 因为网上的资料都是旧版本freeType的工程,这里博主使用的是freeType2.9 ...

  2. MFC编译Freetype2.3.7

    从http://www.freetype.org下载源代码. FreeType2库源码包中包含多种环境与编译器下的make文件,其中还包含vc的项目文件. 我用的是VC,所以首先找到VC环境的项目文件 ...

  3. ffmpeg编译时freetype2 not found错误

    自己安装的libfreetype2在/usr/local/lib目录下export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

  4. opencv在图像显示中文

    在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...

  5. Web应用之LAMP源码环境部署

    一.LAMP环境的介绍 1.LAMP环境的重要性 思索许久,最终还是决定写一篇详细的LAMP的源码编译安装的实验文档,一来是为了给自己一个交代,把技术进行系统的归纳,将技术以极致的形式呈现出来,做为一 ...

  6. Ubuntu Server(Ubuntu 14.04 LTS 64位)安装libgdiplus2.10.9出错问题记录

    首先下载libgdiplus2.10.9安装包 wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.t ...

  7. ubuntu-14.04-server配置Jexus --安装步骤记录

    作者:郝喜路   个人主页:http://www.cnicode.com      博客地址:http://haoxilu.cnblogs.com 说明:我是Linux菜鸟,自己尝试配置Jexus服务 ...

  8. Asp.Net跨平台:Ubuntu14.0+Mono+Jexus+Asp.Net

    Asp.Net跨平台的文章园子里有很多,这里给自己搭建的情况做一下总结,方便以后查看. 参考网站:   http://www.linuxdot.net/(Linux DotNET大本营 )  http ...

  9. 1-web应用之LAMP源码环境搭建

    目录 一.LAMP环境的介绍     1.LAMP环境的重要性     2.LAMP组件介绍 二.Apache源码安装     1.下载Apache以及相关依赖包     2.安装Apache以及相关 ...

随机推荐

  1. Pycharm安装opencv与 无法安装PIL以及安装Pillow之后依然报错的解决办法

    Pycharm 安装opencv pycharm里自带了很方便的安装第三方库的方法,不需要自己去下载opencv包再pip install 在pycharm的File/Settings/Project ...

  2. 在遍历ResultSet的循环中再执行SQL会发生什么(前提:同一个Statement)

    如下面代码: Class.forName(DBParam.Driver).newInstance(); conn = DriverManager.getConnection(DBParam.DbUrl ...

  3. 20190916-01linux文件与目录结构 000 001

    1./bin 是Binary的缩写,这个目录存放着最经常使用的命令 2./sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序 3./home 存放普通用户的主目录,在 ...

  4. 仿VISIO连线

    说明: 1.未实现障碍物自动避让功能: 2.未实现添加图元到连线之间,连线自动避开新增图元功能: 后续再完善... version 1: package com.sunsheen.jfids.stud ...

  5. Linux系统小知识

    换Linux系统快半年了,刚开始总是碰到各种各样的问题,虽然斗解决了,由于没有记录,过一段时间就忘了,故在这里记录一下. 选择国内镜像源: Manjaro有一个很好用的命令rankmirrors.ra ...

  6. Java审计之SQL注入篇

    Java审计之SQL注入篇 0x00 前言 本篇文章作为Java Web 审计的一个入门文,也是我的第一篇审计文,后面打算更新一个小系列,来记录一下我的审计学习的成长. 0x01 JDBC 注入分析 ...

  7. 关于input框仿百度/google自动提示的方法

    引入jquery-autocomplete文件 链接:https://pan.baidu.com/s/1hW0XBYH8ZgJgMSY1Ce6Pig 密码:tv5b $(function() { $( ...

  8. 如何用canvas拍出 jDer's工作照

    背景 在京东,就职满五年的老员工被称作"大佬",如果满了十年,那就要被称之为"超级大佬"了. 从 2016 年 5 月 19 日开始,每一年的这一天都被定为京东 ...

  9. Mybatis如何执行Select语句,你真的知道吗?

    持续原创输出,点击上方蓝字关注我吧 作者:不才陈某 博客:https://chenjiabing666.github.io 前言 本篇文章是Myabtis源码分析的第三篇,前两篇分别介绍了Mybati ...

  10. 内置函数:循环调用函数map和filter

    1.map:循环调用函数,前面一定一定要加list,要不然不会被调用 map的格式:list(map(函数名,循环体)) #这里的函数只能写函数名,不要加() list(map(os.mkdir,[' ...