游戏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()
  • 文件结构
    在这里插入图片描述
  • 脚本执行
    可以看出当前字体内还缺失文字
    在这里插入图片描述
### 回答1: 想要将shx字体转换为ttf字体,需要使用一些字体转换工具和软件。首先,在计算机上安装字体编辑软件,如FontCreator、FontForge等。然后,打开软件并导入shx字体文件。 接下来,对导入的字体文件进行一些调整和编辑,确保其在ttf格式中显示正常并无任何错误。可以调整字母间距、字符大小和形状等参数,以适应ttf格式的要求。 编辑完成后,保存字体文件,并将其导出为ttf格式。在导出时,需要选择ttf格式作为目标格式,并设置保存的文件路径。点击保存后,软件会自动将shx字体转换为ttf字体,并生成相应的文件。 转换完成后,可以在计算机上查看转换后的ttf字体文件。对于常见的操作系统,如Windows、Mac OS等,双击ttf文件即可在字体预览界面中看到转换后的字体效果。如果需要在系统中使用该字体,可以将ttf文件复制到系统字体文件夹,并在应用程序中选择并使用该字体。 需要注意的是,在进行shx字体转换为ttf字体时,可能会遇到一些问题,如字体格式不兼容、部分字符显示错误等。这时,可以通过编辑字体文件、调整字体参数等方法来解决问题。 总结起来,将shx字体转换为ttf字体需要使用字体编辑软件,对字体文件进行编辑和调整,然后导出为ttf格式。这样就可以在计算机上使用ttf字体,并在各种应用程序中应用该字体了。 ### 回答2: 将SHX字体转换为TTF字体是一个比较复杂的过程。SHX字体是由AutoCAD软件使用的专有字体格式,而TTF字体是一种常见的TrueType字体格式。要进行转换,需要使用特定的软件工具和技术。 首先,我们需要一个专业的字体转换工具,如FontForge或者TransType。这些工具可以将字体文件从一种格式转换为另一种格式。您可以通过在互联网上搜索这些工具来找到并下载它们。 安装好字体转换工具后,您需要打开SHX字体文件并将其导入转换工具中。然后,选择转换为TTF格式的选项,并开始转换。这个过程可能需要一些时间,具体取决于字体文件的大小和转换工具的性能。 完成转换后,您将得到一个TTF格式的字体文件。这个文件可以在大多数计算机系统上使用。您可以将它安装到操作系统中,或者将它用于各种设计和排版软件中。 需要注意的是,在进行字体转换时,可能会遇到一些问题。例如,由于SHX字体的特殊性质,转换后的TTF字体可能不会完全保留原始字体的所有细节和特点。因此,在选择字体转换工具和进行转换之前,最好先备份原始字体文件,以防万一。 总的来说,将SHX字体转换为TTF字体需要使用专业的字体转换工具,并按照相应的步骤进行操作。这样,您就可以方便地将SHX字体应用于其他软件和系统中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蟹 !

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

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

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

打赏作者

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

抵扣说明:

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

余额充值