【问题标题】:How to use unicode characters with PIL?如何在 PIL 中使用 unicode 字符?
【发布时间】:2013-09-27 08:48:13
【问题描述】:

我想在图像中添加俄语文本。我在 Windows 机器上使用 PIL 1.1.7 和 Python 2.7。由于 PIL 编译了without libfreetype library,我在开发服务器上使用了以下内容:

font_text = ImageFont.load('helvR24.pil')
draw.text((0, 0), 'Текст на русском', font=font_text)

helvR24.pil取自http://effbot.org/media/downloads/pilfonts.zip

在生产环境中,我执行以下操作:

font_text = ImageFont.truetype('HelveticaRegular.ttf', 24, encoding="utf-8")
draw.text((0, 0), 'Текст на русском', font=font_text)

(尝试使用uniccp-1251而不是utf-8

在这两种情况下,它都不会显示俄语字符(而是显示“正方形”或虚拟字符)。我认为它在开发环境中不起作用,因为很可能helvR24.pil 不包含俄语字符(不知道如何检查它)。但是HelveticaRegular.ttf 肯定有。我还检查了我的.py 文件有 геа-8 编码。即使使用默认字体,它也不显示俄语字符:

draw.text((0, 0), 'Текст на русском', font=ImageFont.load_default())

我还应该尝试/验证什么?我看过https://stackoverflow.com/a/18729512/604388 - 它没有帮助。

【问题讨论】:

  • 尝试将文本作为 unicode 字符串传递:draw.text((0, 0), u'Текст на русском', font=ImageFont.load_default())
  • @mata,我肯定已经尝试过了(以及unicode('Текст на русском', 'utf-8'))。它返回 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) 引用 PIL\ImageDraw.py", line 267, text mask = font.getmask(text, self.fontmode)

标签: python google-app-engine unicode python-imaging-library


【解决方案1】:

我遇到了类似的问题并解决了。

有几点需要注意:

  1. 确保您的字符串被解释为 unicode,或者通过 从_____future_____ 导入 unicode_literarls 或在前面加上 u 到你的字符串
  2. 确保您使用的是 unicode 字体,有一些免费的 这里:open-source unicode typefaces 我建议:dejavu

代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter

#configuration
font_size=36
width=500
height=100
back_ground_color=(255,255,255)
font_size=36
font_color=(0,0,0)
unicode_text = u"\u2605" + u"\u2606" + u"Текст на русском"

im  =  Image.new ( "RGB", (width,height), back_ground_color )
draw  =  ImageDraw.Draw ( im )
unicode_font = ImageFont.truetype("DejaVuSans.ttf", font_size)
draw.text ( (10,10), unicode_text, font=unicode_font, fill=font_color )

im.save("text.jpg")

这是结果

【解决方案2】:

您能检查一下您的 TTF 文件吗?我怀疑它不支持您要绘制的字符。

在我的计算机 (Ubuntu 13.04) 上,此序列生成正确的图像:

ttf=ImageFont.truetype('/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 16)

im = Image.new("RGB", (512,512), "white")
ImageDraw.Draw(im).text((00,00), u'Текст на русском', fill='black', font=ttf)

im.show()

注意当我没有指定unicode(u'...')时,结果是mojibake

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2021-01-31
    相关资源
    最近更新 更多