Redimensionador Gráfico

Este ejercicio consiste básicamente en ampliar el redimensionador de imágenes en modo texto (que tiene este enunciado y este código) para que se pueda ejecutar en modo gráfico.

Básicamente, debe crearse un interfaz gráfico al script, de forma que mediante un GUI pueda seleccionarse la resolución (con opción de seleccionar múltiples resoluciones) a la que se quiere redimensionar la imagen.

Un programa muy interesante para la creación de interfaces gráficos es zenity.

Por ejemplo:

zenity --list --checklist --column Res --column "Selecciona resoluciones" 640 640x480 800 800x600 1024 1024x768

La instrucción anterior crea un cuadro de diálogo que permite seleccionar una o más opciones de una lista. La respuesta del usuario se puede obtener en la salida estándar de zenity, y en este caso consiste en una lista de opciones (tal y como se describieron en los argumentos), separados por un separador de campo que también se puede especificar como argumento del programa zenity.

El programa de Nautilus debe, por tanto, permitir seleccionar desde Nautilus una serie de ficheros (o uno sólo) y ofrecer un entorno gráfico para redimensionar todos a una o más resoluciones seleccionadas, renombrando los ficheros de resultado de forma apropiada (a la que se hace referencia en el ejercicio nativo).

En zenity se pueden utilizar funcionalidades de mayor o menor complejidad: títulos de ventana, de texto, mayor claridad de la lista, cantidad de opciones disponibles, e incluso algunas características avanzadas, como por ejemplo generar al vuelo un icono en un directorio temporal de la imagen a redimensionar e incluirlo en el propio diálogo de zenity, se pueden considerar opciones de que pregunte fichero por fichero a qué resolución se quiere redimensionar o si debe redimensionar todos a la misma, etc. Se pueden incluso detectar todas las posibles situaciones anómalas de error y generarlas como mensajes por pantalla mediante zenity.

Es posible que en la solución propuesta no se hayan implementado todas estas últimas opciones comentadas, en cualquier caso se deja en manos del lector el hecho de ampliarlas a su gusto.

#!/bin/bash

#-----------------------------------------#
#     Redimensionador en modo gráfico     #
#-----------------------------------------#

#v1.0

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

# Variables auxiliares
aux="--"
ext="--"

# Aquí se guarda la lista de ficheros separados por espacios sobre los que se aplica el script
ficheros=$@

# Función para gestión de errores en el script
function gest_err()
	{
	
	if [ $1 -eq 0 ]; then
		#kdialog --title "Mensaje para el usuario" --msgbox "El programa ha finalizado correctamente."
		zenity --info --title="Mensaje para el usuario" --text="El programa a finalizado correctamente"
	fi

	if [ $1 -eq 1 ]; then
		#kdialog --title "ERROR" --msgbox "Programa finalizado incorrectamente."
		zenity --error --title="ERROR" --text="Programa finalizado incorrectamente"
		exit 1
	fi

	if [ $1 -eq 2 ]; then
		#kdialog --title "ERROR" --msgbox "Programa finalizado incorrectamente por el usuario."
		zenity --error --title="ERROR" --text="Programa finalizado incorrectamente por el usuario"
		exit 1
	fi
	
	}

# Función que convierte la imagen que se le pase por parámetro
# Es llamada enviando como parametros los mismos nombres de fichero que recibe el script por parte del nautilus
function convertir()
	{

	for i in $@; do
		
		ext=`echo "$i" | cut -d . -f 2`
	        aux=`echo "$i" | cut -d . -f 1`

	        ancho=`identify -format %w $i`
	        alto=`identify -format %h $i`
	
	        if [ $ancho -gt $alto ]; then
	                aux=`echo ${aux}-${ancho_num}x${alto_num}.${ext}`
	
                	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}`

	                origen=`echo "$i"`
	                destino=`echo "$aux"`
	
	                convert -resize "$alto_num"x"$ancho_num" $origen $destino
	        fi
	done

	}

# Función que gestiona el tamaño de la imagen
# Recibe la salida que nos proporciona la interfaz gráfica
function gest_tam()
	{
	for i in $@; do

		#ancho_num=`echo "$i" | cut -d '"' -f 2`

		ancho_num=`echo "$i" | cut -d 'x' -f 1`

		if [ $ancho_num -eq 640 ]; then
			alto_num=480
			convertir $ficheros
		fi

		if [ $ancho_num -eq 800 ]; then
			alto_num=600
			convertir $ficheros
		fi

		if [ $ancho_num -eq 1024 ]; then
			alto_num=768
			convertir $ficheros
		fi

	done
	}

# Sección de código en la que se obtiene por parte de la interfaz gráfica (zenity) el tamaño para la imagen que desea
# el usuario; en las líneas posteriores se separan el ancho y le alto.
# Llamo a la función de gestionar el tamaño para que extraiga del comando anterior los tamaños "en limpio"
#gest_tam `kdialog --title "Cuadro de diálogo" --checklist "Elija una resolución:" 640 640x480 , 800 800x600 , 1024 1024x768 ,`

gest_tam `zenity --title="Selector de resoluciones" --text="Seleccione una resolución para redimensionar: " --list --separator=' ' --checklist --column clic --column "Resoluciones disponibles" 640 640x480 800 800x600 1024 1024x768`

gest_err $?

exit 0
	
#!/bin/bash

#-----------------------------------------#
#     Redimensionador en modo gráfico     #
#-----------------------------------------#

#v1.1

# La modificación con respecto a la versión anterior es que en esta se pregunta fichero por fichero el tamaño

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

# Variables auxiliares
aux="--"
ext="--"

# Aquí se guarda el fichero sobre el que se aplica el script
fichero=""

# Función para gestión de errores en el script
function gest_err()
	{
	
	if [ $1 -eq 0 ]; then
		#kdialog --title "Mensaje para el usuario" --msgbox "El programa ha finalizado correctamente."
		zenity --info --title="Mensaje para el usuario" --text="Zenity a finalizado correctamente"
	fi

	if [ $1 -eq 1 ]; then
		#kdialog --title "ERROR" --msgbox "Programa finalizado incorrectamente."
		zenity --error --title="ERROR" --text="Zenity a finalizado incorrectamente"
		exit 1
	fi

	if [ $1 -eq 2 ]; then
		#kdialog --title "ERROR" --msgbox "Programa finalizado incorrectamente por el usuario."
		zenity --error --title="ERROR" --text="Zenity finalizado incorrectamente por el usuario"
		exit 1
	fi
	
	}

# Función que convierte la imagen que se le pase por parámetro
# Es llamada enviando como parametros los mismos nombres de fichero que recibe el script por parte del nautilus
function convertir()
	{

	for i in $@; do
		
		ext=`echo "$i" | cut -d . -f 2`
	        aux=`echo "$i" | cut -d . -f 1`

	        ancho=`identify -format %w $i`
	        alto=`identify -format %h $i`
	
	        if [ $ancho -gt $alto ]; then
	                aux=`echo ${aux}-${ancho_num}x${alto_num}.${ext}`
	
                	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}`

	                origen=`echo "$i"`
	                destino=`echo "$aux"`
	
	                convert -resize "$alto_num"x"$ancho_num" $origen $destino
	        fi
	done

	}

# Función que gestiona el tamaño de la imagen
# Recibe la salida que nos proporciona la interfaz gráfica
function gest_tam()
	{
	for i in $@; do

		#ancho_num=`echo "$i" | cut -d '"' -f 2`

		ancho_num=`echo "$i" | cut -d 'x' -f 1`

		if [ $ancho_num -eq 640 ]; then
			alto_num=480
			convertir $fichero
		fi

		if [ $ancho_num -eq 800 ]; then
			alto_num=600
			convertir $fichero
		fi

		if [ $ancho_num -eq 1024 ]; then
			alto_num=768
			convertir $fichero
		fi

	done
	}

for i in $@; do
	fichero=$i
	gest_tam `zenity --title="Selector de resoluciones" --text="Seleccione una resolución para redimensionar el fichero $i: " --list --separator=' ' --checklist --column clic --column "Resoluciones disponibles" 640 640x480 800 800x600 1024 1024x768`
	gest_err $?
done

exit 0
	

Para obtener un fichero con el código haga clic aquí (v1.0) o aquí (v1.1).

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

vidalmb_admin – Mar, 25/04/2006 – 20:32