2009-12-28 33 views

Respuesta

61

Utilice Draw.textsize method para calcular el tamaño del texto y recalcular la posición en consecuencia.

Aquí es un ejemplo:

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

y el resultado:

image with centered text

+5

draw.textsize: (self, text, font = None) – WeizhongTu

+4

Si el tamaño de fuente es diferente, es importante incluir la fuente como esta: 'draw.textsize (msg, font = myFont)', de lo contrario, ganó no se centra correctamente – Coco

2

Utilice el método textsize (consulte docs) para averiguar las dimensiones de su objeto de texto antes de dibujarlo. Luego, dibuja comenzando en las coordenadas apropiadas.

42

Aquí es un código de ejemplo que utiliza TextWrap para dividir una línea larga en pedazos, y luego utiliza la textsize método para calcular las posiciones.

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 para el uso ejemplo de parámetro de fuente opcional – btk

3

Usted puede encontrar una implementación de este a http://tools.jedutils.com/tools/center-text-image

Se podría utilizar esa página para crear la imagen de la derecha allí en vez de poner en práctica la rutina sí mismo, pero el código utilizado está incluido en el página también

9

Se debe tener en cuenta que el método Draw.textsize es inexacto. Estaba trabajando con imágenes de bajo nivel de píxeles, y después de algunas pruebas, resultó que Textize considera que cada personaje tiene 6 píxeles de ancho, mientras que una "I" toma un valor máximo. 2 píxeles y una "W" lleva min. 8 píxeles (en mi caso). Y así, dependiendo de mi texto, estaba o no centrado en absoluto. Sin embargo, supongo que "6" era un promedio, por lo que si está trabajando con textos largos e imágenes grandes, todavía debería estar bien.

Pero ahora, si quieres algo de precisión verdadera, es mejor utilizar el método getSize del objeto de fuente que va a utilizar:

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

Tal como se usa en el enlace de Edilio.

+0

No es la respuesta a la pregunta del OP, pero bonita función que se necesita con urgencia. 1+ – ddlab

+0

Aviso importante: esta función 'getsize' acepta caracteres no latinos como € o diéresis alemanes. 'textsize' no. Pulgares hacia arriba :-) – ddlab

Cuestiones relacionadas