字体类型

以Windows为例,有4种字体技术:
Raster:光栅型,就是用位图来绘制字形(glyph),每个字都以位图形式保存
Vector:矢量型,就是用一系列直线的结束点来表示字形
TrueType:使用一系列直线、曲线和一些提示(hint)命令来绘制字形
Microsoft OpenType:与TrueType一致
因为TrueType等字体的hint能够调节只想的长度和曲线的形状,所以,它能够在不同大小的字体中表现良好。而Raster字体则是跟设备具体分辨率相关,而Vector字体则好一些,但是它的绘制效率较低,要比其他字体慢很多。
对于Raster和Vector字体,一般其资源文件的文件名以.fon结尾,内部分成表述字体度量信息的header和实际的glyph数据这两部分,而对于TrueType和OpenType,则分成两个文件,第一个以.fot结尾,描述了相关的header,另一个则以.ttf命名,包含真正的内容。
 
字体和字符集

字符集就是Character Sets。字符集中的每个字符都有一个数字与之对应。在Windows中有以下几种字符集在使用。
Windows Character Set:本质上与US ASCII character set一样,第一个字符的数字是0x20,最有一个是0xFF。对于字符集上不存在的字符,会用默认字型显示,如Raster和Vector字体会用.来显示,而TTF则会用方框表示。
Unicode Character Set:用2个字节的数字来表示多达2^16个字符(好像后来增加到4个字节),每个字符有独立的数字表示。注意这里是字符集,而不是编码。
另外还有OEM Character Set、Symbol Character Set和Vendor-Specific Characters Sets等
 
TTF文件结构

TTF字体就是TrueType Font的意思,一般文件后缀是ttf,TTF还允许不同的字体组合在一个文件中,这时候后缀为ttc,就是TrueType collect的意思。
TTF文件是由一系列的表组成的。第一张表就是font directory,它很特殊,专门用来指示其他的表;进阶着就是包含font数据的其他表。每个表有一个四字符定义的表名,其中有些表是要求每个font文件必备的。如:
cmap 定义了字符到字形索引的对应关系,就是通过字内码得到表loca中使用的index。包含了多个子表,用于支持不同的平台和编码集
glyf 包含了字形数据,就是字形的轮廓定义和调整指令
head 定义了font header,字体全局信息
hhea 定义了水平header
hmtx 定义了水平metric
loca 定义了各字形在glyf表中偏移,根据cmap中得到的字形索引,在这里能够得到对应的字型在glyf表中的偏移
maxp 定义了最大值profile,用于为字体分配内存
name 定义字体名称、风格名以及版权说明等
post PostScript
有一个问题,字符如何在TTF文件中找到自己的字形呢,见下面的说明:
详细说明一下cmap表,因为这个表是最重要的。由于存在不同的系统和编码集,cmap表内涵多个子表,每个子表包含的基本信息有系统ID、编码集以及在表的偏移量。一般系统ID有3和1,前者是Windows,后者是Macintosh。一般而言,TTF文件至少包含两张子表,即Macintosh的Roman体系(PlatformID=1, Encoding=0)和Windows的UGI体系(PlatformID=3, Encoding=1),其中Encoding=1就是Unicode编码。这些子表中保存了字符内码到glyph index的对应。拿到glyph index的值可以到表loca中查到对应glyph表glyf中的偏移。
 
在Windows中,可以用下面的WIN32 API获得字体信息。
DWORD GetFontData(HDC hDC, DWORD dwTable, DWORD dwOffset, LPVOID lpbBuffer, DWORD cbData)

具体可见http://bbs.chinaunix.net/thread-2041402-1-1.html

 
FontForge:字体的开发工具

用于开发和编辑字体的开源工具,详见http://fontforge.sourceforge.net/
 
QT中的字体

QTE(Qt for Embedded)使用FreeType 2字体引擎来支持字体显示。比如TrueType(ttf),Postscript Type(PFA/PFB),Bitmap Distrubution Format fonts(BDF)等。同时QTE自己还支持Qt Prerendered Font(QPF)字体,是一种位图字体,不可缩放,作为QTE的本地字体。

 
TrueType是由苹果和微软为主开发的矢量字体技术(与之对应的是点阵字体),可以不变形的放大和缩小,文件名一般是*.fon、*.ttf和*.ttc,ttc是ttf的新标准,而fon是以前的老标准。目前有FreeType的字体引擎,作为一个软件库,能够帮助处理TrueType字体的显示。
 
BDF字体是X窗口系统的位图字体格式,其文件分成两部分,第一部分是描述整体属性的header,第二部分则是每个字型的属性和位图数据。
 
QPF字体格式仅用于QT/Embedded的不可缩放字体,属于QTE的官方字体,可用工具makeqpf,将ttf文件生成qpf字体文件。
 
在Qt中直接使用TTF字体或者PFA/PFB这些矢量字体,应用程序会在显示的时候需要将矢量信息计算成点阵形式,会占用大量的计算能力和RAM。如果选用BDF字体,则速度非常慢,而且也需要占用较多资源。QPF是位图字体,不需要再显示时计算点阵,且由于不可缩放,位图直接拿去显示即可,速度和资源占用是最好的。
 
当QTE应用启动时,会到$QT/lib/fonts目录下去寻找对应的字体文件,包括QBF和TTF字体文件,为兼容期间也会继续读取该目录下的fontdir文件。在代码中使用QFont来应用字体,如果选定字体不存在,QFont有内在的match策略,自动选择默认字体。

TTF字体基本知识及其在QT中的应用的更多相关文章

  1. QT支持TTF字体

    1.编译QT库时需要支持TTF字体 ./configure -qt-freetype -fontconfig ... 2.将TTF字符库拷贝到QT_QPA_FONTDIR下 # 注意,如果不清楚字体所 ...

  2. Qt中使用的C++知识和技能-你必须要了解的

    如果你不确定在使用Qt编程时自己所掌握的C++知识是否够用,这一节的内容会帮到你.这里给出了Qt自身以及在使用Qt进行编程时涉及到的C++知识,因此,通过阅读本节,你会了解你是否缺少一些C++技能. ...

  3. ttf字体转换成web中使用的woff、svg、eot格式字体

    网站地址:http://www.fontsquirrel.com/tools/webfont-generator(还可以缩小字体文件大小,强烈推荐) ttf转换成eot格式的字体软件:EOTFAST. ...

  4. 一文让你彻底了解iOS字体相关知识

    写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在label中选择字体的font,并把font由system改成custom后 ...

  5. QT中QMainWindow、QWidget、QDialog

    QT中QMainWindow.QWidget.QDialog 简述 在分享所有基础知识之前,很有必要在这里介绍下常用的窗口-QWidget.QDialog.QMainWindow. 熟悉Qt的同学都应 ...

  6. Unity UGUI 裁剪TTF字体

    BitBucket上找到了一个perl工程,font-optimizer.拉取代码到本地.为了运行它,还需要装Perl解释器,可以在Perl的官网上下载ActivePerl.装好ActivePerl后 ...

  7. Android自定义TTF字体

    前言: 在Android Design中一个设计手册.在设计手册中有常用的UI图标,图标大小规范等. 其中,有一个TTF字体,以前感觉没什么用.但是我在学习时,常看到有许多开发者使用Google 提供 ...

  8. 【转】cocos2d-x使用第三方的TTF字体库

    步骤一:找一个ttf字体库 步骤二:找到这个ttf字体库的真实名称 打开你的应用 "字体册"(MAC OS系统下),如下图操作): 找到了字体库真实名称,那么修改将其真名作为为此新 ...

  9. Qt 中如何捕获窗口停用和激活的消息

    最近一直在用Qt做一个简单的俄罗斯方块的游戏,由于要实现一个暂停游戏的功能,就是当鼠标移出正在运行的游戏,点击电脑桌面上的其他位置时,这个时候游戏暂停.在这里把实现过程简单的记录一下,作为一个学习笔记 ...

随机推荐

  1. Java API 操作 Mongodb

    本次测试环境使用一台ip为 192.168.2.23 的虚拟机 一.依赖 <dependency> <groupId>org.mongodb</groupId> & ...

  2. .NET实现多个不同有效时间Session方案思考

    什么是Session?简单讲,Session是一种服务端用于保存每个客户端用户的状态信息的机制.客户端第一次访问时,服务端从分配一个空间专门存储该客户端的信息,后续访问时便可以直接获取或者更新状态信息 ...

  3. FC Switch sfpshow

    sfpshow - fault-finding on Brocade Fibre Channel Switches So you've hit a situation where a Fibre Ch ...

  4. java web 程序---猜数字游戏

    思路:1.第一个是随机产生的数字,告诉我们去猜  cai.jsp 2.第二个是一个form表单,提交按钮后,将连接到验证页面 test1.jsp 3.第三个是比较猜的数和随机数.对了,提示再玩一次,不 ...

  5. java代码---------常用的方法indexOf()和substring()方法的小结、主要是下标都是从0开始,很重要,错了就那个差远了啊

    package com.s.x; //indexOf()方法从字符起始处的第一个位子开始的位置 //substring public class Wang { public static void m ...

  6. error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

    编译出现如下错误: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such ...

  7. Mysql踩过的坑

    数据表示例 1.NOT IN 结果集为空 ①SELECT class_no FROM t_student; 结果为: ②SELECT * FROM t_student where class_no n ...

  8. Android Study 玩转百度ocr身份证识别不是梦~

    前言 Today,由于昨晚喝蒙了,今天晕乎乎的为大家带来如何快速集入ocr身份证识别. 关于ocr的前世今生这里不做过多的说明,百度一抓一大把. 前期准备 百度AI开放平台ocr地址: https:/ ...

  9. pycharm多行代码同时注释、去除注释

    pycharm中同时注释多行代码快捷键: 代码选中的条件下,同时按住 Ctrl+/,被选中行被注释,再次按下Ctrl+/,注释被取消

  10. Rpm打包程序

    1.Rpm打包程序1.1为什么要使用rpm打包1.编译安装软件,优点是可以定制化安装目录.按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长.2.yum安装软件 ...