python - PIL 切断了字母的顶部

标签 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 上。接下来我应该尝试什么?

最佳答案

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

关于python - PIL 切断了字母的顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821882/

相关文章:

html - 向下滚动时如何更改粘性导航栏中的字体颜色?

jquery - 对齐DIV内的字体基线或显示内容 "outside" Canvas

html - 使用来自不同服务器的 css 链接到托管字体

c++ - 用于 C++ 的 Python API

python - 枕头错误(Python)无法打开共享对象文件

python - 创建自定义 Docker 镜像可以工作,但在容器中使用已安装的 mysql-connector-python 则不行

Python rdflib 和 SPARQL BIND 支持

python scipy.signal.peak_widths --> 绝对高度? (fft -3dB 阻尼)

python - 对多列进行条件选择 - Python

python - 从二维像素值数组创建灰度图像