修改ttf字体美化显示效果(2006/01/02更新)

系统字体配置、中文显示和输入法问题
回复
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

修改ttf字体美化显示效果(2006/01/02更新)

#1

帖子 stlxv » 2007-05-30 18:36

原文出自:http://www.linuxfans.org/nuke/modules.p ... highlight=

很多人在使用 linux 做桌面时常常会抱怨字体模糊、破碎变形、英文不好看、没有粗斜体等。在 firefly(台湾) http://firefly.idv.tw/test/Forum.php?Board=1 和 akito(日本) http://www.kde.gr.jp/~akito/xft/ 等各位前辈的努力下显示效果已经有了极大进步,可以说不逊于 windows ,但是都要对现有字体引擎打补丁、作修改。而且 CJK(中日韩)等字体的粗、斜效果是用算法实现的。而不是像使用字符文字的国家那样使用真正的粗体字、斜体字、粗斜体
Windows 下常用的 arial、courier、times、verdana 等也都是通过定义 4 个相关字体实现的粗斜体,最为人们津津乐道的 Tahoma 也是有“常规”和“粗体”两种字型,而不是用算法。这样的效果应该会更好,可以在字体最初设计阶段就达到最为匹配的粗、斜效果,而不会因平台和字体渲染引擎的原因对粗、斜体的显示效果产生较大影响,以及用算法生成时导致的耗费更多计算时间





下面就介绍通过修改已有字体实现美化的方法
如无特殊说明,矢量字均指 TureType 字体,点阵字均指 bdf 字体,字体渲染引擎均指 X 的 Xft\freetype\fontconfig 系统
fontforge 和 gbdfed 这些工具也在不停的发展完善,有一些功能选项也有了部分变化,你在使用时可能会看到一些小的不同,还请谅解我不能及时更新这份文章


  • 字体的制作过程(具体参见 http://www.foundertype.com/jishujl/aboutStyle.htm ):字体是先由专业字体设计师在纸上固定大小的范围内,书写出统一风格的汉字字形设计稿。然后扫描成高精度点阵字库,同时给出其字库编码。接着将刚才扫描到的点阵字体矢量化。经过人工修字等步骤后得到的
  • 点阵字体:这种字体类似于位图图像,以每个象素(点)为单位,详细记录了字体大小、形状。使用时直接读取并显示,所以效果很好,但是也因此导致只能适用于某种固定情况。如果要在别的分辨率、dpi 下显示的话就需要另外再制作字体。这就导致字体制作量大、费时,占用存储空间大等问题。也决定了点阵字体不受 AA 和 hinting 的影响。 常用代表字型是 BDF、PCF。BDF 是纯文本的文本文件,PCF 是二进制的,所以显示效率要比 BDF 的好些
  • 可缩放字体:它类似于矢量图形,是利用曲线公式来描绘字框,记录的是笔画和显示方式而不是具体内容,能按照需要进行任意尺寸的缩放或其它变形,例如倾斜。因此单独一个字体就可以显示多种不同字号的字型。但是计算相对点阵字体耗时。常用代表字型就是 TrueType(ttf),它是由 Apple 及 Microsoft 为了对抗 Adobe 的 PostScript 所共同制定,开放标准。并且由系统直接提供支持,不需外挂其它管理程序
    点阵字体(位图字体)和可缩放字体(矢量字体)的关系就类似于 wav 和 midi、psd 和 ai 的关系
  • TrueType 字体分类
    • 变宽、等宽:TrueType 字体分成两种,一种是每个字符宽度不一样,比如 w 与 i 就不等宽。它是在每个字符中纪录该字符的宽度,大多数的 TrueType 都是这种格式
      另一种就是固定字距。也就是每个字符宽度都一样,这样显示或打印时,会有对齐效果,比较美观。只有把等宽字体用在虚拟终端才不会出现字符重叠的现象
      例如:bitsteam vera sans 就是变宽的比例字体,而bitsteam vera sans mono 就是等宽的字体
    • 衬线、无衬线:Serif(某些印刷体字母各端部的短线)就是衬线的意思,例如 M 的起点于终点、T的左右两端。它是由罗马刻印字母所发展出来的,用以改良字体的优雅程度与易读性。它们是先用毛笔写在石头上,然后再刻出来的。Serif 会活存到现在,是因为它们十分美丽及古典,而且它们阅读起来比较容易。它的特点是字体粗细对比明显,比较省眼力。适合作为段落文字使用。特别是对于细小的文本字体,非常适合用。例如 Times New Roman
      Sans Serif(Sans 是法文里的“无”,有时也简写作 Sans)就是无衬线,就是边缘是方的字。sans serif 一般字体用作较短的文字或者装饰用。但是大段看多了之后眼睛容易累,所以正文都是用serif字体。它的特点是字体粗细平均,对比不明显,阅读时比较费力。适合作为标题使用,不宜作为正文大段显示。例如 Arial、Verdana、Tahoma、Helvetica 等等
    • 以上等宽、衬线等分类都是应用在英文等字母文字上的,并不适用于中文这些表意文字。但如果单纯按照特点来划分的话,中文应该属于等宽字体。中文中的宋体、标宋属于衬线字体,黑体、圆体属于无衬线字体
      中文字体都是四四方方的方块字,也没有什么粗体、斜体之分。按照国家标准就是宋体、楷体、仿宋体、黑体(宋楷仿黑)这 4 种字体,当然还有很多其它美术体、书法体等。但是为了适应英文字体的显示方式,还使用了粗斜,遗憾。关于用宋楷仿黑字型来替代粗斜的方法可以参看 实现字型替代: http://www.linuxfans.org/nuke/modules.p ... ic&t=99214
  • anti-alias(反锯齿、字体平滑):是针对可缩放字体的技术,会让字体边缘看起来圆滑、无锯齿。它将字型先在幕后以数倍的大小来绘制,然后再缩成想要的大小,未能占满一格像素(pixel)的格子就用灰色填补。所以对于大字体,因为相应的笔画变粗,字体边缘的灰阶相对整体变少,所以效果很好。小字体时类似于英文这些笔画较少、相对简单的字符文字也会好看些,但是对于部分中文矢量字体就会导致在小字体时因边缘灰度过多而看起来模糊发虚
    图中左边是无 AA 的效果,右边是 AA 后的。可以明显看到 AA 效果
    图片
    这里有 AA 的详细信息 http://www.truetype.demon.co.uk/ttalias.htm
    http://www.widearea.co.uk/designer/anti.html
    http://www.microsoft.com/typography/links/link9.aspx
  • hinting(字体暗示、微调):是用来优化小字体显示的方法。由于显示器的种类不同 (CRT & LCD),同种显示器的点距也不同,使用环境(分辨率、dpi)也不尽相同,所以矢量字体的缩放就需要考虑更多的问题。如果控制得不好就会造成小字体破碎变形等情况。hinting 就是额外的信息,它嵌入在字体内部,人工的,详细指定了如何在字体缩放、变形后的显示方法,字体渲染引擎就根据 hinting 处理这些矢量字体的显示,使得小字的时候看起来更美观。也因此 hinting 是非常费时费力的工作,不是所有的字体都有,更不是所有的字体做的都好。truetype 字体很多,但是有良好 hinting 的并不多,劣质的 hinting 不但不会让字体更好看,还会让字变得更糟糕。对于笔划复杂、字符繁多的文字(如中文)带有 hinting 的字体更是极少。也就使得很多中文字体看起来不如英文字体好看
    这里有 hinting 的详细信息 http://www.microsoft.com/typography/Tru ... Intro.mspx
    图中左边是无 hinting 的效果,右边是 hinting 后的。可以明显看到 hinting 在颜色、间距、高低、匀称、weight 等方面都能达到很好的效果
    图片
也可以查看这篇文章,以获得更多信息。FreeType字体程序库介绍: http://www.infomall.cn/cgi-bin/mallgate ... ftintr.htm



综上所述,单就字体本身方面,解决方法有三种:一就是使用上面提到的点阵字。二就是加粗、加黑、加深字型,让它占据更多的像素,而不是用灰色的点填充边缘。三就是使用 hinting 技术
第三种方法显然是不太现实,因为中文字体太过众多和复杂,针对每个字体进行微调太过困难和耗时。所以就只能使用点阵字体,也可以是内嵌点阵的矢量字体(此时需要关闭anti-alias(AA));或者加粗加黑的矢量字体(此时需要开anti-alias(AA)。以便达到满意的显示效果
Windows 下的 simsun 就是通过在某些小字号时使用嵌入点阵字体并关掉anti-alias(AA)来获得清晰的显示效果的
MacOS X 则是通过使用使用华文黑体这种加粗、加深了的字体配合anti-alias(AA)来做界面字体以达到较好的显示效果





方法:
  1. 点阵字关 anti-alias(AA)解决方案
    关掉 anti-alias(AA)
    选择一款你看起来舒服的中文矢量字体用做“常规”字体的显示,并嵌入“常规”字型的点阵
    另一款中文矢量字体用做“粗体”字体的显示,并嵌入“粗体”字型的点阵
    以修改过的“常规”字体为基础生成“斜体”字。也可以找一款现成的字体作为“斜体”
    以修改过的“粗体”字体为基础生成“粗斜体”字。也可以找一款现成的字体作为“粗斜体”
    这四种字体一定要粗细适度、倾斜得当,能够互相搭配才会好看。例如:宋体搭配粗宋、黑体搭配粗黑。当然,如果你不这么做我也没办法 :mrgreen:
    修改后的四种字体的 Family(族)都必须要相同,这样系统才能在需要显示粗、斜、粗斜等字体时自动调用对应得字体,这也是修改字体的目的和关键一步
    如果你觉得这种字体的英文部分不够好看,还可以用其它你中意的英文字体替换掉其中相同的字符,以获得更满意的显示效果
  2. 矢量字粗体开 anti-alias(AA)解决方案——类似于方法 1.只是不需要嵌入点阵字体
    打开 anti-alias(AA)
    选择一款你看起来舒服的中文矢量字体用做“常规”字体的显示
    另一款中文矢量字体用做“粗体”字体的显示
    以修改过的“常规”字体为基础生成“斜体”字。也可以找一款现成的字体作为“斜体”
    以修改过的“粗体”字体为基础生成“粗斜体”字。也可以找一款现成的字体作为“粗斜体”
    这四种字体一定要粗细适度、倾斜得当,能够互相搭配才会好看。例如:宋体搭配粗宋、黑体搭配粗黑。当然,如果你不这么做我也没办法 :mrgreen:
    修改后的四种字体的 Family(族)都必须要相同,这样系统才能在需要显示粗、斜、粗斜等字体时自动调用对应得字体,这也是修改字体的目的和关键一步
    如果你觉得这种字体的英文部分不够好看,还可以用其它你中意的英文字体替换掉其中相同的字符,以获得更满意的显示效果


工具:
fontforce 原名pfaedit 主页: http://fontforge.sourceforge.net/ 工作平台:linux
gbdfed 下载 http://crl.nmsu.edu/~mleisher/gbdfed.html 工作平台:linux
sbit32 下载: http://www.linuxfans.org/nuke/modules/F ... s/sbit.zip 工作平台:windows(也可以用wine模拟)
ttctool 下载: http://www.linuxfans.org/nuke/modules/F ... OL_213.zip 工作平台:windows
Font properties extension 下载: http://download.microsoft.com/download/ ... ttfext.exe 工作平台:windows
可选工具:
Font Creator Program 主页: http://www.high-logic.com/ 工作平台:windows
AsiaFont Studio 主页: http://www.fontlab.com/html/asiafontstudio.html/ 工作平台:windows
(我没怎么用过,所以不进行介绍。如果各位有兴趣尽可以自己尝试。AsiaFont Studio据说是生成中文粗体的好工具,但官方主页被误伤,无法访问,而且新版的破解也不好找)


优缺点:
不用对现有字体引擎打补丁、做修改,即可以实现你想要的中文粗斜体
比较麻烦;有版权问题;比较配套能互相做粗、斜、常规的字体不好找



Font properties extension 工具:用于查看 ttf 字体的扩展信息
安装好后,在 windows 下右击 ttf 字体就可以看到更多更详细的信息
更多信息可以查看 http://www.microsoft.com/typography/Tru ... rty21.mspx

ttctool 工具:用于处理 ttc 字体
有些工具无法使用 ttc 文件,就需要先用

代码: 全选

breakttc.exe fontname.ttc
命令把 ttc 分解为独立的多个 ttf 文件,然后再进行进一步的处理

代码: 全选

makettc ttcfilename.ttc ttf1filename.ttf ttf2filename.ttf ttf3filename.ttf ……
用于把多个独立的 ttf 文件合并成一个 ttc
这套工具无法处理长文件名,有 8.3 格式的限制,否则会提示找不到字体,所以要注意字体的文件名
例子:
分解 simsun.ttc。

代码: 全选

breakttc.exe simsun.ttc
就会得到 font00.ttf 和font01.ttf 两个字体
整合 font00.ttf 和 font01.ttf 为一个文件

代码: 全选

makettc.exe new.ttc font00.ttf font01.ttf
就会得到合并后的 new.ttc 字体集合

sbit32 工具:用于处理 ttf 中的点阵字体
具体命令可以自己运行

代码: 全选

sbit -?
看帮助和压缩包中的 doc 文件。它在使用时会用到 .met 文件,它是一个纯文本文件,具体写法可以查看 doc 文件。最简单写法就是

代码: 全选

PPEM x
x 为要处理的点阵(bdf)文件的 pixel
这个工具也不是所有点阵都能处理的。像东文宋体,虽然可以看到点阵的信息但是却无法提取。总体来说这个工具很好,某些 fontforge 无法处理的字体就可以用它。在这方面就推荐用它来代替 fontforge 完成相关工作
以上面从 simsun.ttf 中分解出的 font00.ttf 为例:
  • 先查看字体信息

    代码: 全选

    sbit32.exe -i font00.ttf
    可以看到它集成了 12、14、16、18、15、13,6 个 pixel 的点阵字,这也就是为什么微软的宋体在很多不同大小时仍好看的原因。加上

    代码: 全选

    – v
    参数可以看到更详细的信息。而用 fontforge 时只能看到 12、14、16 这 3 个点阵,就是因为 flags 被设置为了 0 的缘故
  • 提取点阵。这时就要用到 .met 文件了。修改 sample.met 的内容为

    代码: 全选

    PPEM 12
    后,保存

    代码: 全选

    sbit32.exe -x font00.ttf sample.met 12.bdf
    就可以提取出 12 pixel 大小的点阵。再想提取其余别的 bdf 文件时,就要依次修改 sample.met 文件内

    代码: 全选

    PPEM
    的值后再进行提取。也可加上

    代码: 全选

    – v
    参数看到更详细的信息
  • 嵌入点阵。类似于提取点阵的方法

    代码: 全选

    sbit.exe -a font00.ttf 12.bdf sample.met new.ttf
    也要注意修改 sample.met 以便针对不同的点阵。也可加上

    代码: 全选

    – v
    参数看到更详细的信息
  • 删除点阵

    代码: 全选

    sbit32.exe -d font00.ttf sample.met new.ttf
    也要注意修改 sample.met 以便针对不同的点阵。也可加上

    代码: 全选

    – v
    参数看到更详细的信息
gbdfed 工具:用于处理 bdf 格式的点阵字
  • 导入字体:
    在终端执行 gbdfed 以后,选择 File--Import 就可以导入多种非 bdf 格式的字体文件进行修改。这里选 TureType Font 就可以导入 ttf 或 ttc 字体。可以分别选择其中包含的字体、平台和编码。一般使用 MicrosoftISO10646。然后就可以直接保存 Save As 为一个 bdf 文件
  • 加粗字体:
    打开 Open 或者导入 Import 一个字体后,执行 Operations--Embolden Glyphs 然后选择 All Glyphs,按 Embolden 就可以加粗字体。多次执行就可以继续加粗。其实质是将字符向右平移复制了一个单位。我们可以单独找一个字符做一下试验。随边找一个字符,双击打开修改窗口,执行 Operation--Embolden 就可以清楚看到它只是简单的在原字体右侧进行了重画线的工作
    这种加粗方法目前还有一些缺点。当一个字符很小,或者比划很繁复的时候,会让加粗后的字符看起来聚在一起,看起来像一个疙瘩,不清楚。而且对于 iso10646 之类的既有表意(中文)又有非表意(英文)之类编码的字体,会由于上行高度(ascent)和下行高度(descent)不统一,造成加粗后字体的标点符号位置靠上,在右上角,而不是右下角的位置
  • 生成斜体:
    类似于生成粗体的方法。打开 Open 或者导入 Import 一个字体后,执行 Operations--Shear Glyphs 然后输入倾斜角度,可选范围是-45度~~+45 度。然后选择 All Glyphs,按 Shear 就可以生成斜体。我们可以单独找一个字符做一下试验。随边找一个字符,双击打开修改窗口,执行 Operation--Shear 输入数值后按 Shear 就可以生成倾斜效果
  • 参数配置:
    通过 Edit--Setup 选项可以设置一些默认参数。建议大家把 resolution 都设置为 72。因为点是固定大小的,在数字印刷中,一点(point)等于 1/72 英寸,这样便于计算。改变完参数后要记得依次点击 UpdateSave Setup 以保存设置
  • 修改字体信息:
    Edit--Font Info 修改某参数后 Update 保存即可
  • 修改字体属性:
    Edit--Properties 删除 Delete 或者修改某属性后 Update 保存即可。例如 COPYRIGHTFAMILY_NAMEFOUNDRY 之类的。修改完之后记得 Edit--Font Name--Update Name From Properties 一下,就可以在主界面的 Font 栏看到 Name 变化后的效果。也可以直接更改 Font 栏的内容,然后用 Edit--Font Name--Update Properties From Name 命令从字体名更改属性。有关其中字体名的详细写法和意义可以参看
  • 导入字体:
    基本上没什么好说的,提一下其中的 File--Import--Server Font 命令。gbdfed 默认情况下导入 TureType 字体只能是 iso10646 编码的。如果实际内嵌点阵没有对应大小的字符时,它会根据对应编码位的矢量字用算法生成点阵。当然效果肯定没有人力手工制作并嵌入的点阵效果好。举个例子:用 File--Import--TrueType Font 命令导入的 simsun.ttf 会自动生成 latin 1 部分的点阵一样,而实际 simsun 只内嵌有 GB 编码的中文字
    如果想导入 GB2312 或者 GBK 之类的话。先按照正常方法安装你想提取点阵的字体,关键就是配置 X 核心字体子系统部分,使它能识别这个字体,特别是要写对 fonts.dir 文件。然后用 File--Import--Server Font 命令就能正常导入、导出其它多种编码的点阵字了。并且在导入字体时可以直接给出字号、分辨率以便提出符合要求的点阵
    fonts.dir 的具体写法可以参看 Linux字体设置fonts.dir文件分析: http://www.linuxfans.org/nuke/modules.p ... =fonts.dir
还要说一下,这个工具对 bdf 文件的格式要求很严格。用 fontforge 或者 sbit32 提取出的 bdf 字体不能够打开,导致应用起来有些困难
gbdfed 更详细的用法可以参看 man 手册、help 或者 http://crl.nmsu.edu/~mleisher/xmbdfed-doc.html


fontforce 工具:
  • 提取点阵:
    打开含有点阵的字体后,会自动弹出窗口询问是否装载点阵。装载后可以在 view 菜单下选择 xx pixel bitmap 查看、修改点阵。用 File--Generate Fonts,右侧选单选择 BDF,点击Save后可以生成点阵字体
  • 嵌入点阵:
    File--Import 就可以嵌入不同格式的点阵字体。嵌入后可以在 Element--Bitmaps Available 下查看已有点阵和在不同环境、dpi 下的字号
  • 替换字符:
    • 可以同时打开两个需要进行替换和被替换的字体,一个一个字符的进行复制、粘贴的工作。显然这样比较费时、费力。可以用下一种方法
    • Element 菜单下的 Merge fonts 直接导入进行合并。注意:如果 A 字体包含了 B 字体里的字符的话,最好是在 B 的基础上进行合并。例如我想用 tahoma 替换掉 simsun 里的相同部分。因为 simsun 已经包含了tahoma 里的字符,所以如果以 simsun 为基础合并 tahoma 的话,仍然会保留 simsun 原有的部分,而不是进行替换。应该打开 tahoma,然后合并 simsun
      合并之前还要注意两个字体的 Em Size 是否相同,否则可能会导致字体大小不一、不成比例。一般规定 PostScript 字型是1000,truetype 字型用2的次方(常是2048或4096)。可以通过 Element 菜单下的 Font info 内的General 进行修改。AscentDescentUnderline positionHeight 也最好能一样
      如果你并不想完全替换为另一字体的话,也可以先删除你不想要的部分字符后再进行合并
  • 修改字体,实现粗斜体:
    系统是根据字体的 Family 是否一样来判断两款不同的字体究竟是不是能够互相搭配的一套的。而字体名只是起一种标示、区别字体的作用的。所以修改 Family 就是将不同字体变为同种,实现相同显示要求的关键。而 Weight 则用来鉴别字体是粗体还是常规字体。
    分别打开每个要修改的字体后,点击 Element 菜单下的 Font info 项,修改 Names 选项卡中的 Family NameWeightTTF Values 选项卡中的 Weight Class 也进行修改。还有 Panose 选项卡中的 Weight。以及 TTF Names 选项卡中的内容。这在下面的例子中会详细提到
  • 制作斜体:
    可以执行 Element 菜单下的 Transform 然后在新弹出的对话框中改变第二个选框内的内容为 Skew,然后调整其后的倾斜度数值即可。在把字型修改成斜体后,还需要执行Element->Add Extrema (因为倾斜字体之后,垂直切点会移位,所以要在新的垂直切点上加上新的曲线点)
  • 制作粗体:
    可以通过 Element 菜单下的 Expand Stroke 功能完成
    可能是这个功能还处在开发阶段,并不完善的原因(也确实不完善,这在下面会详细提到)。所以这个选项是灰色的,不可选。但是可以用它的快捷键 ctrl+shift+e 直接调出调整的对话框
    选中一个或全部字符,按下 ctrl+shift+e 调出 Expand Stroke 对话框。下面的 Stroke Width 就可以用来调整加粗的多少。加粗可以根据比划(Stroke)、CaligraphicEllipse 等不同方法进行,选择你喜欢或者效果好的一种进行加粗即可。如果加粗时你没有选择下面的 Remove Internal ContourRemove External Contour 的话,加粗的效果就只是加一个边。选中 Remove Internal Contour(移除内部轮廓)或 Remove External Contour(移除外部轮廓) 其中之一就可以去掉这个“粗边”(两者不能同时选择),得到一个“粗体”字。由于字符的走向问题,即便是同一个字体,对于其中不同的字符也要使用不同的 Remove(移除)方法,否则效果会适得其反,不但未能加粗反而又变细了。但对不同字符使用不同的 Remove(移除)方法就会导致加粗字体时工作量过大,所以这个功能在目前不太切合实际
    在笔者使用时这个功能只对部分矢量字体的英文等字母数字有效。对于中文矢量字符没有效果,对于点阵字也都无法看到效果。但是相信随着时间的推移,这个功能会不断的改进和完善,直到生成大家满意的效果
    还可以通过 Element 菜单下的 Meta Font 功能完成。因为同样不完善的原因,所以这个选项是灰色的,不可选。但是可以用它的快捷键 ctrl+shift+! 直接调出调整的对话框进行修改
    利用这个功能可以从基础样式自动产生粗体(或窄体、宽体等)
    第三种方法就是通过 Element 菜单下的 Transformations 里的 Transform... Scale... 功能完成
  • 其它:
    如果你有了同一字体的基本样式和粗体样式,而且每一个字体都有一样多的点和相同的顺序,你可以用 Element--Interpolate Font 指令来产生半粗体的样式
    创建或修改 TrueType 时要保证 Element--Font Info 菜单内的 General 选项卡内的 Quadratic Splines(二次曲线)选项为选中状态,并且 Em Size 为2的次方(常是2048或4096)这才是 TrueType 的标准做法
    如果你打算让字体纵向排列时也能够有良好的间距,就需要保证 Element--Font Info 菜单内的 General 选项卡内的 Has Vertical 选项为选中状态。并且调整好下面的数值
Fontforge 更详细的用法可以参看 http://fontforge.sourceforge.net/overview.html
或者到 http://edt1023.sayya.org/fontforge/ 看繁体中文的翻译






因为具体修改字体过程写的过于啰嗦繁琐,而且上面已经简单叙述了方法,所以本想把它删除。但是对于我这种打字速度的人来说,实在是不容易。所以终究没能狠下心,仍然保留了这段啰嗦的过程,各位不想看也罢

我这里以方正圆体和 Bitstream Vera Sans 为例。用方正准圆作为“常规”字体显示,方正粗圆作为“粗体”显示。统一改为 Vera Sans YuanTi。“斜体”由“常规”字体生成,“粗斜体”由“粗体”生成。其中与 Bitstream Vera Sans 相同的部分全部进行替换
没用中文名的原因是在不打 firefly( http://firefly.idv.tw/setfont-xft/ )补丁的情况下 linux 无法显示中文字体名

制作"常规"字体
  1. 安装完成 fontforce 后,在终端里输入 fontforce 运行。在弹出的界面里载入方正准圆(fzy3k.ttf)
  2. 点击菜单栏的 Element--Font Info
    Fontname 改为 Vera Sans YuanTi_JT(这一步的修改将显示为 PostScript 名。右键--属性Meta 信息就可看到)
    Family Name 改为 Vera Sans YuanTi
    Name For Humans 改为 Vera Sans YuanTi(这一步不改也可以,但为了统一我还是改了)
    Weight 改为 Medium(MS 带的字体这里均为 Book,你不改也可以)
    关键是 Family Name 应该和你将用的"粗体"统一,名字可以任意。我用 Vera Sans YuanTi
  3. 切换到 TTF Values 选项卡
    Weight Class 改为 500 Medium(MS 带的字体这里均为 400 Book,你不改也可以)
  4. 切换到 Panose 选项卡
    Weight 改为 Medium
  5. 切换到 TTF Names 选项卡
    在下面第二个选框内选择 Chinese(PRC)zh_CN
    改变第一个选框内的内容为 Family,此时将下面输入框内的内容改为 Vera Sans YuanTi
    改变第一个选框内的内容为 Fullname,此时将下面输入框内的内容改为 Vera Sans YuanTi
    改变第一个选框内的内容为 UniqueID,此时将下面输入框内的内容改为 Founder:Vera Sans YuanTi Regular
    然后将下面第二个选框内选择 English(US)en_US(这里字体所支持的语言会用不同颜色显示,直观明了。方便选择。如果我不是色盲的话应该是绿色的 :mrgreen:
    做于 Chinese(PRC)zh_CN 类似的修改。即修改 FamilyFullnameUniqueID 三部分
  6. 点击 OK 关闭对话框后。如果弹出窗口提示不匹配,询问是否改变的话,点击 Retain All。不做改变
  7. 选择 File--Generate Fonts,选择 True Type,点击 Save 后生成字体。文件名任意。我取为 Vera Sans YuanTi_regular.ttf。如果弹出窗口提示什么 Em Size 的话不用理会,点击 yes 确定
制作"粗体"字体(与制作"常规"字体类似,我就简单复制了阿 :mrgreen:
  1. 安装完成 fontforce 后,在终端里输入 fontforce 运行。在弹出的界面里载入方正粗圆(fzy4k.ttf)
  2. 点击菜单栏的 Element--Font Info
    Fontname 改为 Vera Sans YuanTi-Bold_JT(这一步的修改将显示为 PostScript 名。右键--属性Meta 信息就可看到)
    Family Name 改为 Vera Sans YuanTi
    Name For Humans 改为 Vera Sans YuanTi Bold(这一步不改也可以,但为了统一我还是改了)
    Weight 改为 Bold
    关键是 Family Name 应该和你将用的"常规"统一,名字可以任意。我用 Vera Sans YuanTi
  3. 切换到 TTF Values 选项卡
    Weight Class 改为 700 Bold
  4. 切换到 Panose 选项卡
    Weight 改为 Bold
  5. 切换到 TTF Names 选项卡
    在下面第二个选框内选择 Chinese(PRC)zh_CN
    确认第一个选框内的内容为 Styles(SubFamily),此时将下面输入框内的内容改为 Bold
    改变第一个选框内的内容为 Family,此时将下面输入框内的内容改为 Vera Sans YuanTi
    改变第一个选框内的内容为 Fullname,此时将下面输入框内的内容改为 Vera Sans YuanTi Bold
    改变第一个选框内的内容为 UniqueID,此时将下面输入框内的内容改为 Founder:Vera Sans YuanTi Bold
    然后将下面第二个选框内选择 English(US)en_US(这里字体所支持的语言会用不同颜色显示,直观明了。方便选择)
    做于 Chinese(PRC)zh_CN 类似的修改。即修改 Styles(SubFamily)FamilyFullnameUniqueID 四部分
  6. 点击 OK 关闭对话框后。如果弹出窗口提示不匹配,询问是否改变的话,点击 Retain All。不做改变
  7. 选择 File--Generate Fonts,选择 True Type,点击 Save后生成字体。文件名可任意。我取为 Vera Sans YuanTi_bold。ttf。如果弹出窗口提示什么 Em Size 的话不用理会,点击 yes 确定
制作"斜体"(与制作"常规"字体类似,我就简单复制了阿 :mrgreen:
  1. 安装完成 fontforc e后,在终端里输入 fontforce 运行。在弹出的界面里载入刚才修改过的常规字体(Vera Sans YuanTi_regular.ttf)
  2. 点击菜单栏的 Element--Font Info
    Fontname 改为 Vera Sans YuanTi-Italic_JT(这一步的修改将显示为 PostScript 名。右键--属性Meta 信息就可看到)
    Family Name 改为 Vera Sans YuanTi
    Name For Humans 改为 Vera Sans YuanTi Italic(这一步不改也可以,但为了统一我还是改了)
    Weight 改为 Medium(MS 带的字体这里均为 Book,你不改也可以)
    关键是 Family Name 应该和你将用的"粗体"统一,名字可以任意。我用 Vera Sans YuanTi
  3. 切换到 TTF Values 选项卡
    Weight Class 改为 500 Medium(MS 带的字体这里均为 400 Book,你不改也可以)
  4. 切换到 Panose 选项卡
    Weight 改为 Medium
  5. 切换到 TTF Names 选项卡
    在下面第二个选框内选择 Chinese(PRC)zh_CN
    确认第一个选框内的内容为 Styles(SubFamily),此时将下面输入框内的内容改为 Italic
    改变第一个选框内的内容为 Family,此时将下面输入框内的内容改为 Vera Sans YuanTi
    改变第一个选框内的内容为 Fullname,此时将下面输入框内的内容改为 Vera Sans YuanTi Italic
    改变第一个选框内的内容为 UniqueID,此时将下面输入框内的内容改为 Founder:Vera Sans YuanTi Regular Italic
    然后将下面第二个选框内选择 English(US)en_US(这里字体所支持的语言会用不同颜色显示,直观明了。方便选择)
    做于 Chinese(PRC)zh_CN 类似的修改。即修改 Styles(SubFamily)FamilyFullnameUniqueID 三部分
  6. 切换到 General 选项卡
    Italic Angle: 后输入 12
  7. 点击OK关闭对话框后。如果弹出窗口提示不匹配,询问是否改变的话,点击 Retain All。不做改变
  8. 选择 Edit--Select--Select All,然后执行 Element--Transform
    在新弹出的对话框中改变第二个选框内的内容为 Skew,在将其后的数值改为 12(数值可根据你的视觉需要任意输入,windows 自带的英文字体多为 10;12;13;16。你可以先单独选中一个字体 Skew 一下试试看倾斜程度是否合适)
    点击 OK 确定。
  9. 在弹出的警告对话框中点击 OK 确定。如果弹出什么错误提示的话不用理会,一路回车。完成后会看到字体已变为斜体。接着按照刚才的警告执行Element--Add Extrema
    最后选择 File--Generate Fonts,选择 True Type,点击 Save 后生成字体。文件名可任意。我取为 Vera Sans YuanTi_Italic.ttf。如果弹出窗口提示什么 Em Size 的话不用理会,点击 yes 确定
制作"粗斜体"
  1. 安装完成 fontforc e后,在终端里输入 fontforce 运行。在弹出的界面里载入刚才修改过的粗体(Vera Sans YuanTi_bold.ttf)
  2. 点击菜单栏的 Element--Font Info
    Fontname 改为 Vera Sans YuanTi-BoldItalic_JT(这一步的修改将显示为 PostScript 名。右键--属性Meta 信息就可看到)
    Family Name 改为 Vera Sans YuanTi
    Name For Humans 改为 Vera Sans YuanTi Bold Italic(这一步不改也可以,但为了统一我还是改了)
    Weight 改为 Bold
    关键是 Family Name 应该和你将用的"粗体"统一,名字可以任意。我用 Vera Sans YuanTi
  3. 切换到 TTF Values 选项卡
    Weight Class 改为 700 Bold
  4. 切换到 Panose 选项卡
    Weight 改为 Bold
  5. 切换到 TTF Names 选项卡
    在下面第二个选框内选择 Chinese(PRC)zh_CN
    确认第一个选框内的内容为 Styles(SubFamily),此时将下面输入框内的内容改为 Bold Italic
    改变第一个选框内的内容为 Family,此时将下面输入框内的内容改为 Vera Sans YuanTi
    改变第一个选框内的内容为 Fullname,此时将下面输入框内的内容改为 Vera Sans YuanTi Bold Italic
    改变第一个选框内的内容为 UniqueID,此时将下面输入框内的内容改为 Founder:Vera Sans YuanTi Bold Italic
    然后将下面第二个选框内选择 English(US)en_US(这里字体所支持的语言会用不同颜色显示,直观明了。方便选择)
    做于 Chinese(PRC)zh_CN 类似的修改。即修改 Styles(SubFamily)FamilyFullnameUniqueID 四部分
  6. 点击 OK 关闭对话框后。如果弹出窗口提示不匹配,询问是否改变的话,点击 Retain All。不做改变
  7. 选择 Edit--Select--Select All,然后执行 Element--Transform
    在新弹出的对话框中改变第二个选框内的内容为 Skew,在将其后的数值改为 12(数值可根据你的视觉需要任意输入,windows 自带的英文字体多为 10;12;13;16。你可以先单独选中一个字体 Skew 一下试试看倾斜程度是否合适)
    点击 OK 确定。
  8. 在弹出的警告对话框中点击 OK 确定。如果弹出什么错误提示的话不用理会,一路回车。完成后会看到字体已变为粗斜体。接着按照刚才的警告执行Element--Add Extrema
    最后选择 File--Generate Fonts,选择 True Type,点击 Save后生成字体。文件名可任意。我取为 Vera Sans YuanTi_bold_Italic.ttf。如果弹出窗口提示什么 Em Size 的话不用理会,点击 yes 确定
替换字符:
  1. 逐字复制粘贴:
    还以上面的方正圆体和 Bitstream Vera Sans 为例。用 Bitstream Vera Sans 替换掉与方正圆体里相同的字符,如果圆体里没有某个字符的话就直接用 Bitstream Vera Sans 补足(如果你觉得 Bitstream Vera Sans 太粗、字体间距大的话也可以用 windows 的 arial 甚至是 tahoma)
    注意字体的搭配,斜体配斜体,粗体配粗体。下面以粗斜体为例
    运行 fontforge,分别打开 /usr/share/fonts/bitstream-vera/VeraBI.ttf(Bitstream Vera Sans 的粗斜体)和刚才做好的 Vera Sans YuanTi_bold_Italic.ttf
    在 Bitstream Vera Sans 的窗口中,选择 View--Compacted View,点击菜单栏的 Element--Font Info--Encoding 可以看到总共有 268个字符。不算多,慢慢来还可以接受。如果太多的话,我劝你还是放弃吧,除非你想锻炼耐心:mrgreen:
    点击菜单栏的 Element--Font Info--Encoded View,把浏览方式改回去(生成字体以前一定要改回)
    切换到方正圆体的 Element--Font Info--General 选项卡把 Em Size 改为 2048,即与 Bitstream Vera Sans 一样(两款字体的 Em Size 一定要一样,否则最后生成的字体会大小不一)。点击 OK 后,等待转换完成
    然后在方正圆体里用鼠标选中与 Bitstream Vera Sans 重复的字符(可以拖动,多选);右键;Clear 清除。再用复制、粘贴把 Bitstream Vera Sans 的字符都贴过来即可(这一点说起来最轻松,但是做起来却最浪费时间)。有的字符在方正圆体没有包括,直接贴过来就行了。可以用 View--Next Defined Char 直接转到下一个字符,否则找起来很麻烦
  2. 清除合并:
    把方正圆体里与 Bitstream Vera Sans 重复的字符都清除后,选择 Element--Merge Fonts。在 Merge Fonts 窗口中选择 Bitstream Vera Sans。完成后,File--Generate Fonts 生成字体即可
    合并字体时,只会合并原字体(这里是方正圆体)里没有包含的字符。而不会覆盖已有的字符,所以要先清除方正圆体里与 Bitstream Vera Sans 重复的字符后再合并
  3. 直接合并:
    当然你也可以用 Bitstream Vera Sans 做基础把方正圆体合并进来。但这时你要修改的字体信息就比较多了
    打开 Bitstream Vera Sans 后,直接选择 Element--Merge Fonts。在 Merge Fonts 窗口中选择 Vera Sans YuanTi_bold_Italic.ttf。完成后,File--Generate Fonts 生成字体即可




使用 hinting:
由于 TureType 字体的 hinting 是有专利的(apple),所以很多发行版默认并没有打开 hinting。这就造成了很多字体不够好看。由于有些字体已经内置了 hinting,所以为利用这种技术获得更好的显示效果,我们可以自己开启 hinting
用如下方法就可以打开 hinting。前提是你使用 freetype2/xft2/fontconfig 显示字体
有一些发行版因为涉及到专利的原因,默认没有编译出带hinting支持的freetype。例如RH、FC的发行版
下载freetype2的源码,解压后,把 include/freetype/config/ftoption.h 里面的
/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
改成
#defineTT_CONFIG_OPTION_BYTECODE_INTERPRETER
然后编译,重新安装freetype2就行了
或者下载freetype2的src.rpm。rpm -ivh 安装以后。改/usr/src/redhat/SPECS/freetype.spec 的
%define without_bytecode_interpreter 1
%define without_bytecode_interpreter 0
然后
rpmbuild -bb /usr/src/redhat/SPECS/freetype.spec
cd /usr/src/redhat/RPMS/i386
rpm -ivh freetype*.rpm
然后在 /etc/fonts/fonts.conf 或者 /etc/fonts/local.conf 或者 ~/.fonts.conf 内加入

代码: 全选

<match target="font"> 
	<edit name="hinting" mode="assign"> 
		<bool>true</bool><!— 改成 false 即可关闭 -->
	</edit> 
</match>
即可对所有具备 hinting 的字体使用 hinting

代码: 全选

<match target="font">
	<test name="family" compare="eq">
		<string>fontname</string>
	</test>
	<edit name="hinting" mode="assign">
		<bool>true</bool><!— 改成 false 即可关闭 -->
	</edit>
</match>
可以对字体族(family)为 fontname 的有 hinting 字体使用 hinting
对于字体的 hinting 有四种风格 hintnone、 hintslight、hintmedium、hintfull 分别是无 hinting、轻度 hinting、中等 hinting、完全 hinting。对应于微调的强弱
在 /etc/fonts/fonts.conf 或者 /etc/fonts/local.conf 或者 ~/.fonts.conf 内加入

代码: 全选

<match target="font">
	<edit name="hintstyle" mode="assign">
		<const> hintfull </const><!— 可改成 hintnone、 hintslight、hintmedium -->
	</edit>
</match>
即可调整所有具备 hinting 的字体的 hinting 风格

也由于为避开有专利的 hinting ,freetype 有自己微调字体的技术 autohint,可以在一定程度上改善部分字体的显示效果。但由于它是用程序来调整字体的显示,而且又是要针对所有字体,所以肯定没有用人力手工生成的针对具体某一款字体的 hinting 的效果好。autohint 一直都在在不断的改进,显示效果也越来越好。故对于某些没有 hinting 的字体也能有一定程度的改进。你可以自己通过修改配置文件观察 hinting 和 autohint 以及没有字体微调时的效果,以取你最满意的方案显示
把下面的内容加入 /etc/fonts/fonts.conf 或者 /etc/fonts/local.conf 或者 ~/.fonts.conf

代码: 全选

<match target="font"> 
	<edit name="autohint" mode="assign"> 
		<bool>true</bool><!— 改成 false 即可关闭 -->
	</edit> 
</match>
就可以对所有字体使用 autohint
即可对所有字体使用 hinting

代码: 全选

<match target="font">
	<test name="family" compare="eq">
		<string>fontname</string>
	</test>
	<edit name=" autohint" mode="assign">
		<bool>true</bool><!— 改成 false 即可关闭 -->
	</edit>
</match>
可以对字体族(family)为 fontname 的字体使用 autohint

因为 hinting 和 autohint 是不同的字体微调技术,所以不建议同时使用



修改字体配置文件:
除了上面提到的于 hinting 和 autohint 有关的配置外,还有下面常用的一些

代码: 全选

<match target="font">
	<edit name="antialias" mode="assign">
		<bool>true</bool><!— 改成 false 即可关闭 -->
	</edit>
</match>
打开 antialias(AA)

代码: 全选

<match target="font">
	<test qual="any" name="family">
		<string>fontname</string>
	</test>
	<edit name="antialias" mode="assign">
		<bool>true</bool><!— 改成 false 即可关闭 -->
	</edit>
</match>
对字体族(family)为 fontname 的字体打开 antialias(AA)

代码: 全选

<match target="font">
	<test name="size" compare="less_eq"><int>12</int></test>
	<test name="size" compare="more_eq"><int>9</int></test>
	<edit name="antialias" mode="assign"><bool>true</bool></edit><!— 改成 false 即可关闭 --> 
对字体大小小于等于 12、大于等于 9 的字体打开 antialias(AA)

代码: 全选

<match target="font">
	<test name="family"><string>fontname</string></test>
	<test name="size" compare="less_eq"><int>12</int></test>
	<test name="size" compare="more_eq"><int>9</int></test>
	<edit name="antialias" mode="assign"><bool>true</bool></edit><!— 改成 false 即可关闭 --> 
对字体族(family)为 fontname 且字体大小小于等于 12、大于等于 9 的字体打开 antialias(AA)

代码: 全选

<match target="font">
	<test name="size" compare="less_eq"><int>12</int></test>
	<test name="size" compare="more_eq"><int>9</int></test>
	<edit name="hinting" mode="assign"><bool>true</bool></edit><!— 改成 false 即可关闭 --> 
对字体大小小于等于 12、大于等于 9 的字体打开 hinting

代码: 全选

<match target="font">
	<test name="family"><string>fontname</string></test>
	<test name="size" compare="less_eq"><int>12</int></test>
	<test name="size" compare="more_eq"><int>9</int></test>
	<edit name="hinting" mode="assign"><bool>flase</bool></edit><!— 改成 true 即可关闭 --> 
对字体族(family)为 fontname 且字体大小小于等于 12、大于等于 9 的字体关闭 hinting

因为 fontconfig 的配置方法非常灵活,所以相同的功能可以由不同的写法来完成配置。也因此不再累述。具体可以参见 看看 http://www.higherorder.org/wiki/Fontconfighttp://fontconfig.org/fontconfig/fontconfig-user.html
以及中文翻译 http://www.linuxfans.org/nuke/modules.p ... w&sid=1184http://edt1023.sayya.org/fontconfig/fon ... -user.html



文笔有限再加上才疏学浅,多有不当之处,还希望大家多多指正。包括错别字



声明:本文参考了网上众多网友的文章,在此表示衷心感谢!也欢迎任何人在非商业用途下对本文进行任意修改以及转载。只需著名出处和此份声明即可

修改后的字体涉及到版权问题,所以仅供个人学习交流使用。如果是要日常使用最好找没有版权问题的字体。例如: firefly 宋、文鼎字体等
PHP是最好的语言!不服来战!
头像
rhfcaesar
帖子: 2996
注册时间: 2005-11-17 15:45
来自: 湖北

#2

帖子 rhfcaesar » 2007-05-30 20:02

顶! :em66
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#3

帖子 stlxv » 2007-05-30 21:33

:shock: 居然跑这里来了
PHP是最好的语言!不服来战!
头像
eagle5678
帖子: 1865
注册时间: 2006-07-08 14:07

#4

帖子 eagle5678 » 2007-07-09 18:32

强…………
shengxian
帖子: 50
注册时间: 2006-04-19 15:02

#5

帖子 shengxian » 2007-07-18 16:38

太强了
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#6

帖子 eexpress » 2007-07-18 16:44

那里抄的哦。这么长。看不下去。就看到那签名越来越没边。
● 鸣学
雕啸长空
帖子: 1897
注册时间: 2006-09-12 14:09

#7

帖子 雕啸长空 » 2007-07-18 16:53

eexpress 写了:那里抄的哦。这么长。看不下去。就看到那签名越来越没边。
什么签名哦?

我这里看不到,兴许adblock了.
Fair winds and following seas !
头像
mymike
帖子: 69
注册时间: 2007-07-15 23:56
联系:

#8

帖子 mymike » 2007-07-20 11:51

太麻烦了,不就弄个字体嘛。光这些文字就能把一大群跃跃欲试的初学者吓跑,严重打击他们的积极性。
Linux不能朝这个方向发展啊。
我的主页:http://www.mymiker.com
回复