Script redim

Description

redim a pour but de redimensionner de façon massive des fichiers de type JPEG. La dimension des images à obtenir et la qualité JPEG peut être spécifiée. Les fichiers produits sont datés à la date de la prise de vue, stockée dans les données EXIF de la photographie et déposés dans un répertoire dfférent de celui contenant les originaux.

Téléchargement

Télécharger redim

redim est distribué sous licence libre CeCILL.

Installation

Une fois le fichier téléchargé, vous devez

Ce logiciel nécessite l'utilisation des utilitaire identify et convert, installables sous Ubuntu ou Debian par

sudo aptitude install imagemagick

Aide en ligne

$ redim -h

Usage : redim [-q qualité] [-d dimension] origine destination
        redim -h

Redimensionne les images de type JPEG contenues dans le répertoire origine et
place le résultat dans le répertoire destination. Tout fichier non JPEG est
recopié à l'identique. Si le répertoire de destination est terminé par un slash,
un répertoire du nom du répertoire d'origine y est créé. Le comportement est récursif.

La qualité est la qualité JPEG de redimensionnement. Elle doit être comprise
entre 0 et 100 (valeur par défaut 90).
La dimension est la grande dimension des images à laquelle elles sont
redimensionnées (valeur par défaut 1600). Les images sont uniquement réduites,
les images originales trop petites sont recopiées à l'identique.

Options :
 -h : afficher cette aide

Transcript

#!/bin/bash

# This software is governed by the CeCILL license under French law and
# abiding by the rules of distribution of free software.  You can  use, 
# modify and/ or redistribute the software under the terms of the CeCILL
# license as circulated by CEA, CNRS and INRIA at the following URL
# "http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt".
# 
# Ce logiciel est régi par la licence CeCILL soumise au droit français et
# respectant les principes de diffusion des logiciels libres. Vous pouvez
# utiliser, modifier et/ou redistribuer ce programme sous les conditions
# de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA 
# à l'adresse "http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt".
# 
# Copyright Cyril Ravat, <ravat@free.fr> (2007-2011)
# Website : http://www.cyril-ravat.fr/scripts/redim.php
# Help : redim -h

# Options par défaut
# Qualité d'enregistrement JPEG (entre 0 et 100)
QUALITE=90
# Dimension maximale en pixels
DIMENSION=1600
# Mode récursif
RECUR=

# Options du script
while getopts ":hq:d:" option
do
  case $option in
    "h")
      echo "Usage : $(basename "$0") [-q qualité] [-d dimension] origine destination"
      echo "        $(basename "$0") -h"
      echo 
      echo -e "Redimensionne les images de type JPEG contenues dans le répertoire \033[1morigine\033[0m et"
      echo -e "place le résultat dans le répertoire \033[1mdestination\033[0m. Tout fichier non JPEG est"
      echo "recopié à l'identique. Si le répertoire de destination est terminé par un slash,"
      echo "un répertoire du nom du répertoire d'origine y est créé. Le comportement est récursif."
      echo 
      echo -e "La \033[1mqualité\033[0m est la qualité JPEG de redimensionnement. Elle doit être comprise"
      echo "entre 0 et 100 (valeur par défaut $QUALITE)."
      echo -e "La \033[1mdimension\033[0m est la grande dimension des images à laquelle elles sont"
      echo "redimensionnées (valeur par défaut $DIMENSION). Les images sont uniquement réduites,"
      echo "les images originales trop petites sont recopiées à l'identique."
      echo 
      echo "Options :"
      echo -e " \033[1m-h\033[0m : afficher cette aide"
      echo
      exit 0
    ;;
    "q")   QUALITE=$OPTARG ;;
    "d")   DIMENSION=$OPTARG ;;
    "?|:")   break    ;;
  esac 
done
shift $((OPTIND-1))


# Si moins de deux arguments, affichage de l'aide
if [ $# -lt 2 ] ; then
  echo "Il faut au moins deux arguments. L'option -h permet d'afficher l'aide."
  exit 1
fi

# Vérification de l'utilitaire imagemagick
if [ -z `which identify` ]; then
  echo -e "L'utilitaire \033[1midentify\033[0m n'existe pas."
  echo -e "Il faut installer le paquet \033[1mimagemagick\033[0m."
  exit 1
fi

# Vérification de l'existence des répertoires
[ ! -d "$1" ] && echo "Erreur : $1 n'est pas un répertoire valide." && exit 2
[ ! -d "$2" ] && echo "Erreur : $2 n'est pas un répertoire valide." && exit 2

# Copie des arguments et suppression des derniers "/" éventuels
ORIGINE="${1%/}"
[ ${2:(-1)} != "/" ] && DESTINATION="$2" || DESTINATION="$2${ORIGINE##*/}"
# Création du répertoire de destination si besoin (si erreur lors de la
# création, sortie avec erreur)
[ -d "$DESTINATION" ] || mkdir -p "$DESTINATION" || exit 3

for i in "$ORIGINE"/*; do
  j="$DESTINATION/$(basename "$i")"
  
  # Traitement des répertoires
  if [ -d "$i" ]; then
    [ -d "$j" ] || mkdir -p "$j"
    echo "Répertoire $i"
    $0 -q $QUALITE -d $DIMENSION "$i" "$j"
    continue
  fi

  # Traitement des images
  EXT=`echo "${j##*.}" | tr [:upper:] [:lower:]`
  if [ "$EXT" = "jpg" ] || [ "$EXT" = "jpeg" ]; then
    # On vérifie les dimensions
    infos=(`identify -format "%m %w %h" "$i"`)
    if [ "${infos[1]}" -le "$DIMENSION" ] && [ "${infos[2]}" -le "$DIMENSION" ]; then
      echo "Image $i : trop petite pour être redimensionnée, copie à l'identique"
      cp -p "$i" "$j"
    else
      echo "$i -> $j"
      convert -resize "$DIMENSION"x"$DIMENSION" -quality "$QUALITE" "$i" "$j"
    fi
    # On utilise les données EXIF pour remettre le fichier à l'heure.
    # ATTENTION : ne fonctionne pas avec la version 6.3.7 d'Imagemagick
    TIME=`identify -format "%[EXIF:DateTimeOriginal]" "$j" 2>/dev/null`
    [ -z "$TIME" ] && TIME=`identify -format "%[EXIF:DateTime]" "$j" 2>/dev/null`
    # Work around pour la version 6.3.7 d'Imagemagick (jusqu'à Ubuntu Intrepid par exemple)
    [ -z "$TIME" ] && TIME=`identify -format "%[exif:*]" "$j" 2>/dev/null | sed -n "/DateTimeOriginal=/s/exif:DateTimeOriginal=//p"`
    [ -z "$TIME" ] && TIME=`identify -format "%[exif:*]" "$j" 2>/dev/null | sed -n "/DateTime=/s/exif:DateTime=//p"`
    [ -n "$TIME" ] && TIME=`echo "${TIME:0:16}.${TIME:17}" | tr -d ': '` && touch -m -t "$TIME" "$j" 2>&1

  # Traitement des autres types de fichiers
  else
    echo "Fichier $i : type non reconnu, copie à l'identique"
    cp -p "$i" "$j"
	  touch -m -r "$j" "$i"
  fi

done