我希望在这一点上是错误的,但唯一正确的修复依赖于修补 _imagingft.c 呈现文本的方式。PIL 依赖于 FreeType 来完成这项任务,但 PIL 似乎错误地计算了定位。此外,高度getsize
被高估了(尽管这不会造成问题)。目前,我在http://pastebin.com/jP2iLkDN上放了一个补丁来处理这些问题(似乎有更好的方法来修补渲染代码)。
以下是我分别在没有补丁和有补丁的情况下得到的一些输出示例:
使用链接讨论中存在的代码的结果。在 OSX 上:
在 Ubuntu 上:
这是生成顶级数字的代码:
# -*- encoding: utf8 -*-
import sys
import Image, ImageDraw, ImageFont
im = Image.new("RGBA", (1000, 1000), 'white')
draw = ImageDraw.Draw(im)
start_y = 7
text = u'\u00d1\u00d3yŻ\u00d4Ćgp\u010c\u0137'
for i in xrange(28, 46, 2):
font = ImageFont.truetype('Junicode-Bold.ttf', i)
width, height = font.getsize(text)
draw.rectangle((0, start_y, width, height + start_y), outline='blue')
draw.text((0, start_y), text, font=font, fill='black')
start_y += height + 7
im.crop((0, 0, width + 1, start_y + 2)).save(sys.argv[1])
底部的数字是根据链接主题中关于 PIL 截断部分文本的代码生成的。