PIL切断字母顶部

时间:2012-12-11 14:22:15

标签: python fonts python-imaging-library text-rendering

我花了很多时间使用Python创建我的第一个Web应用程序,并且我使用来生成图像。在阅读了很多内容之后,我设法实现了正确的文本对齐,包装,生成具有许多扩展的文件等。

然而,PIL生成的所有文本都在顶部被截断。这是一个样本。

Example of PIL-generated image with text cut off at the top

应该用各种字体说ŻÓĆjygpq(字体名称在左边)。

我在这里找到的帖子很少:fonts clipping with PIL, 但我想避免使用另一个模块(aggdraw);因为我已经在PIL中找到了很多东西,所以我想坚持下去。

我尝试了很多不同大小的字体,但文字仍然被切断了。我甚至尝试使用PIL字体,但它仍然无效。 [还将OTF转换为BDF,并转换为PIL]。

这是在Ubuntu上。我接下来应该尝试什么?

2 个答案:

答案 0 :(得分:4)

我希望在这个问题上出错,但唯一正确的解决办法依赖于修补_imagingft.c 呈现文本。 PIL依赖FreeType来完成这项任务,但是PIL似乎错误地计算了定位。此外,getsize中的高度被高估(尽管这不会导致问题)。目前,我已经在http://pastebin.com/jP2iLkDN添加了一个补丁来处理这些问题(似乎有更好的方法来修补渲染代码)。

以下是我没有补丁和补丁的输出的一些示例:

enter image description here enter image description here

结果使用链接讨论中的代码。在OSX上:

enter image description here enter image description here

在Ubuntu上:

enter image description here enter image description here

以下是生成顶部数字的代码:

# -*- 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切断文本部分的链接主题中的代码生成底部数字。

答案 1 :(得分:1)

不是最好的解决方案,但我看到人们通过在文本中添加一个前导空格来解决这个问题。