【问题标题】:PIL cuts off top of lettersPIL 切断字母的顶部
【发布时间】:2018-12-23 15:52:29
【问题描述】:

我花了很多时间使用 Python 制作我的第一个 Web 应用程序,并且我使用 来生成图像。经过大量阅读,我设法实现了正确的文本对齐、换行、生成具有许多扩展名的文件等。

但是,PIL 生成的所有文本都在顶部被截断。这是一个示例。

应该以多种字体显示ŻÓĆjygpq(字体名称在左侧)。

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

我尝试了许多不同大小的字体,但文字仍然被截断。我什至尝试使用 PIL 字体,但它仍然不起作用。 [还将 OTF 转换为 BDF 和 PIL]。

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

【问题讨论】:

  • 有趣的问题,如果不进入 PIL 的 C 部分就可以解决这个问题,我会感到惊讶。
  • 您能否提供用于打印这些文本的示例代码?我已经修补了 _imagingft.c,它似乎适用于我测试的字体。
  • 感谢您的回答。我稍微简化了一点,但方法是一样的:color_text = 'black' text2 = 'DejaVuSans.ttf' font1 = ImageFont.truetype('/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf', 34) draw.text((20,50), text2, color_text, font=font1) 它没有什么花哨的,只是用于包装、居中等的一些计算,所以它只是 pil 提供的基本 draw.text。理论上它应该开箱即用,尤其是那些 PIL 类型的字体。

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


【解决方案1】:

我希望在这个问题上是错误的,但唯一正确的修复依赖于修补 _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 截断部分文本的代码生成的。

【讨论】:

  • 这个补丁的一个缺点是当你一个字母一个字母地写而不是一次写整个文本时会引起麻烦(垂直对齐问题)。为了解决这个问题,补丁需要进一步修改 PIL 以便它返回文本的基线(一个好地方似乎在 getsize),然后在调用 render 时传递该值。函数getsize 还需要在垂直方向返回适当的偏移量,目前始终为 0。
  • 你为我节省了很多时间。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多