6

Ich möchte dem Bild russischen Text hinzufügen. Ich benutze PIL 1.1.7 und Python 2.7 auf Windows-Rechner. Da PIL without libfreetype library zusammengestellt, verwende ich die folgende auf Entwicklungsserver:Wie verwendet man Unicode-Zeichen mit PIL?

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

(helvR24.pil von http://effbot.org/media/downloads/pilfonts.zip genommen wird)

Auf Produktionsumgebung ich folgendes tun:

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

(versucht zu verwenden, unic, cp-1251 anstelle von utf-8)

In beiden Fällen werden keine russischen Zeichen angezeigt (stattdessen werden 'Quadrate' oder Blindzeichen angezeigt). Ich denke, es funktioniert nicht auf Entwicklungsumgebung, da höchstwahrscheinlich helvR24.pil keine russischen Zeichen enthält (weiß nicht, wie man es überprüft). Aber HelveticaRegular.ttf hat es sicher. Ich überprüfte auch, dass meine .py Datei геа-8 Kodierung hat. Und es zeigt russische Zeichen auch mit Standardschrift nicht an:

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

Was sollte ich noch versuchen/verifizieren? Ich habe durch https://stackoverflow.com/a/18729512/604388 geschaut - es hilft nicht.

+0

versuchen, den Text als Unicode-String zu übergeben: 'draw.text ((0, 0), u'Текст на русском ', font = ImageFont.load_default()) ' – mata

+0

@mata, sicherlich habe ich das bereits versucht (sowie' unicode (' Текст на русском ',' utf-8 ') '). Es gibt 'UnicodeEncodeError: 'ascii' Codec kann Zeichen in Position 0-5 nicht codieren: Ordinal nicht im Bereich (128)' Bezug auf 'PIL \ ImageDraw.py", Zeile 267, Textmaske = font.getmask (Text, self.fontmode) '. –

Antwort

2

Können Sie Ihre TTF-Datei untersuchen? Ich vermute, dass die Zeichen, die Sie zeichnen möchten, nicht unterstützt werden.

Auf meinem Computer (Ubuntu 13.04), erzeugt diese Sequenz das richtige Bild:

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

N. B. Wenn ich keinen Unicode angegeben habe (u'...'), war das Ergebnis mojibake.

4

Ich hatte ein ähnliches Problem und löste es.

Es gibt ein paar Dinge, die Sie haben vorsichtig sein:

  1. Stellen Sie sicher, dass Ihre Strings als Unicode interpretiert werden, entweder durch unicode_literarls von _____future_____ oder durch Voranstellen des u auf die Saiten zu importieren
  2. Stellen Sie sicher, Sie eine Schriftart verwenden, die Unicode ist, gibt es einige freie hier: open-source unicode typefaces ich schlage vor, diese: dejavu

hier ist der Code:

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

hier die Ergebnisse

enter image description here

+1

Ich habe ein [Skript erstellt, das alle Unicode - Zeichen basierend auf Ihrer Antwort zeichnet] (https: //gist.github.com/zed/07a8175ba07f393a6004/83e59f794e9d746384e2c23fda4aad959730a104 # file-text2image-py) – jfs