Bueno, ahí va mi última versión del script megaperls:
Código:
#!/bin/sh
#Para el debug del script poner a true para ver valores usados
debug=false
#Programas necesarios para ejecutar las distintas opciones
pathZenity=`which zenity`
pathDcraw=`which dcraw`
pathConvert=`which convert`
pathPnmtojpeg=`which pnmtojpeg`
pathExiftool=`which exiftool`
pathGphoto2=`which gphoto2`
pathUfrawBatch=`which ufraw-batch`
#Ruta donde guardar los jpegs
DESTINO=.
#Número de archivos a procesar
total=$#
#El tamaño de la ventana del dialogo principal de opciones
widthDialog=640
heightDialog=300
#Se comprueba si existen los programas básicos para este script, sino se cancela la ejecución
if [ ! -x "$pathZenity" ]; then
echo "Error, no existe el programa 'zenity'"
exit 1
fi
if [ ! -x "$pathDcraw" ]; then
zenity --error --text "Error, no existe el programa 'dcraw'"
exit 1
fi
if [ ! -x "$pathConvert" ]; then
zenity --error --text "Error, no existe el programa 'convert'"
exit 1
fi
if [ ! -x "$pathPnmtojpeg" ]; then
zenity --error --text "Error, no existe el programa 'pnmtojpeg'"
exit 1
fi
if [ ! -x "$pathUfrawBatch" ]; then
zenity --error --text "Error, no existe el programa 'ufraw-batch'"
exit 1
fi
#Si no existe el programa exiftool se notifica, pero se sigue el proceso, no se detiene el script
if [ ! -x "$pathExiftool" ]; then
zenity --warning --text "Atención, no existe el programa 'exiftool'. No se podrá añadir datos exif a las fotos resultantes"
fi
#Opción 1: ¿ Bajar las fotos CR2 de la cámara antes ?
#Opción 2: ¿ Reducir tamaño reducido en los JPG resultantes ?
#Opción 3: ¿ Balance de la cámara (sino será automático) ?
#Opción 4: ¿ Aplicar reducción de ruido ?
#Opción 5: ¿ Aplicar máscara de desenfoque (unsharp mask) ?
#Ejecutamos zenity y las opciones marcadas vendrán guardadas en la vble. $opciones
opciones=`"$pathZenity" --width=$widthDialog --height=$heightDialog --list --checklist \
--title="Selección de parámetros para las fotos" \
--text="Elija las opciones que desea aplicar a las fotos." \
--column="Selección" --column="Efecto" --column="Descripción" \
FALSE Gphoto "Bajar las fotos desde la cámara" \
TRUE Size "Reduce el tamaño de las fotos resultantes a la mitad" \
FALSE White "Usa el balance de blancos de la camara." \
TRUE Noise "Aplicar reducción de ruido" \
TRUE Sharp "Aplicar una máscara de desenfoque (enfocar)."`
#Si se pulso el botón cancelar la vble. $? vale 1
if [ $? == 1 ]; then
echo "Se canceló la ejecución."
exit 0
fi
#Valores por defecto de los parámetros (si no se seleccionaron en la tabla)
valorSize="1"
# ATENCION, al trabajar con ufraw
valorWhite=""
valorNoise=""
valorExtNoise=""
sharp=false
valorSharp=""
valorExtSharp=""
if ( echo "$opciones" | grep -i "Gphoto" > /dev/null ) then
#Si no existe el programa gphoto2 se notifica, pero se sigue el proceso, no se detiene el script
if [ ! -x "$pathGphoto2" ]; then
zenity --warning --text "Atención, no existe el programa $pathGphoto2. No podrán bajarse fotos de la cámara"
fi
#Obtener las fotos desde la cámara
gphoto2 --get-all-files
fi
if ( echo "$opciones" | grep -i "Size" > /dev/null ) then
valorSize="2"
fi
if ( echo "$opciones" | grep -i "White" > /dev/null ) then
valorWhite="--wb=camera"
fi
if ( echo "$opciones" | grep -i "Noise" > /dev/null ) then
valorNoise="-noise 0.5"
valorExtNoise="nr."
fi
if ( echo "$opciones" | grep -i "Sharp" > /dev/null ) then
valorSharp="-unsharp 3x1.5+100+0.0"
valorExtSharp="sharp."
fi
if ($debug) then
echo "valorSize es $valorSize"
echo "valorWhite es $valorWhite"
echo "valorNoise es $valorNoise"
echo "sharp es $sharp"
echo "valorSharp es $valorSharp"
fi
# Contador
actual=0;
#Comienzo del bucle que recorrerá todas las imágenes seleccionadas desde el nautilus (via ratón o teclado)
for arg;
do
actual=$(($actual+1))
#Obtenemos un nombre para el fichero jpg resultante en la vble $FILENAME, tendrá subextensiones de reducción
#de ruido ".nr" y de aplicación de enfoque ".sharp" si estas opciones se han activado
FILENAME=`basename "$arg" CR2`"$valorExtNoise""$valorExtSharp"jpg
#Si el fichero destino (con extension jpg) ya existe no se procesa para evitar sobreescribirlo y se informa
#de ello. El script sigue para los otros ficheros seleccionados, no se detiene.
if [ -s "$FILENAME" ]
then
zenity --info --text "Ya existe un fichero llamado $FILENAME. El fichero no se procesará"
else
echo "# Procesando $arg (${actual}/${total})"
# Para crear el archivo .ufraw
ufraw-batch --create-id=only --compression=85 --out-path=${DESTINO} --overwrite --out-type=jpeg --shrink=1 --curve=manual ${valorWhite} --shrink=${valorSize} ${arg} &> /dev/null
# Procesado con ufraw-batch
ufraw-batch --compression=85 --out-path=${DESTINO} --overwrite --out-type=jpeg --curve=manual ${valorWhite} --shrink=${valorSize} --output=- $arg | convert ${valorNoise} ${valorSharp} - ${FILENAME} &> /dev/null
if [ -x "$pathExiftool" ]; then
# Hay que cambiar la orientación en los datos exif del jpg, ya que ufraw-batch lo gira según exif
exiftool -canon -overwrite_original -TagsFromFile "$arg" -Orientation="Horizontal" "$FILENAME" &> /dev/null
fi
fi
done | zenity --progress --auto-close --title="Procesando fotos" --text="..." --pulsate
zenity --info --title Megaperls --text="Todos los archivos procesados :-)"
Veamos qué cambios he hecho sobre el de docepollos:
-Ahora trabaja con ufraw-batch en vez de con dcraw
-La opción de reducir el tamaño de las imagenes reduce a la mitad, que un cuarto se me hacía pequeña para comprobar si queda bien
-La reducción de ruido la hace ahora convert (imagemagick) en vez de dcraw. He puesto un valor de 0.5 que me ha parecido bien.
-Ufraw-batch crea un archivo .ufraw donde guarda los ajustes que utilizó
-Con exiftool modifico la etiqueta exif de horientación, ya que ufraw-batch gira el .CR2 si teníamos el sensor de orientación de la cámara activado.
-La reducción de ruido y el enfoque están activados por defecto.
-La comprobación de que tenemos todos los programas es ahora más flexible, porque los busca en el $PATH en vez de en una ruta predefinida
-Podemos elegir dónde se guardarán los jpegs mediante la variable DESTINO
-ufraw-batch aplica la curva MANUAL que ajustamos en ufraw.
-Y creo que nada más... La parte de gphoto2 no la he tocado porque no lo utilizo.
Futuras mejoras:
-Un GUI como Tux manda hecho en QT o GTK
-Me autoedito: Esto ya está
Mostrar una barra de progreso con zenity, para saber por qué imagen vamos y cuántas quedan. Esto es fácil, yo ya lo he hecho, sólo tengo que encontrarlo.
-¿Crear el marco y poner el título automágicamente? Esto creo que no haría falta en este script, ya que más bien es para procesar muchas imágenes. Mejor sería un script aparte.
-¿Sugerencias?
¿Qué os parece?
Marcadores