Проблемы с PIL: не удалось загрузить какую-либо библиотеку шрифтов и использовать unicode

#python #unicode #fonts #python-imaging-library

#python #unicode #шрифты #python-imaging-library

Вопрос:

Я недавно установил PIL. Но я нахожу:

  1. Я не могу загрузить какую-либо библиотеку шрифтов, используя «ImageFont.truetype («xxx.ttc», 50)» и тому подобное.
  2. Когда я преобразую некоторый текст в изображение, а текст в формате unicode содержит китайские символы, я получаю ошибку UnicodeEncodeError типа:

Ошибка UnicodeEncodeError: кодек ‘ascii’ не может закодировать символ u ‘ u6211’ в позиции 0: порядковый номер не входит в диапазон (128)

Сценарий проблемы:

 # -*- coding: utf-8 -*-

import sys
from PIL import Image
import ImageFont, ImageDraw

text = sys.argv[1]
if not isinstance(text, unicode):
    text = text.decode('gbk')
filename = sys.argv[2]

image = Image.new("RGBA", (100, 100), (255,255,255))
usr_font = ImageFont.truetype("simsun.ttc", 50)  #In fact, it can't load any font lib.
d_usr = ImageDraw.Draw(image)
d_usr = d_usr.text((10, 10), text, fill = "blue", font=usr_font) #error when text is Chinese
image.save(filename)
  

Моя ОС Windows7 с установленным Python 2.5. Кто-нибудь может мне помочь? Заранее спасибо!

Ответ №1:

Это отлично работает на Ubuntu10.10 с python 2.6.6 Возможно, попробуйте использовать абсолютный путь к шрифту tcc?

Это код, который выполняется безупречно:

 #! /usr/bin/python
# -*- coding: utf-8 -*-

import Image
import ImageDraw
import ImageFont

ttfont = ImageFont.truetype ('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', 20)
text = u'我能有乾酪?'
image = Image.new ('RGB', (256, 128), 0xffffff);
ImageDraw.Draw (image).text ( (20, 20), text, font = ttfont, fill = (0, 0, 0) )
image.save ('chinese.jpg')
  

Комментарии:

1. Большое вам спасибо! Я обнаружил две допущенные мной ошибки: 1) Я использовал шрифт, которого не существует на моем компьютере, или имя без правильного пути. 2) Когда строка Unicode, состоящая из китайских символов, должна быть отображена в виде изображения, требуется китайский шрифт! В противном случае PIL жалуется на ошибку UnicodeEncodeError, которая, IMHO, может вводить в заблуждение.