¿Cómo centraría (alinearía verticalmente y alinearía verticalmente) el texto al usar PIL?Centrar/alinear el texto medio con PIL?
Respuesta
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:
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.
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')
+1 para el uso ejemplo de parámetro de fuente opcional – btk
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
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.
- 1. Dibuje texto en negrita/cursiva con PIL?
- 2. Ajustar texto en PIL
- 3. CSS div pantalla completa con el texto en el medio
- 4. grep para el texto con comodín entre medio
- 5. Dibujar texto multilingüe usando PIL
- 6. imágenes Optimizar .png con PIL
- 7. Python PIL: ¿Cómo dibujar una elipse en el medio de una imagen?
- 8. Obtener el RGB de píxel con PIL
- 9. Texto de medio corte en Spinner Android
- 10. PIL cómo escalar el tamaño del texto en relación con el tamaño de la imagen
- 11. ¿Cursor en el medio de una caja de texto?
- 12. Regex Reemplazar en el medio
- 13. cómo poner texto en el medio de una imagen
- 14. ¿Cómo usar PIL con PyPy?
- 15. Hombre en el ataque medio con Scapy
- 16. calcular el punto medio
- 17. Crear un halo alrededor del texto en Python usando PIL?
- 18. PIL ¿Mejor manera de reemplazar el color?
- 19. python PIL dibujar texto multilínea en la imagen
- 20. Me gustaría implementar una mitad UITableView medio MapView UIView con un botón en el medio
- 21. WinForms | C# | ¿Autocompletar en medio de un cuadro de texto?
- 22. Gif de redimensionamiento de Python con PIL
- 23. Python, dibuje un círculo con PIL
- 24. Cargar mapa de bits RGBA con PIL
- 25. Recorte automático de imágenes con PIL
- 26. ¿Cómo puedo generar miniaturas circulares con PIL?
- 27. Problemas con Snow Leopard, Django y PIL
- 28. Copiando región de imagen triangular con PIL
- 29. Escribir texto con signos diacríticos ("nikud", vocalización) usando PIL (Biblioteca de imágenes de Python)
- 30. iPhone - Cómo dibujar texto en medio de un rectángulo
draw.textsize: (self, text, font = None) – WeizhongTu
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