最近看到一款工具软件可以直接处理 FontSubsetGUI或FontPruner

1.扩充TTF字体文件

有时为了表现效果可能会使用一些特殊的字体,非常见的ttf字体可能会缺少某些生僻字,这时游戏里就会显示空白,可以使用footTools 从大型字库(如微软雅黑)中把缺少的生僻字塞入目标字库,这样虽然看着字形会有些差异,但是不影响阅读

2. 对较大的TTF字体文件进行缩包,仅挑出使用到的字符

目前在开发网页小游戏,使用的ttf字体文件太大了足有十多M。公司一直有开发多语言游戏的习惯 所以所有文本都会集中的一个配置文件中(方便翻译其他语言),所以就考虑挑出游戏使用到的字符,从而缩小ttf字体,减少初期进入游戏的下载量。

网上搜到一篇参考链接

测试了一下效果还是挺好的,12.8M >> 0.6M
在这里插入图片描述

我的python 版本是 3.10.6
首先安装 fontTools

pip install fontTools

完整脚本如下:
注意: 这里的json要求是简单的key:value格式,例如:

{
	"ok": "好的",
	"cancel": "取消",
	... ...
}

可以根据自己的需求进行调整

#!/usr/bin/python
# coding=UTF-8

import sys
import json
import os
from fontTools.ttLib import TTFont
from fontTools import subset

#source_font: 全量TTF字体源文件
#json_file: 字段的json文件
#out_file: 导出的字体文件
def generate(source_font, json_file, out_file):
    all_chars = []
    checker = {}
    with open(json_file, 'r', encoding='utf-8') as f:
        text_data = json.load(f)

        for key, value in text_data.items():
            for char in value:
                uid = ord(char)
                if uid not in checker:
                    checker[uid] = True
                    all_chars.append(char)

    #所有文本
    text = ''.join(all_chars)

    #TTF源文
    #font = TTFont(source_font)  NOTE: 这一版在源文件不变的情况下 生成的字体包md5会发生变化 改成下边这种方式
    font = subset.load_font(source_font, subset.Options())

    #挑出需要的字符
    subsetter = subset.Subsetter()
    subsetter.populate(text=text)
    subsetter.subset(font)

    # 生成输出文件
    subset.save_font(font, out_file, subset.Options())

    font.close()

if __name__ == '__main__':
    nargv = len(sys.argv)-1
    if nargv< 2 or nargv>3:
        print("you need input 2 or 3 args:\n param@1 is a fully ttf file\n param@2 is a json file whose values are the characters you need\n param@3 is optional, you can determine the outfile name by this param, default value in picked.ttf")
        exit(-1)

    source_font = sys.argv[1]
    if not os.path.exists(source_font):
        print('please source font ttf file:%s is invalid!'.format(source_font))
        exit(-1)

    json_file = sys.argv[2]
    if not os.path.exists(json_file):
        print('json file:%s is not valid!'.format(source_font))
        exit(-1)

    out_file = "picked.ttf"
    if nargv == 3:
      out_file = sys.argv[3]

    generate(source_font, json_file, out_file)
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐