如何在PIL中使用unicode字符?

2024-04-23 20:29:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在图像中添加俄语文本。我在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-没用。


Tags: text图像文本pil环境loadttf字符
2条回答

我有一个类似的问题并解决了。

有几件事你必须小心:

  1. 确保字符串被解释为unicode,或者 从未来导入unicode文本 你的弦乐
  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")

结果如下

enter image description here

你能检查一下你的TTF文件吗?我怀疑它不支持你想画的角色。

在我的电脑(Ubuntu13.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

相关问题 更多 >