Python Pillow: Creando imágenes con PIL

PIL (Python Imagin Library) son unas librerías de Python destinadas al procesamiento de imágenes. Gracias a esto podemos manipular imágenes, crearlas, insertar texto, imágenes y todo ello lanzando un simple script. En este artículo usaremos un fork de PIL llamado Pillow, aunque nos referiremos a él como PIL. Está soportado tanto en Python 2.7 como en la versión 3, en este artículo se usará la versión de Python 2.7.

Instalación de PIL

Para instalar las librerías PIL (el paquete se llama pillow) tenemos varias opciones, personalmente recomiendo instalar los paquetes Python desde pip.

pip install pillow

apt-get install python-pillow

Creando una imagen en blanco

Una vez instalado PIL podemos comenzar a crear nuestras imágenes con un simple script, en esta ocasión generaremos una imagen de 800 por 600 píxeles de color blanco, por defecto PIL usa el color negro.

from PIL import Image
img = Image.new('RGBA', (800, 400), "white") 
img.save('image.png')

 

Insertando texto en la imagen

Para insertar texto en la imagen usaremos la clase ImageDraw:

from PIL import Image
from PIL import ImageFont 
from PIL import ImageDraw 

img = Image.new('RGB', (800, 400), "white") 
draw = ImageDraw.Draw(img) 
font = ImageFont.truetype("/ruta/LiberationSerif-Bold.ttf", 36) 
draw.text((20, 20),"Conectabell",(0,2,27),font=font) 
img.save('image.png')

Podemos asignarle una fuente con la clase ImageFont, debemos asignarle la ruta hacia la fuente y el tamaño. Una vez seleccionada la fuente usamos el método ImageDraw.text para insertar el texto en la imagen.

Texto centrado en la imagen

Para centrar el texto debemos hacer una serie de calculos con los anchos y largos del lienzo y del elemento de texto que queramos centrar. A continuación os dejo un ejemplo con el texto del ejemplo anterior centrado:

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw

size = (800, 400)
image_text = "Conectabell"
img = Image.new('RGB', (800, 400), "blue")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("/ruta/LiberationSerif-Bold.ttf", 36)
w, h = draw.textsize(image_text, font)
draw.text(((size[0]-w)/2, (size[1]-h)/2), image_text, (0, 2, 27), font=font)
img.save('image.png')

Esto nos dará como resultado la siguiente captura:

En este caso debemos hacer los cálculos tanto para la altura como para la anchura, dependiendo de donde lo hagamos centraremos el eje X, el eje Y o ambos. En el ejemplo anterior centro ambos ejes, y para ello debemos dividir entre dos la resta del ancho del lienzo y la del ancho del texto para centrarlo horizontalmente, para centrarlo verticalmente es la misma operación pero con la altura de los elementos. Para extraer el ancho del texto usaremos la función de la clase Draw llamado textsize, a este método debemos pasarle como argumento el texto de la imagen y la fuente que estemos usando, si no se le adjunta la fuente no hará los cálculos correctamente.

Insertando una imagen

from PIL import Image

size = (800, 400)
image_text = "Conectabell"
img = Image.new('RGB', (800, 400), "blue")
im_logo = Image.open('./img/logo.gif')
img.paste(im_logo,(100, 100))
img.save('image.png')

En este caso pegar una imagen es bastante sencillo, tan sólo debemos abrri la imagen con el método Image.open pasándole como argumento la ruta de la imagen y acto seguido usar el método Image.paste para pegar la imagen donde queramos, en este caso lo pegamos a 100 píxeles del borde izquierdo y a 100 píxeles del borde superior. A continuación dejo una captura con el resultado.