使用fontforge精简字体文件

这里写自定义目录标题

为什么用FontForge

因为它是开源免费的,而且项目中我只需要精简字体文件,或者增删个别字形,没有更深层次的需求;

FontForge精简字体文件脚本

这个是核心,用的原生脚本,也就是pe文件,你也可以自行改成python文件,我不会python;代码简单,主要就是传入字符的整型值,如果是-连接的就是范围型选择,否则是单个选择,然后反选,删除自行,再生成新的字体文件(这里可能不会覆盖同名文件,没测试)。

#调用命令样例: "C:\Program Files (x86)\FontForgeBuilds\bin\fontforge.exe" -script C:\Users\Mike\Documents\FontCut.pe C:\Users\Mike\Documents\Volv-Bold.ttf 65-90 128

if($argc <= 2)
	Print("no enough args!")
	return(0)
endif

argCnt=$argc - 2
totalArray=Array(argCnt)
index=2
while(index < $argc)
	str = StrSplit($argv[index], "-", 2)
	strCnt = SizeOf(str)
	tmpArr = Array(strCnt)
	if(strCnt > 0)
		tmpArr[0] = Strtol(str[0])
	endif

	if(strCnt > 1)
		tmpArr[1] = Strtol(str[1])
	endif
	
	totalArray[index - 2] = tmpArr
	++index
endloop

Open($1)
Reencode("unicode")

totalSize = SizeOf(totalArray)
index = 0
while(index < totalSize)
	tmpArr = totalArray[index]
	tmpCnt = SizeOf(tmpArr)
	if(tmpCnt > 1)
		SelectMore(tmpArr[0], tmpArr[1])
	elseif(tmpCnt > 0)
		SelectMore(tmpArr[0])
	endif
	++index
endloop

SelectInvert()
DetachAndRemoveGlyphs()
UnlinkReference()
Generate("NewOutputFont.ttf")
Clear()
Close()

Unity中调用cmd执行上述脚本

调用cmd代码:

private void CutFont()
{
	var arg = GetArguments();
	
	ProcessStartInfo psInfo = new ProcessStartInfo("cmd.exe");
	psInfo.CreateNoWindow = true;
	psInfo.UseShellExecute = false;
	psInfo.RedirectStandardError = true;
	psInfo.RedirectStandardInput = true;
	psInfo.RedirectStandardOutput = true;
	psInfo.ErrorDialog = true;
	psInfo.Arguments = string.Format("/k {0}", arg);
	psInfo.StandardOutputEncoding = Encoding.UTF8;
	psInfo.StandardErrorEncoding = Encoding.UTF8;

	Process ps = Process.Start(psInfo);
	//不可使用writeline的方式,输入的命令会被解析为乱码,用上面/k的方式
	// ps.StandardInput.WriteLine("ln");
	ps.StandardInput.AutoFlush = true;
	ps.WaitForExit();
	if (ps.ExitCode == 0)
	{
		Debug.Log("处理成功,请查看处理后字体文件,并进行改名等后续处理. 路径:" + outputPath + "/NewOutputFont.ttf");
	}
	else
	{
		Debug.Log(ps.StandardOutput.ReadToEnd());
	}

	ps.Close();
}

构造参数代码:

private string GetArguments()
{
	var result = new StringBuilder();
	//fontforge脚本无法指定路径generate,所以先cd到输出目录
	result.Append(string.Format("cd \"{0}\" && ", outputPath));
	//加入fontforge执行程序路径
	result.Append(string.Format("\"{0}\" -script", FontForgeRootPath + "/bin/fontforge.exe"));
	result.Append(" ");
	//添加精简脚本位置参数, 为防止路径有空格,需要用双引号括起来
	result.Append(string.Format("\"{0}\"", scriptPath));
	result.Append(" ");
	//添加源字体文件位置
	result.Append(string.Format("\"{0}\"", sourceFontPath));
	result.Append(" ");
	//添加字符参数
	foreach (var characterPair in _keepCharacters)
	{
		if (characterPair.Length > 1)
		{
			result.Append((int)characterPair[0] + "-" + (int)characterPair[1]);
		}else
		{
			result.Append((int)characterPair[0]);
		}

		result.Append(" ");
	}
	//最后加上退出代码
	result.Append("&& exit");
	return result.ToString();
}
    原文作者:hellemic
    原文地址: https://blog.csdn.net/qq_34469717/article/details/122544522
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞