Redimensionador de Imágenes

El enunciado a continuación nos da las instrucciones necesarias para la programación de un script para la shell de linux que servirá para redimensionar imágenes, ayudándonos de las diversas funcionalidades que nos ofrece el navegador de archivos de GNOME.

Crear un script de Nautilus. Nautilus es el navegador de archivos por defecto de GNOME. Nautilus ofrece la posibilidad de crear scripts que pueden ser llamados desde el menú contextual de Nautilus. Así, todo script (ejecutable) que se coloca en el directorio $HOME/.gnome2/nautilus-scripts, puede ser ejecutado desde el menú contextual (botón derecho del ratón) en el submenú “scripts”. Los scripts de Nautilus reciben una lista con los ficheros seleccionados mediante variables de entorno específicas de Nautilus, pero también como los parámetros estándar de la shell ($*, $?, $1, $2, $..., etc).

Si desde Nautilus se selecciona una imagen, el script de Nautilus (llamado “redimensionar imagen”) deberá primero obtener el tamaño (en píxeles) de la imagen, y a continuación redimensionarla a 800x600 ó 600x800 píxeles dependiendo de si la imagen es apaisada o en formato vertical, respectivamente.

Para procesar imágenes de forma no interactiva (desde un script) es necesario instalar el paquete imagemagick (si no está instalado). Para conocer el tamaño de la imagen, puede usarse el programa identify:

identify -format %w <imagen> #píxeles en horizontal

identify -format %h <imagen> #píxeles en vertical

Para redimensionar la imagen, puede usarse el programa convert, que con la opción -resize <w>x<h> y los argumentos <fichero origen> <fichero destino>, permiten redimensionar una imagen, manteniendo la relación de aspecto de la imagen original.

Se puede obtener más información sobre imagemagick, convert o identify en man imagemagick. Se recomienda usar los valores 800 y 600 en variables para poder alterar de forma sencilla el script para redimensionar a otras resoluciones.

El nombre del fichero de salida debe ser <nombre fichero-<w>x<h>.ext. Por ejemplo, un fichero llamado imagen.jpg de tamaño 1024x1280 tendrá como fichero de salida imagen-600x800.jpg. Para obtener el nombre del fichero (y cortar la extensión) puede usarse el programa cut. Por ejemplo:

echo "hola.jpg" | cut -d . -f 1

 

La solución a las características planteadas sería la siguiente:

#!/bin/bash


#--------------------------------------------------------#
#            REDIMENSIONADOR PARA NAUTILUS               #
#--------------------------------------------------------#


#Variables que definen el tamaño de la imagen resultante.
ancho_num=800
alto_num=600

#Variables auxiliares
aux="--"
cont=0
ruta=""

for i in $@; do
	
	# La siguiente sección de código está comentada ya que en nautilus no se necesita
	# gestionar la ruta de los ficheros (nautilus nos proporcia el nombre del fichero
	# y la variable $PWD contendrá la ruta del directorio desde donde se llamó al script).
	# En caso de ejecutarse el script en modo texto e introduciendo una ruta que no es la 
	# que se maneja en ese momento quitaría los comentarios de este bloque.

	#---------------------------------------------------------------------
	# Obtengo el nombre del fichero resultante antes de modificar tamaño
	#while [ ! -z $aux ]; do
		#cont=`expr $cont "+" 1`
		#aux=`echo "$i" | cut -d / -f $cont`	
	#done
	
	#cont=`expr $cont "-" 1`
	#aux=`echo "$i" | cut -d / -f $cont`
	
	#Las dos siguientes instrucciones son independientes del entorno donde se ejecute el script,
	# por lo tanto no las comento.
	ext=`echo "$i" | cut -d . -f 2`
	aux=`echo "$i" | cut -d . -f 1`
	
	#Obtengo la ruta destino del fichero
	#cont=`expr $cont "-" 1`
	#for j in `seq 1 $cont`; do
		#ruta=${ruta}`echo "$i"|cut -d / -f $j`/
	#done
	#----------------------------------------------------------------------
	
	ancho=`identify -format %w $i`
	alto=`identify -format %h $i`
	
	if [ $ancho -gt $alto ]; then
		aux=`echo ${aux}-${ancho_num}x${alto_num}.${ext}`

		#Si se ejecuta desde la shell
		#origen=`echo "$i"`
		#destino=`echo ${ruta}${aux}`

		#Si se ejecuta desde nautilus
		origen=`echo "$i"`
		destino=`echo "$aux"`
		
		convert -resize "$ancho_num"x"$alto_num" $origen $destino

	else
		aux=`echo ${aux}-${alto_num}x${ancho_num}.${ext}`

		#Si se ejecuta desde la shell
        #origen=`echo "$i"`
        #destino=`echo ${ruta}${aux}`

        #Si se ejecuta desde nautilus
        origen=`echo "$i"`
        destino=`echo "$aux"`

        convert -resize "$alto_num"x"$ancho_num" $origen $destino
	fi
	
	cont=0
	ruta=""
done

exit 0

Para obtener un fichero con el código haga clic aquí.

El enunciado (sin la solución) en formato pdf está aquí.

vidalmb_admin – Jue, 30/03/2006 – 18:41