¿Cómo utilizar caracteres Unicode con PIL?

Me gustaría añadir texto ruso a la imagen. Yo uso PIL 1.1.7 y Python 2.7 en la máquina de Windows. Desde que PIL se compiló sin la biblioteca libfreetype , uso lo siguiente en el servidor de desarrollo:

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

( helvR24.pil se toma de http://effbot.org/media/downloads/pilfonts.zip )

En el entorno de producción hago lo siguiente:

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

(Intenté usar unic , cp-1251 lugar de utf-8 )

En ambos casos, no muestra caracteres rusos (en su lugar se muestran ‘cuadrados’ o caracteres ficticios). Creo que no funciona en el entorno de desarrollo ya que, probablemente, helvR24.pil no contiene caracteres rusos (no sé cómo verificarlo). Pero HelveticaRegular.ttf seguramente lo tiene. También comprobé que mi archivo .py tiene encoding геа-8. Y no muestra caracteres rusos, incluso con la fuente predeterminada:

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

¿Qué más debo probar / verificar? He mirado a través de https://stackoverflow.com/a/18729512/604388 – no ayuda.

Tuve un problema similar y lo resolví.

Hay un par de cosas que debes tener cuidado con:

  1. Asegúrese de que sus cadenas se interpreten como Unicode, ya sea importando unicode_literarls desde _____future_____ o bien, agregando la u a sus cadenas
  2. Asegúrate de que estás utilizando una fuente que es Unicode, hay algunas gratuitas aquí: fonts tipográficas de código abierto Unicode, te sugiero esto: dejavu

Aquí está el código:

 #!/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") 

aquí están los resultados

introduzca la descripción de la imagen aquí

¿Puedes examinar tu archivo TTF? Sospecho que no es compatible con los personajes que quieres dibujar.

En mi computadora (Ubuntu 13.04), esta secuencia produce la imagen correcta:

 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() 

Nb Cuando no especifiqué unicode ( u'...' ), el resultado fue mojibake .