如何在PIL中使用unicode字符?

LA_*_*LA_ 7 python unicode google-app-engine python-imaging-library

我想在图像中添加俄语文本.我在Windows机器上使用PIL 1.1.7和Python 2.7.由于PIL编译时没有libfreetype库,我在开发服务器上使用以下代码:

font_text = ImageFont.load('helvR24.pil')
draw.text((0, 0), '????? ?? ???????', font=font_text)
Run Code Online (Sandbox Code Playgroud)

(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)
Run Code Online (Sandbox Code Playgroud)

(试图使用unic,cp-1251而不是utf-8)

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

draw.text((0, 0), '????? ?? ???????', font=ImageFont.load_default())
Run Code Online (Sandbox Code Playgroud)

我还应该尝试/验证什么?我通过/sf/answers/1311065871/查看 - 它没有帮助.

Jac*_*ova 8

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

有几件事你需要注意:

  1. 确保将字符串解释为unicode,方法是从_____future_____导入unicode_literar,或者将u添加到字符串中
  2. 确保你使用的是unicode字体,这里有一些免费的:开源unicode字体我建议: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")
Run Code Online (Sandbox Code Playgroud)

这是结果

在此输入图像描述


Rob*_*obᵩ 4

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

\n\n

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

\n\n
ttf=ImageFont.truetype(\'/usr/share/fonts/truetype/msttcorefonts/Arial.ttf\', 16)\n\nim = Image.new("RGB", (512,512), "white")\nImageDraw.Draw(im).text((00,00), u\'\xd0\xa2\xd0\xb5\xd0\xba\xd1\x81\xd1\x82 \xd0\xbd\xd0\xb0 \xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xbe\xd0\xbc\', fill=\'black\', font=ttf)\n\nim.show()\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n