Agregar texto a imágenes masivamente

[Bash] [Automatización] [Imagemagick]

En el post anterior planteé un problema que me surgió hace poco. En resumen, tenía que agregar texto a varias imágenes y me tocó hacerlo a mano archivo por archivo debido a la urgencia. También mencioné que sería más fácil y rápido automatizar la tarea para hacerlo desde terminal y expliqué a detalle un script que hice para tener todo más claro a la hora de automatizar las cosas. Ahora voy a hablar sobre el segundo script, este ya puede generar los archivos de forma masiva.

Tarjetas personalizadas

Continué con la misma idea, Zuckerberg fue con sus amigos y les mostró su tarjeta personalizada, así que ahora tenemos una turba iracunda solicitando lo mismo, en consecuencia un archivo enorme de nombres a los que les tenemos que hacer su propia tarjeta.

Brin, Serguéi
Berners-Lee, Tim
Torvalds, Linus
Ellison, Larry
Ballmer, Steve
Page, Larry
Ozzie, Ray
Starman, Ricardo
Bezos, Jeff
Dalzell, Rick
Musk, Elon
Wozniak, Steve
Gates, Bill
...

Después modifiqué un poco el formato para que tuviera el ID. Este podría tomarse como referencia del número de línea, pero si queremos buscar directamente a quién refiere cada número es más rápido ponerlo explícito.

01|Brin, Serguéi
02|Berners-Lee, Tim
03|Torvalds, Linus
04|Ellison, Larry
05|Ballmer, Steve
06|Page, Larry
07|Ozzie, Ray
08|Starman, Ricardo
09|Bezos, Jeff
10|Dalzell, Rick
11|Musk, Elon
12|Wozniak, Steve
13|Gates, Bill

Lo siguiente fue crear el script que iba a hacer todo el trabajo, no voy a comentar todo ya que realmente es muy sencillo, lo único que hace es un bucle por cada línea en el archivo que contiene los nombres. Muestro el código y en seguida explico un poco como funciona.

#!/bin/bash

file=$1

filebase="CreditCard.png"
ext=`echo $filebase | cut -d'.' -f2`

while IFS='' read -r line || [[ -n "$line" ]]
	do
		id=`echo $line | cut -d'|' -f1`
		lname=`echo $line | cut -d'|' -f2 | cut -d',' -f1`
		fname=`echo $line | cut -d'|' -f2 | cut -d',' -f2`
		name="$fname $lname"
		
		if [ "$id" ]
		then
			txTo $id $filebase "$name" Ubuntu 55 FFFFFF East 20 -35
			txTo $id $id.$ext "Client ID: #$id" Ubuntu 30 FFFFFF SouthEast 15 30
			echo	"Se creó [$id.$ext]"
		fi
	done	<	$file

El funcionamiento es bastante sencillo, simplemente se ejecuta en terminal script.sh nombres.txt tomando en cuenta que en la misma carpeta se localizan la imagen original de la tarjeta, el archivo con los nombres y el script.

Tarjetas generadas

En el script los puntos importantes serían:

  • filebase

    Este es el archivo de imagen fuente, en este ejemplo la tarjeta de crédito.

  • while IFS='' read -r line || [[ -n "$line" ]]

    Genera el bucle que “lee” el archivo nombres.txt línea por línea para ejecutar lo que contiene el do cada vez.

  • id

    Extrae el id de cada línea.

  • fname y lname

    Extraen tanto el nombre como el apellido, los puse “al revés” a propósito en el ejemplo de la lista para mostrar como acomodarlos con la variable name.

  • if [ "$id" ]

    Esta es una condicional para omitir una línea si esta no tiene id, lo que puede pasar si existieran líneas vacías en el archivo.

  • txTo...

    Estas son las dos líneas más importantes, ya que son las que hacen todo el trabajo utilizando el script que hice en el post anterior.

    Aquí se modificarían todos los parámetros para que se escriba el texto dentro de la imagen como fuente, color, posición, etc.

    También es importante notar que la segunda línea ya no utiliza $filebase como parámetro, en su lugar $id.$ext de no ser así sobrescribiría el archivo que ya tiene el primer texto con una imagen nueva que sólo tendría el ID. Con esto podemos agregar las líneas de texto que queramos con los parámetros diferentes sin limitarnos a que tenga siempre un mismo tamaño, tipo de fuente, color, etc.

Con esto tenemos en segundos un montón de archivos de imágenes de tarjetas de crédito personalizadas. No es algo verdaderamente complejo, pero puede ahorrar mucho tiempo de trabajo. Espero les sirva y nos leemos pronto.

 
comments powered by Disqus