Rinominare, Ridimensionare e Inserire Watermark in una serie di foto

Questo script usa i pacchetti imagemagik ed  exif, perciò installare i pacchetti se non presenti nel sistema.
Rimando alla descrizione ad inizio listato del file per le operazioni eseguite dal programma.

Per scaricare direttamente lo script clicca QUI.

Questo invece il listato del file:

#!/bin/bash
 
# Script creato da CyberBonfa
# http://www.cyebrbonfa.it
# 
# ver. 3
#
#
# ver. 3: 07-02-2014
#       - Aggiunta l'opzione "-quality $qualita_jpg" a tutti i comandi. In questo modo
#         ogni comando applica singolarmente il livello di compressione.
#       - Tutte le funzioni LET sono state riscritte in una modalità più compatibile con altre shell.
#       - Aggiunta una funzione "RITAGLIA": può servire per eliminare una certa quantità
#         di bordo non desiderato. Bisogna impostare xpix e ypix, ossia il totale dei pixel
#         nel verso della larghezza e dell'altezza.
#         Ad esempio: se si desidera ritagliare 4 pixel tutto attorno all'immagine, xpix ed ypix
#         dovranno essere impostati a 8.
# 
# ver. 2: 13-01-2014
#         Separata la funzione di compressione, prima integrata nella funzione
#         di inserimento watermark, ora selezionabile separatamente.
#         Utilizza sempre la variabile qualita_jpg.
#
# Prima Release: 11-01-2014
# 
#
# -----------------------------------------------------------------------------
#       DESCRIZIONE
# -----------------------------------------------------------------------------
#
# Ogni fotocamera salva le foto con nomi diversi a seconda del modello.
# Supponiamo ora di copiare all'interno di una stessa directory tutte le foto di uno stesso evento,
# provenienti da fotocamere diverse.
# Aprendo la direcotry con un qualsiasi gestore file, i file vengono normalmente ordinati per nome.
# Il problema che si viene a creare è che le foto, così ordinate, perdono l'ordine cronologico.
# Si potrebbe ovviare utilizzando un qualsiasi programma per archiviare le foto... ma io non li uso! :)
# Perciò ho creato questo script per risolvere il problema, e già che c'ero ho introdotto
# qualche altra aggiunta per cui avevo necessità! :)
#
# Questo script può eseguire le seguenti operazioni:
# 1 - Ritagliare un certo valore di pixel tutto attorno alle foto.
# 2 - Cambiare la risoluzione delle foto
# 3 - Inserire un watermark selezionandone il grado di trasparenza.
#     L'inserimento avviene a foto già ridimensionata!
# 4 - Copmrimere la foto, a scapito della qualità ovviamente
# 5 - Rinominare le foto utilizzando DATA e ORA dei dati EXIF di ciascuna foto
#
# Le suddette operazioni vengono eseguite solo se si assegna "si" alle apposite variabili descritte in seguito.
# E' possibile, inoltre, personalizzare lo script agendo direttamente sulle variabili qui sotto.
# Elabora le foto nel formato JPEG ed estensione del file .jpg (maiuscolo o minuscolo)
# Per quanto riguarda il formato grafico del watermark ho provato solo con dei PNG
# per ovvi motivi di trasparenza, perciò non saprei il risultato utilizzando altri formati, proverò...
#
# Lo script, e l'eventuale watermark, vanno messi nella stessa direcotry delle foto.
# Lo script utilizza il pacchetto imagemagick.
#
#
# ---------------------------------
#   PERSONALIZZAZIONE SCRIPT
# ---------------------------------
# Dimensione a cui ridimensionare la foto
# Sono le dimensioni massime, la foto manterrà comunque le proporzioni!
dimensione_foto="800x600"

# Dimensioni totali del ritaglio in pixel, x e y.
xpix="8"
ypix="8"
 
# Livello % di trasparenza watermark (100 = nessuna trasparenza)
trasparenza_watermark="35"
 
# Posizione watermark nella foto:
# Possibili Posizioni: NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
posizione_watermark="SouthEast"
 
# Nome del file watermark
nome_watermark="watermark.png"
 
# Livello di compressione jpeg (100 = non compresso)
qualita_jpg="100"
 
# ---------------------------------
#   SCELTA OPERAZIONI DA ESEGUIRE
# ---------------------------------
# "si" o "no" (minuscolo) per ritagliare le foto
ritaglia="no"

# "si" o "no" (minuscolo) per ridimensionare le foto
ridimensiona="no"
 
# "si" o "no" (minuscolo) per inserire il watermark in ciascuna foto
inserimento_watermark="no"

# "si" o "no" (minuscolo) per comprimere le foto (usa la variabile qualita_jpg)
comprimi="no"
 
# "si" o "no" (minuscolo) per rinominare le foto usando DATA e ORA dei dati EXIF
rinomina_data="no"
 
 
 
# --------------------------------------------------------------
#                       INIZIO SCRIPT
# --------------------------------------------------------------
 
# Creazione array con il nome dei file della directory corrente con estensione "jpg" e "JPG"
echo ""
declare -a lista # Dichiarazione array "lista"
i=0
for f in *.jpg; do # ricerca nomi file con estensione in minuscolo
    if [ "$f" != "*.jpg" ]; then
      lista[$i]=$(echo $f)
      # echo $i" - "$f
      let i++
    fi
done
for f in *.JPG; do # ricerca nomi file con estensione in MAIUSCOLO
    if [ "$f" != "*.JPG" ]; then
      lista[$i]=$(echo $f)
      # echo $i" - "$f
      let i++
    fi
done
echo ""
totale=${#lista[*]}
echo "Totale foto: "${totale}
echo ""
echo ""
 
# Operazioni sui file
i=0
while [ $i -lt $totale ]; do
  echo "------------------------------------------"
  echo "In corso foto "$[$i+1]"/"${totale} ":" ${lista[$i]}
    echo ""
# ---- RITAGLIA -----
  if [[ $ritaglia == "si"  ]] ; then
    echo -n "Ritaglio..."
    larghezza=$(identify -format %w ${lista[$i]})
    let larghezza=(larghezza-xpix)
    altezza=$(identify -format %h ${lista[$i]})
    let altezza=(altezza-ypix)
    convert -quality $qualita_jpg -gravity Center -crop "$larghezza"x"$altezza"+0+0\! "${lista[$i]}" "${lista[$i]}"
    echo "Fatto!"
    echo ""
  fi
# ---- RIDIMENSIONA -----
  if [[ $ridimensiona == "si"  ]] ; then
    echo -n "Ridimensionamento..."
    convert -quality $qualita_jpg -resize $dimensione_foto "${lista[$i]}" "${lista[$i]}"
    echo "Fatto!"
    echo ""
  fi
# ---- WATERMARK -----
  if [[ $inserimento_watermark == "si"  ]] ; then
    echo -n "Inserimento Watermark..."
    composite -quality $qualita_jpg -dissolve $trasparenza_watermark -gravity $posizione_watermark $nome_watermark "${lista[$i]}" "${lista[$i]}" >> /dev/null
    echo "Fatto!"
    echo ""
  fi
# ---- COMPRIMI -----
  if [[ $comprimi == "si"  ]] ; then
    echo -n "Compressione..."
    convert -quality $qualita_jpg "${lista[$i]}" "${lista[$i]}"
    echo "Fatto!"
    echo ""
  fi
# ---- RINOMINA -----
  if [[ $rinomina_data == "si"  ]] ; then
    #  EXIF -t 0x9003 = 'Data (originale)'
    exif_time=$( exif -t 0x9003 "${lista[$i]}" 2>/dev/null | grep -oP '\d{4}.\d{2}.\d{2} \d{2}.\d{2}.\d{2}' )
    status=$?
    if [ "$status" == "0" ]  # Salta i file senza dati EXIF nel campo DATA
    then
      echo ${lista[$i]}" > "$exif_time
      prefix=$( echo "$exif_time" | sed -e 's/://g' -e 's/ /_/g' )_
      other_prefix="${prefix:0:13}_"
      newname1="${prefix}${lista[$i]}"
      newname2="${other_prefix}${lista[$i]}"
      echo -n "Rinomina file... "
      # echo ${lista[$i]}" > "$newname1 # Esempio nome1
      # echo ${lista[$i]}" > "$newname2 # Esempio nome2
      mv -Tv "${lista[$i]}" "$newname1"
      echo "Fatto!"
    else
      echo ${lista[$i]}" > Nessun dato EXIF... Non Rinominato!"
    fi
    echo ""
    echo ""
  fi
  let i=(i+1)
done
  echo ""
  echo "============"
  echo "...Finito!"
  echo "============"
  echo ""
exit 0