修改TTF字体美化显示效果【原文转自:http://www.linuxfans.org/】

时间:2024-03-03 09:02:43

准备

工具fontforge,原名pfaedit,主页:http://fontforge.sourceforge.net/

原料:两款中文字体。一款作为“常规”字体显示,一款作为“粗体”显示。两款字体并不一定是同一种,只要你自己看着舒服就行。但是粗体比常规粗是必须的。当然,如果你不这么做我也没办法。

优点:不用对现有字体引擎打补丁、做修改。

缺点:比较麻烦;有版权问题;比较配套的字体不好找。

附言:经wxz8指点后,添加了斜体的制作方法。

备注:Windows的ArialCourierTimesVerdana等都是通过定义4个相关字体实现的粗斜体,而不是用算法.这样的效果应该不错。

我这里以方正圆体为例。

目标:以方正准圆作为“常规”字体显示,方正粗圆作为“粗体”显示,统一改为FZYuanTi

没用中文名的原因是在不打firefly( http://firefly.idv.tw/setfont-xft/ )补丁的情况下无法显示中文字体名。

制作常规体

1. 安装完成fontforge后,在终端里输入fontforge运行,在弹出的界面里载入方正准圆(fzy3k.ttf)。


2. 点击菜单栏的Element--Font Info

Fontname改为FZYuanTi_JT(这一步的修改将显示为PostScript名。右键--属性,Meta信息就可看到);

Family Name改为FZYuanTi

Name For Humans改为FZYuanTi(这一步不改也可以,但为了统一我还是改了);

Weight改为Medium(MS带的字体这里均为Book,你不改也可以);

关键是Family Name应该和你将用的“粗体”统一,名字可以任意。我用FZYuanTi


3. 切换到TTF Values选项卡

Weight Class改为500 Medium(MS带的字体这里均为400 Book,你不改也可以)。


4. 切换到Panose选项卡

Weight改为Medium


5. 切换到TTF Names选项卡

在下面第二个选框内选择Chinese(PRC)zh_CN

改变第一个选框内的内容为Family,此时将下面输入框内的内容改为FZYuanTi

改变第一个选框内的内容为Fullname,此时将下面输入框内的内容改为FZYuanTi

改变第一个选框内的内容为UniqueID,此时将下面输入框内的内容改为Founder:FZYuanTi Regular

然后将下面第二个选框内选择English(US)en_US(这里字体所支持的语言会用不同颜色显示,直观明了、方便选择。如果我不是色盲的话应该是绿色的);

做与Chinese(PRC)zh_CN类似的修改,即修改FamilyFullnameUniqueID三部分。


6. 点击OK关闭对话框后,如果弹出窗口提示不匹配,询问是否改变的话,点击Retain All,不做改变。


7. 选择File--Generate Fonts,选择True Type,点击Save后生成字体,文件名任意,我取为FZYuanTi_regular.ttf。如果弹出窗口提示什么Em Size的话不用理会,点击yes确定。

制作粗体

1. 安装完成fontforge后,在终端里输入fontforge运行,在弹出的界面里载入方正粗圆(fzy4k.ttf)。


2. 点击菜单栏的Element--Font Info

Fontname改为FZYuanTi-Bold_JT(这一步的修改将显示为PostScript名。右键--属性,Meta信息就可看到);

Family Name改为FZYuanTi

Name For Humans改为FZYuanTi Bold(这一步不改也可以,但为了统一我还是改了);

Weight改为Bold

关键是Family Name应该和你将用的“常规”统一,名字可以任意。我用FZYuanTi


3. 切换到TTF Values选项卡

Weight Class改为700 Bold


4. 切换到Panose选项卡

Weight改为Bold


5. 切换到TTF Names选项卡

在下面第二个选框内选择Chinese(PRC)zh_CN

确认第一个选框内的内容为Styles(SubFamily),此时将下面输入框内的内容改为Bold

改变第一个选框内的内容为Family,此时将下面输入框内的内容改为FZYuanTi

改变第一个选框内的内容为Fullname,此时将下面输入框内的内容改为FZYuanTi Bold

改变第一个选框内的内容为UniqueID,此时将下面输入框内的内容改为Founder:FZYuanTi Bold

然后将下面第二个选框内选择English(US)en_US(这里字体所支持的语言会用不同颜色显示,直观明了、方便选择);

做与Chinese(PRC)zh_CN类似的修改,即修改Styles(SubFamily)FamilyFullnameUniqueID四部分。


6. 点击OK关闭对话框后,如果弹出窗口提示不匹配,询问是否改变的话,点击Retain All,不做改变。


7. 选择File--Generate Fonts,选择True Type,点击Save后生成字体,文件名任意,我取为FZYuanTi_bold.ttf。如果弹出窗口提示什么Em Size的话不用理会,点击yes确定。

制作斜体

1. 安装完成fontforge后,在终端里输入fontforge运行,在弹出的界面里载入刚才修改过的常规字体(FZYuanTi_regular.ttf)。


2. 点击菜单栏的Element--Font Info

Fontname改为FZYuanTi-Italic_JT(这一步的修改将显示为PostScript名。右键--属性,Meta信息就可看到);

Family Name改为FZYuanTi

Name For Humans改为FZYuanTi Italic(这一步不改也可以,但为了统一我还是改了);

Weight改为Medium(MS带的字体这里均为Book,你不改也可以);

关键是Family Name应该和你将用的“粗体”统一,名字可以任意。我用FZYuanTi


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,此时将下面输入框内的内容改为FZYuanTi

改变第一个选框内的内容为Fullname,此时将下面输入框内的内容改为FZYuanTi Italic

改变第一个选框内的内容为UniqueID,此时将下面输入框内的内容改为Founder:FZYuanTi 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自带的英文字体多为10121316。你可以先单独选中一个字体Skew一下试试看倾斜程度是否合适)。点击OK确定。


9. 在弹出的警告对话框中点击OK确定,如果弹出什么错误提示的话不用理会,一路回车。完成后会看到字体已变为斜体。接着按照刚才的警告执行Element--Add Extrema

最后选择File--Generate Fonts,选择True Type,点击Save后生成字体,文件名可任意。我取为FZYuanTi_Italic.ttf。如果弹出窗口提示什么Em Size的话不用理会,点击yes确定。

制作粗斜体

1. 安装完成fontforge后,在终端里输入fontforge运行,在弹出的界面里载入刚才修改过的粗体(FZYuanTi_bold.ttf)。


2. 点击菜单栏的Element--Font Info

Fontname改为FZYuanTi-BoldItalic_JT(这一步的修改将显示为PostScript名。右键--属性,Meta信息就可看到);

Family Name改为FZYuanTi

Name For Humans改为FZYuanTi Bold Italic(这一步不改也可以,但为了统一我还是改了);

Weight改为Bold

关键是Family Name应该和你将用的“粗体”统一,名字可以任意。我用FZYuanTi


3. 切换到TTF Values选项卡

Weight Class改为700 Bold


4. 切换到Panose选项卡

Weight改为Bold


5. 切换到TTF Names选项卡

在下面第二个选框内选择Chinese(PRC)zh_CN

确认第一个选框内的内容为Styles(SubFamily),此时将下面输入框内的内容改为Bold Italic

改变第一个选框内的内容为Family,此时将下面输入框内的内容改为FZYuanTi

改变第一个选框内的内容为Fullname,此时将下面输入框内的内容改为FZYuanTi Bold Italic

改变第一个选框内的内容为UniqueID,此时将下面输入框内的内容改为Founder:FZYuanTi Bold 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自带的英文字体多为10121316。你可以先单独选中一个字体Skew一下试试看倾斜程度是否合适)。点击OK确定。


9. 在弹出的警告对话框中点击OK确定,如果弹出什么错误提示的话不用理会,一路回车。完成后会看到字体已变为粗斜体。接着按照刚才的警告执行Element--Add Extrema

最后选择File--Generate Fonts,选择True Type,点击Save后生成字体,文件名可任意。我取为FZYuanTi_bold_Italic.ttf。如果弹出窗口提示什么Em Size的话不用理会,点击yes确定。

安装字体

1./usr/share/fonts目录下新建local目录,把刚才制作好的四个字体复制到/usr/share/fonts/local下。

2. 执行

 # ttmkfdir -d /usr/share/fonts/local/ -o /usr/share/fonts/local/fonts.scale # cp /usr/share/fonts/local/fonts.scale /usr/share/fonts/local/fonts.dir 

3. 更改/etc/X11/XF86Config(如果你用的X是xorg的话就应改修改xorg.conf),在字体字段加入一行

 FontPath "/usr/share/fonts/local" 

类似于

 RgbPath "/usr/X11R6/lib/X11/rgb" FontPath "/usr/share/fonts/local" FontPath "unix/:7100" 

4. 更改/etc/X11/fs/config,在查找字体字段增加一行

 /usr/share/fonts/local, 

类似于

 catalogue = /usr/share/fonts/zh_CN/TrueType, /usr/share/fonts/local, /usr/X11R6/lib/X11/fonts/korean, 

5. 编辑/etc/fonts/fonts.conf,在每个字体字段最前面加入

 <family>FZYuanTi</family> 

类似于

 <alias> <family>FZYuanTi</family> <family>Bitstream Vera Serif</family> <family>Times</family> <family>Times New Roman</family> <family>Nimbus Roman No9 L</family> <family>Luxi Serif</family> <family>Kochi Mincho</family> <family>AR PL SungtiL GB</family> <family>AR PL Mingti2L Big5</family> <family>Baekmuk Batang</family> <default><family>serif</family></default> </alias> 

6. 编辑/etc/gtk-2.0/gtkrc(这一步是为在KDE下GTK2的程序设置字体。如果你用的是gnome就不用修改,否则字体设置会不起作用),加入

 style "user-font" { font_name="FZYuanTi 12" } widget_class "*" style "user-font" 

7. 注销或者执行init 3退出X。 8. 执行

 # fc-cache -fv # /etc/init.d/xfs restart 

9. startx或者init 5进入X后,在字体设置里选择FZYuanTi,大小为12即可。

使用替换字体

往往一款中文字体里的英文字符不是很好看,所以为达到更好的显示效果就会使用替换字体(显示中文时使用指定的中文字体,遇到英文时就使用另一款英文字体替换)。这也可以解决中文字体丢字符的问题(有时要显示的字符没有包含在这款中文字体里,此时就可以用包含这些字符的字体来替换)例如常用的Tahoma替换Simsun。

方正圆体的英文部分过于紧凑,不好看。我个人觉得Bitstream Vera Sans与其搭配很好(当然你也可以用Windows自带的Arial)。

1. 编辑/etc/fonts/fonts.conf,把Bitstream Vera Sans (Arial)加在FZYuanTi前,类似

 <alias> <family>Bitstream Vera Sans</family> <family>FZYuanTi</family> <family>Bitstream Vera Serif</family> <family>Times</family> <family>Times New Roman</family> <family>Nimbus Roman No9 L</family> <family>Luxi Serif</family> <family>Kochi Mincho</family> <family>AR PL SungtiL GB</family> <family>AR PL Mingti2L Big5</family> <family>Baekmuk Batang</family> <default><family>serif</family></default> </alias> 

2. 编辑/etc/gtk-2.0/gtkrc(这一步是为在KDE下GTK2的程序设置字体。如果你用的是gnome就不用修改,否则字体设置会不起作用)。加入

 style "user-font" { font_name="Bitstream Vera Sans,FZYuanTi 12" } widget_class "*" style "user-font" 

3. 运行qtconfig,选择Fonts选项卡,在Font Substitution里选择Bitstream Vera SansFamily,然后在下面的Substitution Family里把FZYuanTi加入,保存退出。

4. 在字体设置里选择Bitstream Vera Sans

进一步美化字体

替换字符

到以上为止,使用了替换字体后,显示效果应该已经可以算不错了。如果你觉得不够满意,不想用那么多字体的话,可以直接修改字体,用一款英文字体替换掉中文字体里的相同部分。

还以上面的方正圆体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的粗斜体)和刚才做好的FZYuanTi_bold_Italic.ttf

Bitstream Vera Sans的窗口中,选择View--Compacted View,点击菜单栏的Element--Font Info--Encoding可以看到总共有268个字符,不算多,慢慢来还可以接受。如果太多的话,我劝你还是放弃吧,除非你想锻炼耐心;

点击菜单栏的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直接转到下一个字符,否则找起来很麻烦;

可能是改的字体的问题,别人复制都没问题,但是在我改的这两个字体里,直接复制后部分字符会变形,所以使用了合并功能(你做字体的时候如果不能复制粘贴的话,可以试试合并);

方正圆体里与Bitstream Vera Sans重复的字符都清除后,选择Element--Merge Fonts,在Merge Fonts窗口中选择Bitstream Vera Sans。完成后,File--Generate Fonts生成字体即可;

合并字体时,只会合并原字体(这里是方正圆体)里没有包含的字符,而不会覆盖已有的字符,所以要先清除方正圆体里与Bitstream Vera Sans重复的字符后再合并;

当然你也可以用Bitstream Vera Sans做基础把方正圆体合并进来,但这时你要修改的字体信息就多了,我不建议这样做。

此时就不用修改配置文件替换字体了,都使用FZYuanTi就行了。

导入点阵(位图)字体

有人可能喜欢用Simsun,觉得小字体时中文清晰锐利。那是因为Simsun包含了3个点阵字体。我们把它提取出来。

运行fontforge,在装入位图字体对话框中Select All装入。File--Generate Fonts,在两个下拉列表里分别选择No Outline FontBDF即可生成bdf格式的位图字体。

得到点阵字体后,就可以把他们加入自己想要的字体里。用fontforge打开任一款矢量字体(ttf),File--Import,格式选BDF。导入后File--Generate Fonts,分别选择True TypeIn TTF生成后就是包含点阵字的ttf。当系统显示时,如果大小与内嵌的点阵字相同的话会优先使用点阵字体显示。

另:Windows里除了Simsun以外Mingliu也包含了6个点阵字体,还有gb18030Simsun

Starsuite 7.0soui.ttf里能发现11~21pixel的点阵字。

unisun里包含了6个点阵。其中Simsun的点阵没有latin1部分,所以在显示时会使用ttf中的英文,造成效果不好。

但有些字体包含的点阵信息是fontforge读不出的,各位试试东文宋体就知道了。9~12号格外清晰锐利,无论AA与否。而且fontforge打开后直接生成字体会小好几M。

在某些方正宋体18030方正黑体18030也含点阵但是一样读不出,用gnome-font-viewer就很明显能看到了,特别是方正黑体。

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

作者拾遗

方正细圆+方正准圆是一对比较合适的字体。如果你觉得字体有些发虚模糊的话,可以用方正准圆+方正粗圆搭配。有一点要说一下,圆体在大字体时使用AA会很好看,但是在小字体(例如经常使用的9、10号字)时效果就不怎么好了。我觉得准圆(粗圆)比细圆(准圆)粗的不够,显示粗体的时候,只感觉到黑感觉不到粗。

细圆+粗圆方正黑体+方正大黑东文黑体+东文粗黑华文宋体+华文中宋搭配也都不错。

至今没找到能做宋体粗体的字体,希望能有人给出好建议;如有好的字体搭配建议也尽管共享出来。多谢。

效果截图

40a0b024369cbdesktop

40a0b5693879edesktop

40b5f243e5176fontforge4

40e0721825bddverasansyuanti

40e072a83e223verasansyuanti

40e0ce42164daterminal