游戏ttf字体瘦身脚本

游戏中通常会用到某种特定字体,而某些字体动则10+M,对某些游戏(尤其是小游戏)来讲是无法忍受的,此文章主要讲述上个项目中制作的字体裁剪脚本

工具git地址

  • 配置信息(config.json)
{	
	// 文本内容(可能为多语言表导出的内容)
    "txtFile": "gameText.txt",
    // 字体文件
    "fontFile": "江城圆体 600w_1.ttf",
    // 默认文字(英文字符,阿拉伯数字等)
    "defaultText": "",
    // 导出的相对路径
    "exportPath": "../client/assets/Bundles/Game/font/",
    // 裁剪后导出的字体名称
    "exportName": "font.ttf"
}
  • 文本内容(gameText.txt)
    文件内为游戏中使用到的文字,多语言项目为多语言表导出文件。
  • 脚本(fontShort.py)
    注释较全面,可自行理解。如有不解,请搭配AI。
import re
import json
from fontTools.ttLib import TTFont
from fontTools import subset

    

config = 'config.json' # 配置文件路径

# config配置
textFile = ''
fontFile = ''
defaultText = ''
exportPath = ''
exportName = ''

# 文本内容
gameText = ''


# 加载config文件
def _loadConfig():
    with open(config, 'r', encoding='utf-8') as file:
        content = file.read()
        jsonObj = json.loads(content)
        global textFile
        global fontFile
        global defaultText
        global exportPath
        global exportName

        textFile = jsonObj['txtFile']
        fontFile = jsonObj['fontFile']
        defaultText = jsonObj['defaultText']
        exportPath = jsonObj['exportPath']
        exportName = jsonObj['exportName']

# 加载TXT文件
def _loadText():
    with open(textFile, 'r', encoding='utf-8', errors='replace') as file:
        content = file.read()
    return content


# 去重
def _removeDuplicates(s):
    return ''.join(set(s))


# 检查字体文件中缺失的字
def _checkFontExits(str):
    noneStr = ""
    
    font = TTFont(fontFile)
    glyf = font["glyf"]

    for i in str:
        code = i.encode("unicode-escape").decode()
        if "\\u" in code:
            code = "uni" + code[2:].upper()
        if not glyf.has_key(code):
            dd = re.findall('[\u4e00-\u9fa5]', i)
            if(len(dd) > 0):
                noneStr += dd[0]
    if(noneStr == ""):
        return
    print("<---------------------------------------->")
    print("当前字体中缺失字: " + noneStr)
    print("<---------------------------------------->")

# 导出字体ttf
def _exportFont(textStr):
    font = subset.load_font(fontFile, subset.Options())
    exportFile = exportPath + exportName
    
    subsetter = subset.Subsetter()
    subsetter.populate(text = textStr)
    subsetter.subset(font)

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

    font.close()
    print("输出字体文件成功: " + exportFile)


def _main():
    _loadConfig()
    originText = defaultText + _loadText().replace('\n', '')
    print("去重前: ", originText)
    print("<-------------------->")
    gameText = _removeDuplicates(originText)
    print("去重后: ", gameText)

    _exportFont(gameText)

    _checkFontExits(gameText)

    print("subset done!")
    print("输入回车键继续")
    input()

_main()
  • 文件结构
    在这里插入图片描述
  • 脚本执行
    可以看出当前字体内还缺失文字
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蟹 !

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值