Encuadrando imágenes con PIL

(Continuación de Agregando texto a imágenes con PIL.)

Otra tarea que puede realizarse fácilmente con PIL es cambiarle el tamaño a imágenes agregando un fondo de color. Utilizando la componente alfa puede lograrse incluso agregar segmentos transparentes.

Una función que hice con este objetivo es:

import Image

def resize_with_background(im, src_rect, offset,
                           dest_size, bg_color):
    src_im_sec = im.crop(src_rect)
    new_im = Image.new('RGBA', dest_size, bg_color)
    new_im.paste(src_im_sec, (src_rect[0] + offset[0],
                              src_rect[1] + offset[1]))
    return new_im

Lo único que hace esta función es tomar la región delimitada por src_rect en la imagen original im, crear una nueva imagen de dimensiones dest_size rellena con el color bg_color (expresado como una tupla con sus componentes RGBA) y, por último, pegar la región tomada en la nueva imagen desplazándola por offset.

Como ejemplo, si tomamos como entrada a la imagen obtenida como salida en el post anterior

Esta imagen, correspondiendo a 'banner_start.png' en el ejemplo, consiste es un banner de tamaño 500 x 150.

Esta imagen, correspondiendo a 'banner_start.png' en el ejemplo, consiste es un banner de tamaño 500 x 150.

y deseamos recortarle 50 píxeles a la derecha, agregarle un rectángulo de 100 x 150 píxeles verdes a la derecha y agregarle una franja de 50 píxeles transparentes abajo, podemos hacerlo con solo dos llamadas a la función descrita anteriormente:

im = Image.open('banner_start.png')
im = resize_with_background(im, (0, 0, 450, 150),
                            (0, 0), (550, 150),
                            (0, 255, 0, 255))
im = resize_with_background(im, (0, 0, 550, 150),
                            (0, 0), (550, 200),
                            (0, 0, 0, 0))
im.save('banner_end.png')

La primera llamada se encargará de recortar a la imagen agregando el cuadrado verde y la segunda de incorporar la franja transparente. El resultado final será el dado por esta imagen:

Esta imagen corresponde a 'banner_end.png' en el ejemplo y muestra la incorporación del rectángulo verde y la franja transparente, dejando una imagen de 550 x 200.

Esta imagen corresponde a 'banner_end.png' en el ejemplo y muestra la incorporación del rectángulo verde y la franja transparente, dejando una imagen de 550 x 200.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s