2009-12-28 49 views

Trả lời

61

Sử dụng Draw.textsize method để tính kích thước văn bản và tính lại vị trí tương ứng.

Dưới đây là một ví dụ:

from PIL import Image, ImageDraw 

W, H = (300,200) 
msg = "hello" 

im = Image.new("RGBA",(W,H),"yellow") 
draw = ImageDraw.Draw(im) 
w, h = draw.textsize(msg) 
draw.text(((W-w)/2,(H-h)/2), msg, fill="black") 

im.save("hello.png", "PNG") 

và kết quả:

image with centered text

+5

draw.textsize: (tự, văn bản, phông chữ = Không) – WeizhongTu

+4

Nếu cỡ chữ của bạn khác nhau, điều quan trọng là phải bao gồm phông chữ như sau: 'draw.textsize (msg, font = myFont)', nếu không nó sẽ thắng 't lấy đúng cách trung tâm – Coco

2

Sử dụng phương pháp textsize (xem docs) để tìm ra kích thước của đối tượng văn bản của bạn trước khi thực sự vẽ nó. Sau đó vẽ nó bắt đầu tại tọa độ thích hợp.

42

Dưới đây là một số mã ví dụ trong đó sử dụng textwrap chia một đường dài thành từng mảnh, và sau đó sử dụng textsize để tính toán các vị trí.

from PIL import Image, ImageDraw, ImageFont 
import textwrap 

astr = '''The rain in Spain falls mainly on the plains.''' 
para = textwrap.wrap(astr, width=15) 

MAX_W, MAX_H = 200, 200 
im = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0)) 
draw = ImageDraw.Draw(im) 
font = ImageFont.truetype(
    '/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 18) 

current_h, pad = 50, 10 
for line in para: 
    w, h = draw.textsize(line, font=font) 
    draw.text(((MAX_W - w)/2, current_h), line, font=font) 
    current_h += h + pad 

im.save('test.png') 

enter image description here

+0

+1 cho ví dụ sử dụng tham số phông chữ tùy chọn – btk

3

Bạn có thể tìm thấy một thực hiện điều này tại http://tools.jedutils.com/tools/center-text-image

Bạn có thể sử dụng trang đó để tạo hình ảnh ngay tại đó thay vì thực hiện các thói quen mình nhưng mã sử dụng được bao gồm trên cũng vậy.

9

Một lưu ý rằng phương thức Draw.textsize không chính xác. Tôi đã làm việc với hình ảnh pixel thấp, và sau khi thử nghiệm một số, nó bật ra rằng textize xem xét mọi nhân vật được 6 điểm ảnh rộng, trong khi một "tôi" mất tối đa. 2 pixel và "W" mất tối thiểu. 8 pixel (trong trường hợp của tôi). Và như vậy, tùy thuộc vào văn bản của tôi, nó đã hoặc không được tập trung ở tất cả. Mặc dù, tôi đoán "6" là trung bình, vì vậy nếu bạn đang làm việc với các văn bản dài và hình ảnh lớn, nó vẫn nên được ok.

Nhưng bây giờ, nếu bạn muốn có một số chính xác thực, bạn sử dụng tốt hơn các phương pháp getSize của đối tượng font bạn đang sử dụng:

arial = ImageFont.truetype("arial.ttf", 9) 
w,h = arial.getsize(msg) 
draw.text(((W-w)/2,(H-h)/2), msg, font=arial, fill="black") 

Như được sử dụng trong liên kết Edilio của.

+0

Không phải là câu trả lời cho câu hỏi của OP, nhưng chức năng cần thiết khẩn trương. 1+ – ddlab

+0

Thông báo quan trọng: Chức năng này 'getize' chấp nhận các ký tự không phải latin như Umlauts € hoặc tiếng Đức. 'textize' thì không. ThumbsUp :-) – ddlab

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