2012-12-11 38 views
5

我花了很多时间使用Python制作我的第一个Web应用程序,并且我使用来生成图像。阅读了很多后,我设法实现了适当的文本对齐,打包,生成具有许多扩展名的文件等。PIL截断字母的顶部

但是,由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上。接下来我应该尝试什么?

+0

有趣的问题,如果可以修改而不进入PIL的C部分,我会感到惊讶。 – mmgp

+0

您是否可以包含用于打印这些文本的示例代码?我修补了_imagingft.c,它似乎适用于我测试的字体。 – mmgp

+0

感谢您的回答。 我简化它一点点,但该方法是一样的: ''color_text = '黑' 文本2 = 'DejaVuSans.ttf' font1 = ImageFont.truetype('的/ usr /共享/字体/的TrueType/TTF -dejavu/DejaVuSans.ttf',34) draw.text((20,50),text2,color_text,font = font1)'' 它没有任何花哨的东西,只是几个计算包装,居中等 所以这只是pil提供的基本draw.text。理论上它应该是开箱即用的,特别是那些PIL类型的字体。 – Matt

回答

4

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

这里是输出I得到无贴片并与补丁,分别的一些例子:使用存在于连接的讨论中的代码

  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剪切部分文本的代码生成的。

+0

这个补丁的一个缺点是,当你一次一个字母地写信而不是整个文本时,它会引起麻烦(垂直对齐问题)。为了解决这个问题,补丁需要进一步修改PIL,以便返回文本的基线(好处是'getsize'),然后在调用'render'时传递该值。函数'getsize'也需要返回垂直方向的正确偏移量,当前总是为0. – mmgp

+0

您为我节省了很多时间。谢谢! – lqdc

1

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

+0

谢谢你的答案,不幸的是它没有帮助。 – Matt