Saltar al contenido principal

Filler Infuse en acción: transforma tus imágenes al instante

· 8 min de lectura
Oscar Adrian Ortiz Bustos

Introducción

Muchas veces nos encontramos con la necesidad o simplemente la curiosidad de rellenar una imagen con un color determinado, ya sea para crear un fondo o para rellenar un espacio vacío. Si bien podemos utilizar herramientas como GIMP o Photoshop, en lo personal me parece que son demasiado pesadas para una tarea tan sencilla. También hay herramientas online que nos permiten hacerlo, pero no siempre tenemos conexión a internet o simplemente no queremos subir nuestras imágenes a un sitio desconocido.

Por eso me decidí a crear una herramienta que me permita hacerlo de forma rápida y sencilla, y como no, desde la terminal. Así nació Filler-Infuse

¿Qué es Filler-Infuse?

Es la solución a uno de los problemas a los que se puede llegar a enfrentar cualquier desarrollador, diseñador o simplemente alguien que esté curioseando con imágenes. Filler-Infuse es una aplicación de terminal que nos permite rellenar una imagen con un color determinado, ya sea un color sólido o una imagen.

¿Cómo funciona?

El script toma el canal alfa de la imagen que le pasen como primer argumento y el color en hexadecimal o una imagen en segundo argumento y rellena el fondo de la imagen con ese color o imagen. Si el segundo argumento es una imagen JPG u otro formato, la convierte a PNG para poder trabajar con el canal alfa, la escala al tamaño de la imagen de entrada antes de usarla como fondo.

¿Que hay por detrás?

Filler-Infuse está escrito en Python y utiliza la librería Pillow para trabajar con las imágenes. El script está dividido en dos partes: la primera es la que se encarga de leer los argumentos y validarlos, y la segunda es la que se encarga de hacer la magia. En la segunda parte se hace uso de la librería Pillow para abrir las imágenes, convertirlas a RGBA si es necesario, escalarlas y pegarlas en la imagen de entrada.

Un ejemplo de una función que hace esto es la siguiente:

def fill_image_with_color(image_path, background_color_hex):
try:
# Abrir la imagen
image = Image.open(image_path)

# Verificar si el color hexadecimal es válido
if re.match(r'^(?:#)?(?:[0-9a-fA-F]{3}){1,2}$', background_color_hex):
# Eliminar "#" si está presente en el código de color
background_color_hex = background_color_hex.lstrip("#")
# Convertir el color hexadecimal a una tupla RGB
background_color_rgb = tuple(int(background_color_hex[i:i+2], 16) for i in (0, 2, 4))

# Verificar si la imagen tiene un canal alfa adecuado
if image.mode not in ('RGBA', 'LA') and (image.mode != 'P' or 'transparency' not in image.info):
print('La imagen no tiene canal alfa. Asegúrate de que la imagen es PNG con transparencia.')
sys.exit()

# Obtener el canal alfa de la imagen
alpha_channel = image.split()[-1]

# Crear una nueva imagen rellenada con el color y la imagen original
filled_image = Image.new('RGB', image.size, background_color_rgb)
filled_image.paste(image, mask=alpha_channel)

result_path = "resultado.png"
filled_image.save(result_path)
print("Imagen rellenada con el color", background_color_hex, "y guardada con éxito en", result_path)
else:
print("El segundo argumento no es un color hexadecimal válido.")
except Exception as e:
print(f"Error: {e}")

Como podemos ver en el código anterior se están usando expresiones regulares para validar el color hexadecimal, se está convirtiendo el color hexadecimal a una tupla RGB, se está verificando que la imagen tenga un canal alfa adecuado y se está obteniendo el canal alfa de la imagen. Luego se crea una nueva imagen rellenada con el color y la imagen original y se guarda en un archivo llamado resultado.png.

Expresiones regulares

El mundo de las expresiones regulares es muy amplio y complejo, en este caso estamos la siguiente expresión regular para validar el color hexadecimal:

re.match(r'^(?:#)?(?:[0-9a-fA-F]{3}){1,2}$', background_color_hex)

Y aunque se ve complejo, es bastante sencillo de entender y más si también haz utilizado la herramienta de terminal sed. A continuación explicaré que es lo que hace cada parte de la expresión regular:

  • re.match: Es la función de la librería re que se encarga de verificar si la cadena de texto que le pasemos como primer argumento coincide con la expresión regular que le pasemos como segundo argumento. En este caso verifica si el color hexadecimal proporcionado es válido.
  • ^: Es un ancla que indica que la expresión regular debe coincidir con el inicio de la cadena de texto.
  • (?:#)?: Es un grupo de captura que indica que la cadena de texto puede empezar con un # o no.
  • (?:[0-9a-fA-F]{3}){1,2}: Aquí estamos usando otro grupo no capturador (?: ... ) para especificar un patrón repetitivo. [0-9a-fA-F] es una clase de caracteres que coincide con un solo dígito hexadecimal. {3} indica que debe de haber exactamente 3 de estos caracteres seguidos (para representar un color hexadecimal de 3 dígitos). {1,2} indica que este grupo debe de aparecer entre 1 y 2 veces (para representar un color hexadecimal de 6 dígitos).
  • $: Es un ancla que indica que la expresión regular debe coincidir con el final de la cadena de texto.

Convirtiendo la expresión regular a un lenguaje más humano quedaría de la siguiente manera:

Quiero que verifiques si la variable background_color_hex contiene una cadena que cumple con el siguiente patrón: al principio puede haber un signo de numeral # opcionalmente, seguido de una o dos repeticiones de grupos de tres caracteres que pueden ser letras minúsculas o mayúsculas de la a a la f y números del 0 al 9.

Simple, ¿no? 😄. Si quieres curiosear más en el código, puedes hacerlo aquí

Instalación

Únicamente necesitas tener instalado Python 3 y la librería Pillow. Para instalar Pillow puedes usar el siguiente comando:

pip install Pillow

Y debes clonar el repositorio de GitHub:

git clone https://github.com/4DRIAN0RTIZ/Filler-Infuse.git
Advertencia

Para poder ejecutar el script es necesario contar con los permisos de ejecución del archivo. Si no tienes los permisos, puedes dárselos con el siguiente comando:

sudo chmod +x filler-infuse.py

¿Cómo usarlo?

Una vez que tengas instalado Python 3 y la librería Pillow y hayas clonado el repositorio, puedes usar el script de la siguiente manera:

python3 Filler-Infuse.py <imagen> <color_hexadecimal_o_imagen>

Ejemplos

Como ejemplo voy a la foto de Edge corriendo en un fondo previamente creado con CSS. Para ello, primero voy a descargar la imagen y la voy a guardar en la carpeta del script con el nombre foto_fondo_transparente.png. (Es necesario que la foto tenga un fondo transparente). Si vemos la imagen en la terminal, actualmente se ve así:

Running Edge

Como vemos la imagen tiene un fondo transparente, pero queremos que tenga un fondo de color rojo, para ello vamos a usar el script de la siguiente manera:

python3 Filler-Infuse.py foto_fondo_transparente.png ff0000

El resultado es el siguiente:

Edge con fondo rojo

Vamos a crear la foto de autor que voy a dejar en el blog de mi página web. Para ello voy a usar el script de la siguiente manera:

python3 Filler-Infuse.py foto_fondo_transparente.png background.png

El resultado es el siguiente:

Edge con imagen de fondo

Próximas actualizaciones

Como ya es de costumbre mencionar en mis artículos, siempre estoy buscando mejorar mis proyectos y en este caso no es la excepción. En un futuro pienso agregarle más funcionalidades al script, como por ejemplo:

  • Agregar la posibilidad de rellenar la imagen con un degradado de dos colores.
  • Permitir que el script pueda recibir una lista de imágenes y rellenarlas con un color o imagen.
  • Permitir escoger el tamaño de la imagen resultante.
  • Hacer uso de la API de Remove.bg para poder eliminar el fondo de una imagen y rellenarla con un color o imagen.
  • Permitir ajustar la opacidad del color o imagen con la que se va a rellenar la imagen.
  • Agregar un catálogo de fondos predefinidos para poder rellenar la imagen.

¿Te gustaría contribuir?

Toda ayuda es bienvenida, si quieres contribuir con el proyecto puedes hacer un pull request en el repositorio de GitHub.

Conclusión

Filler-Infuse emerge como una solución ágil y versátil para un problema común en el mundo de la edición de imágenes. Al brindar una manera eficiente de rellenar imágenes con colores o texturas específicas, este script demuestra su utilidad tanto para desarrolladores como para diseñadores y entusiastas curiosos. Su implementación en la terminal, respaldada por la poderosa librería Pillow, ofrece una experiencia de usuario simple y efectiva. Al abordar la necesidad de relleno de imágenes de manera rápida y sin complicaciones, Filler-Infuse se posiciona como una herramienta valiosa en el kit de recursos para manipulación de imágenes, y su potencial se ve ampliado aún más con futuras actualizaciones y la posibilidad de contribuciones de la comunidad.