为了好玩,我正在制作 shields.io 的命令行版本,所以没有浏览器/v8 引擎。我已经确定了大部分程序,但是给定一个字符串,我无法确定它将在屏幕上结束多长时间(以像素为单位),从而调整我的背景。我目前的解决方案只是获取字符串中每个字符的宽度总和(根据我在浏览器中运行的 js 脚本预先计算)。但是,当您添加特殊字符以及不同字母组合之间具有不同间距的事实时,我通常会得到太大或太小的盾牌。
所以我正在寻找一种算法,给定一个字体系列,返回字符串的宽度。
为了好玩,我正在制作 shields.io 的命令行版本,所以没有浏览器/v8 引擎。我已经确定了大部分程序,但是给定一个字符串,我无法确定它将在屏幕上结束多长时间(以像素为单位),从而调整我的背景。我目前的解决方案只是获取字符串中每个字符的宽度总和(根据我在浏览器中运行的 js 脚本预先计算)。但是,当您添加特殊字符以及不同字母组合之间具有不同间距的事实时,我通常会得到太大或太小的盾牌。
所以我正在寻找一种算法,给定一个字体系列,返回字符串的宽度。
我使用基于字体宽度的近似值和基于字符的百分比宽度来做到这一点。这段代码是用 Python 编写的,但很容易转移:
# A dictionary containing percentages that relate to how wide
# each character will be represented in a variable width font.
char_width_percentages = {
"lij|' ": 40.0,
'![]fI.,:;/\\t': 50.0,
'`-(){}r"': 60.0,
'*^zcsJkvxy': 70.0,
'aebdhnopqug#$L+<>=?_~FZT0123456789': 70.0,
'BSPEAKVXY&UwNRCHD': 70.0,
'QGOMm%W@': 100.0
}
我的代码在这里,顺便说一句,它也是一个命令行徽章生成工具。
所以我找到了一个适合我的解决方案。我正在使用golang,并且已经有一个ttf库,所以我加载了dejavu-sans字体并在库的帮助下计算了宽度。