从字体创建文本预览的方法

1 投票
3 回答
20428 浏览
提问于 2025-04-15 17:07

我现在在用ImageMagick的convert命令把.ttf字体文件转换成文本预览的.png图片。总体来说,它在自动文本定位方面表现得更好,尽管有时候会无法读取一些有效的.ttf文件。速度虽然不算快,但也能接受。

PIL的ImageFont在文本对齐方面似乎不太好,常常会把第一个字符的左下角打印到画布外面。

有没有人知道除了这两个工具还有什么更好的选择?我想知道像myfonts.com这样流量很大的网站,文本预览部分需要什么技术支持。

编辑

这是一个PIL字体无法正确绘制的例子。示例中使用的字体是 Hanford script

import Image, ImageDraw, ImageFont
font = ImageFont.truetype('HANFORD_.TTF', 122)
text_width, text_height = font.getsize('Hanford script')
print text_width, text_height
>>> 833 47
img = Image.new('RGBA', (text_width, text_height))
draw = ImageDraw.Draw(img)
draw.text((0, 0), 'Hanford script', font=font, fill=(0, 0, 0))
img.save('output.png')

输出的图片只包含了“Hanford script”的上半部分。

我试着用imagemagick的convert命令:

convert -font "HANFORD_.TTF" -background transparent -gravity center -size 830x80 label:'Hanford script' output.png

输出的图片和我用PIL得到的结果是一样的。

这并不是唯一一个PIL或imagemagick无法正确显示文本大小的字体。对于其他一些字体,比如 Ginga,它们会放大文本高度,导致输出图片的上半部分是空白的。有人知道原因吗?

3 个回答

0

我也遇到过同样的问题。几天前,我发现了这个库。我试了一下,感觉真的很有用。因为我也有过类似的困扰,所以分享这个链接给大家。

https://github.com/MatteoGuadrini/fontpreview

这是一个字体预览的例子:

from fontpreview import FontPreview

fp = FontPreview('/tmp/noto.ttf')
fp.save('/tmp/fp.png')
0

这有点偏门,但你有没有听说过 sIFR (可缩放的Inman Flash替代品)? 这个东西可以让网页设计师在网页上插入一些短文本(比如标题),而这些文本可以用他们想要的任何字体来显示,即使用户的电脑上没有安装这种字体。

如果你用sIFR创建一个简单的网页,然后在自己电脑上打开,这可能会满足你的需求。

就像我说的,这个方法有点奇怪,但……:-)

1

我想这些网站可能是用一些简单的自定义代码来实现的,可能用的是像 Pango 这样的工具,或者直接用最基本的 Freetype 来处理后台的图像文件。

这些图像可能根本不会存到硬盘上,不过我相信在合适的地方会有缓存的机制。

撰写回答