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í.