2013-09-22 31 views
6

Tôi muốn thêm văn bản tiếng Nga vào hình ảnh. Tôi sử dụng PIL 1.1.7 và Python 2.7 trên máy Windows. Kể từ PIL biên soạn without libfreetype library, tôi sử dụng sau trên máy chủ phát triển:Làm thế nào để sử dụng các ký tự unicode với PIL?

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

(helvR24.pil được lấy từ http://effbot.org/media/downloads/pilfonts.zip)

Về môi trường sản xuất tôi làm như sau:

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

(cố gắng sử dụng unic, cp-1251 thay vì utf-8)

Trong cả hai trường hợp, nó không hiển thị ký tự tiếng Nga ('hình vuông' hoặc các ký tự giả được hiển thị thay thế). Tôi nghĩ rằng nó không hoạt động trên môi trường phát triển vì hầu hết có lẽ helvR24.pil không chứa các ký tự tiếng Nga (không biết cách kiểm tra nó). Nhưng HelveticaRegular.ttf chắc chắn có nó. Tôi cũng đã kiểm tra rằng tệp .py của tôi có mã hóa геа-8. Và nó không hiển thị các ký tự tiếng Nga ngay cả với phông chữ mặc định:

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

Tôi nên thử/xác minh những gì khác? Tôi đã xem xét thông qua https://stackoverflow.com/a/18729512/604388 - nó không giúp đỡ.

+0

cố gắng để vượt qua các văn bản như chuỗi unicode: 'draw.text ((0, 0), u'Текст на русском ', font = ImageFont.load_default()) ' – mata

+0

@mata, chắc chắn tôi đã thử nó rồi (cũng như' unicode (' Текст на русском ',' utf-8 ') '). Nó trả về 'UnicodeEncodeError: 'ascii' codec không thể mã hóa các ký tự ở vị trí 0-5: thứ tự không nằm trong phạm vi (128)' tham chiếu đến 'PIL \ ImageDraw.py", dòng 267, text mask = font.getmask (văn bản, self.fontmode) ' –

Trả lời

2

Bạn có thể kiểm tra tệp TTF của mình không? Tôi nghi ngờ rằng nó không hỗ trợ các nhân vật bạn muốn vẽ.

Trên máy tính của tôi (Ubuntu 13.04), chuỗi này tạo ra hình ảnh chính xác:

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. Khi tôi không chỉ định unicode (u'...'), kết quả là mojibake.

4

Tôi gặp sự cố tương tự và đã giải quyết vấn đề.

Có một vài điều bạn phải cẩn thận về:

  1. Đảm bảo rằng dây của bạn được hiểu là unicode, hoặc bằng cách nhập khẩu unicode_literarls từ _____future_____ hoặc bằng cách thêm vào trước các u để dây của bạn
  2. Đảm bảo bạn đang sử dụng phông chữ là unicode, có một số miễn phí tại đây: open-source unicode typefaces Tôi đề xuất điều này: dejavu

đây là mã:

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

đây là kết quả

enter image description here

+1

Tôi đã tạo một [tập lệnh vẽ tất cả các ký tự Unicode dựa trên câu trả lời của bạn] (https: //gist.github.com/zed/07a8175ba07f393a6004/83e59f794e9d746384e2c23fda4aad959730a104 # file-text2image-py) – jfs

Các vấn đề liên quan