Recortar imagénes en masa

ImageMagic

Recientemente un amigo me dijo:

Tengo que eliminar la marca de agua de cientos de imágenes, pudiera hacerlo con un pograma como GIMP pero es que son cientos de imágenes, sé que se puede automatizar este proceso usando algunos comandos de la suite ImageMagick; necesito que me ayudes a hacer el script en bash.

Le dije:

Tranquilo eso es pan comío.

Así que aqui les va el procedimiento

Nota: El siguiente procedimiento ha sido ejecutado en Fedora 22 pero debe funcionar en cualquier distribución GNU/Linux

1. Instalar la suite ImageMagick

$ sudo dnf -y install ImageMagick

2. Eliminar marca de agua

Partamos de que tenemos una imagén como esta:

Baker_Supercat

Y queremos eliminarle la marca de agua (listón negro). Para ello primero obtenemos información de la imagén usando el comando identify

$ identify Baker_Supercat.jpg
> Baker_Supercat.jpg JPEG 1024x702 1024x702+0+0 8-bit sRGB 560KB 0.010u 0:00.000

El comando anterior muestra que la imagen tiene un tamaño de 1024 pixels de ancho por 702 pixels de alto como el listón negro que queremos eliminar tiene 20 pixels de alto aproximadamente entonces ejecutaríamos el comando convert de la siguiente manera. Para usar

$ convert Baker_Supercat.jpg -crop 1024x682+0+0 cropped_Baker_Supercat.jpg 

La imagén quedaría así:

cropped_Baker_Supercat

El +0+0 significa esquina superior izquierda de la imagen si quisieramos recortar 100 pixels de la parte superior de la imagen entonces ejecutaríamos el comando convert de la siguiente manera

$ convert Baker_Supercat.jpg -crop 1024x582+0+100 cropped_Baker_Supercat1.jpg 

La imagén quedaría así:

cropped_Baker_Supercat1

3. Script para automatizar el proceso

En el paso 2 vimos como recortar una imagen pero lo que mi amigo quería es hacerlo en masa así que aquí está el script. El script encuentra todos los ficheros jpg, jpeg, png, gif y tiff en el DIR actual, calcula el nuevo tamaño de la imagen y la recorta. El script pregunta si quiere mantener el fichero original o sobreescribirlo. Para usar el script descarguelo dele permisos de ejecución y copielo en /usr/local/bin luego ejecutelo en el DIR donde se encuentra las imágenes que desea recortar.

#!/usr/bin/env bash
# GNU shell script to image mass cropping
# --------------------------------------------------------------------------
# Copyleft (Ɔ) Yoander Valdés(sedlav) Rodríguez 
# This script is released under GNU GPL 2+ licence   
# --------------------------------------------------------------------------
# Use:
#
# This script find all images under current DIR, calculate new size and crop
# every image. This script asks if you want to keep original file or 
# override it. Download the script give it exec perms and put it on  
# /usr/local/bin.
# --------------------------------------------------------------------------
#
# Verify if ImageMagick suite is installed
# 
( ! which identify convert &>/dev/null ) && { echo You must install ImageMagick suite; exit 1; }
#
# Ask for original file keeping
#
read -p "Do you want to keep original file [y|n]:" answer
#
# Pattern for jpg, jpeg, png, gif, tiff files
#
PATTERN='.*\.(jpe?g|png|gif|tiff)$'
#
# Find and read every file that match above pattern in current DIR
#
find $(pwd) -regextype posix-egrep -iregex $PATTERN -type f -print0 | while read -d $'' file; do 
    # Get the image new size
    size=$(identify "$file" | awk '{ print $3 }' | awk -Fx -v to_crop=20 '{ print $1"x"$2-to_crop}')
    # New file name
    cropped_name=$(dirname $file)/cropped_$(basename "$file")
    # Crop the image
    convert "$file" -crop $size+0+0 "$cropped_name"
    # Rename to original name
    [[ $answer =~ ^[0Nn]$ ]] && [[ -e "$cropped_name" ]] && mv -f "$cropped_name" "$file"
done

Puede mejorar o modificar el script anterior en: Github




Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *