TTF字体基本知识及其在QT中的应用

字体类型


以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策略,自动选择默认字体。

时间: 2024-09-30 18:35:59

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

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

作者:董铂然 授权本站转载. 写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在 label中选择字体的font,并把font由system改成custom后,就能在family中看到72种特殊字体.这些里面就有很炫的字体,但 是全部是只针对英文数字,对中文无效.写了一个程序把所有的原生样式遍历出来展示可以达到如下效果.可以清楚地看到每个字体对应的样式,不用再一个个试 了. 如果你不是在董铂然博客园看到本文,请点击查看原文

第21课 Qt中的标准对话框(下)

1. 字体对话框:QFontDialog (1)Qt中提供了预定义的字体对话框类(QFontDialog) (2)QColorDialog类用于提供选择字体的对话框部件 (3)字体对话框的使用方式(见后面的实例分析) (4)QFontDialog中的实用函数: QFontDialog::getFont 2. 进度对话框:QProgressDialog (1)Qt中提供了预定义的进度对话框类(QProgressDialog) (2)QProgressDialog类用于显示进度信息 (3)QProg

Qt中的标准对话框

1.标准对话框 (1)Qt为开发者提供了一些可复用的对话框类型 (2)Qt提供的可复用对话框全部继承自QDialog类 @1:QMessageBox(用来提示消息的对话框) QFileDialog(文件对话框) QPrintDialog QColorDialog(用来选择一种颜色) QInputDialog QProgressDialog 这些对话框类型全部继承自QDialog类 (3)Qt中标准对话框遵循相同的使用方式 DialogType dlg(this); //先定义对话框对象,Dial

iOS 添加ttf字体

在开发的过程中,有时Xcode提供的字体不能满足我们的需求,所以我们需要添加其他的第三方字体. 提供一个字体下载的地址:找字体. 效果图 第一页是Swift代码使用第三方字体,第二页是OC使用第三方字体. 集成过程 1.下载.ttf字体 先下载.ttf字体,把字体拖进项目. 2.在Info.plist里增加Fonts provided by application 或是在Info.plist的源码里面增加下面的代码: <key>UIAppFonts</key> <array&

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

Cocos2d-x教程(28)-ttf 字体库的使用

欢迎加入 Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/37650843 通常为了使游戏界面更为美观,我们会选用某种字体来达到效果.今天要介绍的便是如何在iOS中引入ttf字体库文件(Cocos2d-x 原理相同) 在iOS中使用字体库的步骤如下(Android无需下述处理,可直接使用): 1.获取ttf字体库文件(网上搜索一搜一堆) 2.在Mac上安装字体库文件(主要用于获取

Android自定义TTF字体

前言: 在Android Design中一个设计手册.在设计手册中有常用的UI图标,图标大小规范等. 其中,有一个TTF字体,以前感觉没什么用.但是我在学习时,常看到有许多开发者使用Google 提供的TTF字体.我数了一下有19个字体可供选择,而Android自带的只有4种可以选择.我使用 了一个工程来测试所有的字体效果. 效果图: java代码: import android.os.Bundle; import android.app.Activity; import android.gra

Qt 中一些常用类中文说明

Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进制的数据 QDataWidgetMapper 提供了从数据模型到部件的映射 QData 日期的功能 QDateEdit 提供了日期的部件用来编辑日期,是基于QDateTimeEdit 部件 QDateTime 提供日期与时间的功能 QDateTimeEdit 提供了编辑日期与实践的部件 QDBusA

Qt中添加OpenCV库

配置在Qt中的OpenCV,看了很多“教程”,最终成功.记一下过程. 本机配置: window7 32位系统: qt-opensource-windows-x86-mingw492-5.5.1: OpenCV2.4.10. 对于我来说配置过程比较难,因为目前我没用过Qt和Cmake,之前一直用VS编译C++,也没有用过MinGW,所以看教程中的各种命令或者执行文件都比较费时.这次各种尝试后成功.参考资料的连接在最后,其中帮助我最大的就是那一篇纯英文的,很详细. 前期准备 Qt5的opensour