中文字体不像英文字体那样,26个大小写字母加一些标点符号就能凑成一套字体文件,轻量小巧。中文中光是常用的汉字就有3500个,所以一套中文字体文件往往会达到3、4mb,多的也有8mb等,如果在web中使用服务器端的中文字体,光是等待加载就要花去不少时间,所以为了使加载速度提升,我们可以采用字体子集化方案。

何为子集化

子集化即从源字体文件中抽取出需要使用到的文字,生成一份新的字体文件,这样操作之后的字体文件如果只有几百个汉字的话,可将字体文件降至几百甚至几十kb,在应用于web时将大大提高加载速度。

如何使用python将字体子集化

python已有许多操作字体的第三方模块,我们采用使用广泛的fontTools。下面我直接写出调用代码:

from fontTools.ttLib import TTFont
from fontTools.subset import Subsetter

font = TTFont('WenCangShuFang-2.ttf')#传入源字体文件
subsetter = Subsetter()
subsetter.populate(text="python字体子集化方案的实现")#输入需要子集化的文本内容
subsetter.subset(font)
font.save("newfont.ttf")#生成新的子集字体文件

这样,仅包含“python字体子集化方案的实现”这几个字的字体文件就生成了,生成的子集化字体文件仅有5kb。

我们写一个简单的html来调用该字体文件试试

<html>
    <head>
        <style>
            @font-face {
              font-family: 'WenCangShuFang-2';
              src: url('newfont.ttf') format('truetype');
            }

            h1{font-family:'WenCangShuFang-2'}
        </style>
    </head>
    <body>
        <h1>python字体子集化方案的实现</h1>
    </body>
</html>

其他

这样一来,对于一些页面中需要特定字体且基本不变的地方,我们都可以这样生成一套子集化的字体文件,减小文件大小,提升页面加载速度。

如果字体需要应用于经常变化的内容,比如文章标题及正文,那么可以稍作变通,将该子集化的功能封装成一个api,比如使用flask针对该功能写一个路由,接受参数包括:字体名称(确保服务器有该字体文件)、需子集化的内容,然后根据内容生成一个md5的新字体名称,接着进行子集化操作,子集化的字体文件保存在服务器当中,最后路由返回该子集化字体的静态文件地址。

当然以上只是其中一种思路,实现手段还有很多,仅抛砖引玉。

评论

  • 最新随笔

  • 猫确实喜欢在各种犄角旮旯里睡觉
  • 尝试让DALLE生成一些连续的精灵图,让gpt帮忙生成一些提示词,如果能稳定输出的话就很强大了。
    让gpt帮忙生成的DALLE提示词
    "Generate a pixel art sprite sheet of a character walking in four directions (north, south, east, west) in a retro video game style."
    "Create a series of pixel art frames showing a character performing different actions like walking, running, jumping, and attacking in a classic 2D game aesthetic."
  • 路过别人山庄的门口,被一条大黑狗边叫边追过来,幸好骑电动车,不然还不一定跑得过,哈哈哈哈哈哈哈哈哈哈。
  • 最近两周也没咋出去玩,主要也是觉得没啥好玩的(笑哭)。看完布莱恩阿瑟的《复杂经济学》后,里面那个酒吧问题勾起我的兴趣,最近空了就花了些时间实现个python版本,顺便搞了篇博文,很享受这种新知识能和已有知识碰撞的感觉。(配张前段时间拍的图片,梧桐山门口前面那条路,挺漂亮的)
  • 盐田港夜景
  • 为啥这猫总喜欢喝杯子里的水
  • 确实开始冷了,在树林里至少要比人类聚集区低个几度,进出入口就能很明显感觉到。看看深圳水库的风景,貌似后面的视野更开阔。
  • 给随笔加了多图的功能,传一传周末拍的风景图,漫无目的的逛也挺好玩的。