Añadir texto a una imagen con PIL / Pillow



Versión: 2.x, 3.x.

Pillow es una librería para el procesamiento de imágenes en Python, aunque mucho más preparada para la lectura y análisis que para la escritura. Sin embargo, permite escribir imágenes en los principales formatos y realizar algunas tareas de dibujo (líneas, formas, texto). La funcionalidad de añadir textos es en sí bastante limitada, pero en la mayoría de los casos suficiente.

Utilicaremos la siguiente imagen marte.jpg (¡qué belleza!).

Marte

Empezamos por importar las clases necesarias.

from PIL import Image, ImageDraw, ImageFont

Luego, abrir la imagen que deseamos editar y crear una instancia de ImageDraw para dibujar sobre la misma.

image = Image.open("marte.jpg")
draw = ImageDraw.Draw(image)

Antes de añadir un texto es necesario crear la fuente. PIL utiliza su propio formato de archivos para fuentes de texto, aunque también soporta TrueType y OpenType. Usuarios de Microsoft Windows pueden utilizar, por ejemplo, Arial.

font = ImageFont.truetype("arial.ttf", 60)

El primer argumento indica la ubicación del archivo de fuente. En Windows, si no se especifica una ruta, el archivo será buscado en la carpeta de fuentes del sistema (usualmente C:\Windows\Fonts). El segundo argumento establece el tamaño.

En sistemas basados en Unix deberá especificarse la ruta completa. Por ejemplo:

font = ImageFont.truetype("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf", 60)

Una vez cargada la fuente, la función ImageDraw.Draw.text inserta el texto en una posición y con un color específicos.

draw.text((50, 50), "MARTE DESDE EL ESPACIO", font=font, fill="white")

El primer argumento establece la posición (x, y) del texto en la imagen. Las coordenadas (0, 0) corresponden a la esquina superior izquierda.

El parámetro fill especifica el color, que bien puede ser una tupla con el formato RGBA. Por ejemplo, (255, 255, 255, 255) es equivalente a "white". El cuarto elemento es el valor del canal alpha (255 es totalmente opaco, 0 totalmente transparente). La funcionalidad de agregar contorno al texto no es soportada.

Guardamos el archivo como marte2.jpg.

image.save("marte2.jpg")

Marte desde el espacio

Código completo:

from PIL import Image, ImageDraw, ImageFont

image = Image.open("marte.jpg")
draw = ImageDraw.Draw(image)
# O bien /usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf.
font = ImageFont.truetype("arial.ttf", 60)
draw.text((50, 50), "MARTE DESDE\nEL ESPACIO", font=font, fill="white")
image.save("marte2.jpg")

Para textos con múltiples líneas, debe utilizarse multiline_text().

draw.multiline_text((50, 50), "MARTE DESDE\nEL ESPACIO", font=font, fill="white")

Marte desde el espacio

Adicionalmente soporta la alineación del texto vía del parámetro align. Debe ser especificado con los valores "left" (izquierda, por defecto), "center" (centrado) or "right" (derecha).

draw.multiline_text((50, 50), "MARTE DESDE\nEL ESPACIO", font=font,
                    fill="white", align="center")

Marte desde el espacio

Por último, el siguiente código coloca el texto en el centro de la imagen.

text = "MARTE DESDE EL ESPACIO\n(Imagen de la NASA)"

# Centrar texto vertical y horizontalmente.
lines = text.splitlines()
w = font.getsize(max(lines, key=lambda s: len(s)))[0]
h = font.getsize(text)[1] * len(lines)
x, y = image.size
x /= 2
x -= w / 2
y /= 2
y -= h / 2
    
draw.multiline_text((x, y), text, font=font, fill="white",
                    align="center")
image.save("marte2.jpg")

Marte desde el espacio



Deja una respuesta