#1 Le 03/01/2017, à 19:59
- alberto33
Petit amateur de photos, mais exigeant, je ne veux plus galérer.
...QUELQUES SCRIPTS EN COMPLEMENT DES GRAND LOGICIELS...
Bonjours à tous,
Je n'ai pas de grandes ambitions dans la manipulation des photos, juste quelques besoins qui me semblent basiques et légitimes :
- pouvoir documenter les photos (Où, quand, qui sur la photos, qui est l'auteur, quoi, et parfois une anecdote)
- pouvoir agir aussi bien sur des photos numériques, que d'anciennes photos scannéees
- pouvoir faire partager certaines photos avec toute leur doc à des personnes qui n'ont pas les mêmes outils que moi, voire rien du tout.
- garantir une bonne pérenité de mon effort de documentation
- retoucher basiquement certaines photos (orientation, cadrage, lumière)
- garder mon indépendance (non merci les "big brothers" !)
Malheureusement j'ai découvert qu'il n'existe pas de logiciel qui aille jusqu'au bout de ces besoins. Dans un premier temps et après une évaluation des offres, j'ai décidé d'utiliser les logiciels qui s'imposent à l'utilisateur lambda d'Ubuntu au jour d'aujourd'hui : shotwell pour gérer la photothèque et les retouches de photos, nautilus pour manipuler les fichiers, et image viewer. J'ai découvert que les gestionnaires de photos (shotwell ou autres) modifiaient de façon parfois imprévisible, à tort ou à raison, certaines métadonnées (comme la date de prise de vue, l'orientation). Et c'est vraiment rageant quant il faut resaisir ces données, ou les remettre en cohérence (par exemple il y a plusieurs données possibles pour l'orientation). Inclure la date de prise de vue dans le nom étant recommandé par certain pro (et bien justifié), j'ai aussi découvert qu'il n'est pas simple de la restaurer, si c'est nécessaire, à partir du nom du fichier photo car l'outil qui le fait, exiftool (le seul ?), fait feu de tout bois : tout nombre présent dans le nom est transformé en date !
J'ai donc créé quelques scripts qui viennent en complément des grands logiciels de manipulation de photos, et palient aux problèmes que je rencontre. J'ai pu ainsi établir un PROTOCOLE COMPLET DE PRISE EN CHARGE DES PHOTOS. Comme je ne pense pas être le premier à buter sur ces difficultés, je met à disposition cette proposition d'amélioration, même si elle relève beaucoup de l'amateurisme. Enfin elle marche.
Voici en quoi consistent ces scripts qui viennent en complément du gestionnaire de photothèque (shotwell, mais ce n'est pas impératif) et nautilus :
- Ce sont des scripts bash tous disponibles via nautilus (sélection d'un groupe de fichier / clic droit / script / Photo), de sorte qu'on les applique sur le groupe de fichiers
(vous trouverez peut-être que certaine lignes affichées sont "décalées" ; cela provient de l'utilisation de l'éditeur gedit, dont je donne le paramétrage dans chaque script pour obtenir un affichage correct)
- Script n°1 : il produit une édition des métadonnées (exif et autres) sur un fichier .csv (lisible par LibreOffice Calc) ; il contient en particulier les dates de prise de vue et l'orientation des photos. Il sécurise ces données, le temps d'effectuer diverses corrections, additions sur les photos.
#!/bin/bash
#AUTEUR : alberto33 (forum.ubuntu-fr.org)
#NOM : 1.ExifEdition
#VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
#DESCRIPTION : Edition de certaines métadonnées de la photo. En particulier les données Exif DateTimeOriginal et Orientation
# A noter : il peut exister plusieurs paramètres Orientation ; vérifier qu'il sont identiques (IMPERATIF !)
# Le résultat figure dans le fichier EXIF_data.csv
#LOGICIELS REQUIS : imagemagick, exiftool, zenity
# (qualification sous Ubuntu 14.04, imagemagick 6.7.7-10)
#PRE-REQUIS : format jpeg
# (Police de l'éditeur de texte : courrier 10 pitch 12)
#PARAMETRE 1 : liste des noms des images jpeg sélectionnées dans Nautilus
#-----------------------------------------------------------------------------------------------------------------------
# set -nvx # n=>vérif syntaxe v=>affiche cmdes avant éxé x=> affiche résultat de cmdes
# set -x # Mettre en commentaire pour éxécution standard
# exec >./journal.txt 2>&1 # le compte-rendu d'éxécution est dirigé dans journal.txt - Mettre en commentaire
#-----------------------------------------------------------------------------------------------------------------------
#
echo "fichier;%W%H;%W%H%X%Y;width;height;date originale;orientations" > EXIF_data.csv
#
# Commande destinée à une utilisation dans le navigateur de fichiers Nautilus
# Les chemins des fichiers sélectionnés dans Nautilus sont ligne à ligne
IFS=$'\n' # le séparateur interne de champs (IFS) sera limité à LineFeed
#Utile pour analyser NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
for Photo in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
do
EXIFdate=$(identify -format "%[EXIF:DateTimeOriginal]" $Photo) #date de prise de vue
EXIFG=$(identify -format %G $Photo) #G=largeur x hauteur (%W%H%X%Y)
#(l'extraction "%[Exif:ExifImageWidth]" ou %w n'est pas valables sur toutes les photos)
EXIFg=$(identify -format %g $Photo)
EXIFw=$(identify -format "%w" $Photo)
EXIFh=$(identify -format %h $Photo)
EXIFtoutes=$(exiftool -a -n -orientation $Photo) #0, 1 ou 2 champs existent pour l'orientation !
#exiftool : -a toutes les valeurs, et si -n format numérique
EXIFtoutesORIENT=$(echo $EXIFtoutes | tr -d '\n')
echo "$(basename $Photo);$EXIFG;$EXIFg;$EXIFw;$EXIFh;$EXIFdate;$EXIFtoutesORIENT" >> EXIF_data.csv
done
zenity --info --text " FIN \n Résultats dans EXIF_data.csv"
exit
- Script n°2 : il restaure les données date de prise de vue et orientation à partir du fichier produit par le script n°1 (qu'on aura modifié si nécessaire)
#!/bin/bash
#AUTEUR : alberto33 (forum.ubuntu-fr.org)
#NOM : 2.ExifRestauration
#VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
#DESCRIPTION : Restauration de certaines métadonnées de la photo. En particulier les données Exif DateTimeOriginal et
# Orientation. Les données de références sont celles contenues dans le fichier Exif_data.csv généré par
# ExifEdition, et modifiables manuellement.
#LOGICIELS REQUIS : imagemagick, zenity, exiftool
# (qualification sous Ubuntu 14.04, imagemagick 6.7.7-10)
#PRE-REQUIS : format jpeg
# (Police de l'éditeur de texte : courrier 10 pitch 12)
#PARAMETRE 1 : liste des noms des images jpeg sélectionnées dans Nautilus
#-----------------------------------------------------------------------------------------------------------------------
# set -nvx # n=>vérif syntaxe v=>affiche cmdes avant éxé x=> affiche résultat de cmdes
# set -x # Mettre en commentaire pour éxécution standard
# exec >./journal.txt 2>&1 # le compte-rendu d'éxécution est dirigé dans journal.txt - Mettre en commentaire
#-----------------------------------------------------------------------------------------------------------------------
#
Exif_data_chemin=$(echo $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | sed -e 's/ \/home.*//')
ExifRestaur_journal="$(dirname "$Exif_data_chemin")/ExifRestaur_journal"
Exif_data_chemin="$(dirname "$Exif_data_chemin")/EXIF_data.csv"
if [ ! -f "$Exif_data_chemin" ]; then
zenity --info --text "Le fichier $Exif_data_chemin est requis.\n\nIl est généré par le script Nautilus : ExifEdition"
exit 0
fi
#
# Paragraphe destiné à une utilisation dans le navigateur de fichiers Nautilus
# Les chemins des fichiers sélectionnés dans Nautilus sont ligne à ligne
IFS=$'\n' # le séparateur interne de champs (IFS) sera limité à LineFeed
#Utile pour analyser NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
NbRestaur=0
for Photo in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
do
EXIFdate=$(identify -format "%[EXIF:DateTimeOriginal]" $Photo) #date de prise de vue
Exif_champs=$(grep "$(basename $Photo)" "$Exif_data_chemin")
if [ -z "$EXIFdate" ]; then
if [ -z $Exif_champs ]; then
zenity --info --text "La restauration de la date n'est pas possible pour $Photo. \n\n\
Ce fichier n'existe pas dans $Exif_data_chemin ou bien son nom contient des caractères spéciaux (comme [, ]...)"
else
DateOriginale=$(expr match "$Exif_champs" '.*\([0-9]\{4\}:[0-9][0-9]:[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\)')
if [ -z $DateOriginale ]; then
zenity --info --text "La restauration de la date n'est pas possible pour $Photo. \n\n\
Ce fichier existe dans $Exif_data_chemin, mais sans date"
else
exiftool -DateTimeOriginal=$DateOriginale -overwrite_original $Photo 2>>$ExifRestaur_journal
if [ "$?" -ne 0 ]; then
zenity --info --text "$Photo Erreur dans la mise à jour de la date \n
Voir détail dans ExifRestaur_journal. Essayer une mise à jour manuelle avec Shotwell ?"
else
let NbRestaur=NbRestaur+1
fi
fi
fi
fi
#ORIENT=$(identify -format %[orientation] $Photo)
#if [[ $ORIENT = 'Undefined' || $ORIENT = '' ]]; then
# exiftool -Orientation=1 -n -overwrite_original $Photo
#elif [ ! "$ORIENT" = 'TopLeft' ]; then mogrify -auto-orient $Photo ; fi # standardisation de l'orientation
#
ORIENTpos34=''
ORIENTpos70=''
if [ ${Exif_champs:(-35):11} = 'Orientation' ]; then ORIENTpos34=${Exif_champs:(-1):1} ; fi
if [ ${Exif_champs:(-71):11} = 'Orientation' ]; then ORIENTpos70=${Exif_champs:(-37):1} ; fi
#
if [[ $ORIENTpos34 = '' && $ORIENTpos70 = '' ]]; then
exiftool -Orientation=1 -n -a -overwrite_original $Photo
elif [[ $ORIENTpos34 != '' && $ORIENTpos70 = '' ]]; then
exiftool -Orientation=$ORIENTpos34 -n -a -overwrite_original $Photo
elif [[ $ORIENTpos34 = $ORIENTpos70 ]]; then
exiftool -Orientation=$ORIENTpos34 -n -a -overwrite_original $Photo
elif [[ $ORIENTpos34 != $ORIENTpos70 ]]; then
zenity --info --text "Dans le fichier Exif_data.csv, les 2 valeurs pour l'orientation ne sont pas identiques pour $Photo"\
"\n\nLes cas suivants sont aussi admis : aucune valeur, ou une seule valeur"\
"\n\nCommande pour consulter les valeurs : exiftool -a [-n] -orientation photo.jpg"
fi
done
zenity --info --text "Date restaurée pour $NbRestaur photos"
exit
- Script n°3 : il renomme les fichiers en utilisant la date de prise de vue, un compteur alphabétique (3 lettres) et un nom d'auteur. On obtient ainsi un nommage homogène de toutes ses photos, d'où qu'elles viennnent.
#!/bin/bash
#AUTEUR : alberto33 (forum.ubuntu-fr.org)
#NOM : 3.RenommerPhotos
#VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
#DESCRIPTION : Renommer les photos jpeg en AAAA-MM-JJ-hhmmss_abc_auteur.jpg
#+ Le numéro abc est alphabétique (3 lettres) afin de ne pas être interprété comme un élément de date
#+ par d'autres logiciels (par ex exiftool)
#+ Ce compteur doit figurer dans le fichier compteur.txt (derniers 3 caractères de la dernière ligne)
#+ qu'on INITIALISE à aaa (=000) (exemple : ftb=6x26²+20x26+1=4577)
#+ L'auteur est choisi via ce script, puis inséré dans le nom dde fichier ainsi que dans les données Exif
#LOGICIELS REQUIS : imagemagick, zenity, exiftool
# (qualification sous Ubuntu 14.04, imagemagick 6.7.7-10)
#PRE-REQUIS : format jpeg ; la photo doit posséder une donnée date de création (Exif:DateTimeOriginal) non nulle
# (Police de l'éditeur de texte : courrier 10 pitch 12)
#PARAMETRE 1 : liste des noms des images jpeg sélectionnées dans Nautilus
#-----------------------------------------------------------------------------------------------------------------------
# set -nvx # n=>vérif syntaxe v=>affiche cmdes avant éxé x=> affiche résultat de cmdes
# set -x # Mettre en commentaire pour éxécution standard
# exec >./journal.txt 2>&1 # le compte-rendu d'éxécution est dirigé dans journal.txt - Mettre en commentaire
#-----------------------------------------------------------------------------------------------------------------------
#
journal=~/.local/share/renommerphotos/journal.txt
compteur=~/.local/share/renommerphotos/compteur.txt
zenity --info --text "Les photos jpeg sont renommées en AAAA-MM-JJ-hhmmss_abc_auteur.jpg, soit \n\
- la date de création originale (EXIF:DateTimeOriginal) \n\
- un numéro unique composé de 3 lettres \n\
- le nom de l'auteur\n\n\
La numérotation alphabétique (base 26) est mémorisée dans $compteur\n\n\
Le nom de l'auteur est inséré dans les métadonnées Exif du fichier.\n
Pour modifier le nom de l'auteur : le supprimer du nom du fichier pour obtenir AAAA-MM-JJ-hhmmss_abc_.jpg et relancer ce script\n\n
Cas particulier où le nom de fichier n'est pas modifié :\n\
- il est déjà précédé de la date originale,\n\
- la date originale n'existe pas \n\n
Rapport d'éxécution dans $journal"
Auteur=$(zenity --list --title="Choisissez l'auteur du groupe de photos" \
--column "Noms à compléter si nécessaire (modifier le script)" \
prenom1-nom1 prenom2-nom2 \
"Je vais mettre à jour la liste dans le script" )
if [ "$Auteur" = 'Je vais mettre à jour la liste dans le script' ] || [ "$Auteur" = '' ]; then exit ; fi
# Indicateur d'absence de date pour au moins un fichier
DateAbsente=0
# Compteur du nombre de renommages effectués
CptRenom=0
# indicateur de divergence entre l'auteur exif présent dans le fichier et celui choisi dans la liste zenity
DivergenceAuteur=0
# =============================================================================
function Terminer {
if [ "$DateAbsente" = '1' ]; then
zenity --info --text "Certains fichiers ne possèdent pas de date. \n VOIR LISTE dans $journal"
fi
if [ "$CptRenom" -gt 0 ]; then
echo " $(date +%F_%T) Nombre de fichiers renommés : $CptRenom ; Dernier index de numérotation (base 26) : "\
"$CptAlphaP2"$CptAlphaP1"$CptAlphaP0" >> $compteur
fi
if [ "$DivergenceAuteur" = 1 ]; then
zenity --info --text "Certains fichiers possèdaient un auteur différent de celui choisi à l'éxécution.\
\n VOIR LISTE dans $journal"
fi
rm ${compteur}w
zenity --info --text "Nombre de fichiers renommés : $CptRenom" ;
}
function ControlAuteur {
ExifAuteur=$(echo $(exiftool -Author "$Photo") | sed -e 's/^.*: //')
if [[ "$Auteur" != "$ExifAuteur" && "$ExifAuteur" != '' ]]; then
DivergenceAuteur=1
echo "$(date +%F_%T) $Photo Divergence sur l'auteur. Ancien= $ExifAuteur ; nouveau= $Auteur" >> $journal
fi
exiftool -Author="$Auteur" -overwrite_original $Photo 2>> $journal
if [ "$?" -ne 0 ]; then
zenity --info --text "ERREUR dans la mise à jour de l'auteur pour $Photo\n
Voir détail dans $journal"
fi ;
}
function CalculDate {
Date=$(identify -format "%[EXIF:DateTimeOriginal]" $Photo)
if [ "$Date" = '' ]; then
echo "$(date +%F_%T) $Photo ne comporte pas de date (exif:datetimeoriginal)" >> $journal
DateAbsente=1
else
Date=$(echo $Date | sed -e 's/[ T]03:03:03//') #siAAAA:MM:JJ on a généré AAAA:MM:JJ 03:03:03 (convention perso)
Date=$(echo $Date | sed -e 's/:02[ T]02:02:02//') #siAAAA:MM on a généré AAAA:MM:02 02:02:02
Date=$(echo $Date | sed -e 's/:01:01[ T]01:01:01//') #siAAAA on a généré AAAA:01:01 01:01:01
Date=$(echo $Date | sed -e 's/^\([0-9]\{4\}\):\([0-9]\{2\}\)$/\1\-\2/') # remplacement : par - (cas AAAA-MM)
Date=$(echo $Date | sed -e 's/\([0-9]\{4\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)/\1\-\2\-\3/') # cas AAAA-MM-JJ
Date=$(echo $Date | sed -e 's/://g') # suppression des : dans la partie horaire
Date=$(echo $Date | sed -e 's/ /-/')
fi ;
}
function IncrementerChiffre {
TabChiffres=( {a..z} a )
index=0
while [ "$Chiffre" != ${TabChiffres[index]} ]
do
let index=$index+1
done
let index=$index+1
Chiffre=${TabChiffres[index]} ;
}
function IncrementerCA {
if [[ "$CptAlphaP0" = 'z' && "$CptAlphaP1" = 'z' && "$CptAlphaP2" = 'z' ]]; then
zenity --info --text "Le compteur alphabétique (aaa) associé aux dates est saturé (valeur = zzz)\
Le traitement ne peut se poursuivre !!!!!!"
Terminer
exit 1
fi
let CptRenom=CptRenom+1
Chiffre=$CptAlphaP0
IncrementerChiffre
CptAlphaP0=$Chiffre
if [ "$Chiffre" = a ] ; then
Chiffre=$CptAlphaP1
IncrementerChiffre
CptAlphaP1=$Chiffre
if [ "$Chiffre" = a ] ; then
Chiffre=$CptAlphaP2
IncrementerChiffre
CptAlphaP2=$Chiffre
fi
fi ;
}
# =============================================================================
# Initialiser CptAlpha compteur en base 26 (a b c d ...z) (a=0 aaa=000 caa=2x26²)
#+ pour nommer les fichiers (par concaténation avec la date)
#+ Le comptage s'enchaîne d'une éxécution du script à la suivante
tail -1 $compteur > ${compteur}w
if [ ! $? = 0 ]; then
zenity --info --text "Le fichier $compteur est absent. Traitement impossible.\n\nConsulter\
ce script pour plus de détails sur le contenu requis de ce fichier"
exit 1
fi
# exec 0<${compteur}w
read CptAlpha 0<${compteur}w
let pos=${#CptAlpha}-1
CptAlphaP0=${CptAlpha:$pos:1}
let pos=pos-1
CptAlphaP1=${CptAlpha:$pos:1}
let pos=pos-1
CptAlphaP2=${CptAlpha:$pos:1}
IFS=$'\n' # le séparateur interne de champs (IFS) sera limité à LineFeed
#Utile pour analyser NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
for Photo in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
do
cd $(dirname $Photo)
if [[ $(expr match "$Photo" '.*\(...\)') = 'jpg' || $(expr match "$Photo" '.*\(...\)') = 'JPG' \
|| $(expr match "$Photo" '.*\(....\)') = 'jpeg' || $(expr match "$Photo" '.*\(....\)') = 'JPEG' ]]; then
CalculDate
if [ ! "$Date" = '' ] ; then
NomFich=$(basename $Photo)
if [[ "$NomFich" =~ ^[0-9]{4}-[0-1][0-9]-[0-3][0-9]-[0-9]{6}_[a-z]{3}_.*\.jpg$ ]]; then
CptAlphaW=${NomFich:18:3}
if [ ! "$NomFich" = "$Date"_"$CptAlphaW"_"$Auteur".jpg ]; then
mv $Photo ${Date}_${CptAlphaW}_${Auteur}.jpg
Photo=${Date}_${CptAlphaW}_${Auteur}.jpg
let CptRenom=CptRenom+1
fi
else
IncrementerCA
mv $Photo ${Date}_${CptAlphaP2}${CptAlphaP1}${CptAlphaP0}_${Auteur}.jpg
Photo=${Date}_${CptAlphaP2}${CptAlphaP1}${CptAlphaP0}_$Auteur.jpg
fi
ControlAuteur
fi
fi
done
Terminer
exit 0
- Script n°4 : LE PRINCIPAL : il ajoute une légende à chaque photo à partir de la date de prise de vue, et des mots-clés, titre et commentaire introduits via shotwell. Il met éventuellement la date de prise de vue à jour si une date est détectée dans les mots-clés (très pratique pour des photos anciennes dont on n'a qu'une idée partielle (année plus éventuellement mois et jour)).
#!/bin/bash
#AUTEUR : alberto33 (forum.ubuntu-fr.org)
#NOM : 4.LegenderPhotos
#VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
#DESCRIPTION : Ajout d'une légende aux photos
# La légende ajoutée au pied de chaque photo est composée des métadonnées de la
# photo, si elles existent :
# - le titre suivi du commentaire
# - les tags (cadrés à gauche) et la date (cadrée à droite)
# Exception : si un tag est une date (aaaa ou aaaa:mm ou aaaa:mm:jj), la date de prise de vue
# est mise-à-jour (avec une convention de codage, voir plus bas), et ce tag supprimé.
# LA PHOTO D'ORIGINE EST DONC MISE A JOUR !!
#LOGICIELS REQUIS : imagemagick, jhead, zenity, exiftool
# (qualification sous Ubuntu 14.04, imagemagick 6.7.7-10, jhead 2.97)
#PRE-REQUIS : avoir enrichi les fichiers jpeg de titres, commentaires, tags (avec shotwell manager par exemple).
# Attention toute mise-à-jour/ré-écriture par un autre logiciel (par ex GNOME image viewer)
# peut ne pas conserver les titres, commentaires, tags...
# (Police de l'éditeur : courrier 10 pitch 12)
#PARAMETRE 1 : liste des noms des images jpeg sélectionnées dans Nautilus
#-----------------------------------------------------------------------------------------------------------------------
# set -nvx # n=>vérif syntaxe v=>affiche cmdes avant éxé x=> affiche résultat de cmdes
# set -x # Mettre en commentaire pour éxécution standard
# exec >./journal.txt 2>&1 # le compte-rendu d'éxécution est dirigé dans journal.txt - Mettre en commentaire
#-----------------------------------------------------------------------------------------------------------------------
#
# CREATION du répertoire de destination et du rapport métadonnées
A=$(echo $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | sed -e 's@/home/.*/home/@/home/@')
A=$(dirname "$A")
cd "$A" #Ne fonctionne pas si 2 espaces consécutifs dans le chemin (pb de $NAUTILUS_SCRIPT..)
if [ $? != 0 ]; then
zenity --info --text "Le chemin du répertoire comporte 2 ou plus espaces consécutifs. Le traitement n'est pas pssible dans ces conditions"
exit
fi
if [ ! -d Photos_légendées ] ; then mkdir Photos_légendées ; fi
#echo 'nom;titre(IPTC);commentaire(EXIF);date de prise de vue(IPTC);tags(IPTC)' > Photos_légendées/Etat_des_metadonnées.csv
zenity --info --text "Vous pouvez vous placer dans le répertoire Photos_Légendées ci-dessous pour suivre l'avancement"
# Paragraphe destiné à une UTILISATION DANS NAUTILUS
IFS=$'\n' # le séparateur interne de champs (IFS) sera limité à LineFeed
#Utile pour analyser NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
#Les chemins des fichiers sélectionnés dans Nautilus sont listés ligne à ligne
#NAUTILUS_SCRIPT_SELECTED_FILE_PATHS=$1 # pour exec dans un terminal
for Photo in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
function ControlSuffixe {
if [[ $(expr match "$Photo" '.*\(...\)') = 'jpg' || $(expr match "$Photo" '.*\(...\)') = 'JPG' \
|| $(expr match "$Photo" '.*\(....\)') = 'jpeg' || $(expr match "$Photo" '.*\(....\)') = 'JPEG' ]]; then
ERREUR=0
else
ERREUR=1
fi
}
function ControlOrientation {
EXIForientations=$(exiftool -a -n -orientation $Photo)
if [[ $EXIForientations = 'Undefined' || $EXIForientations = '' ]]; then
exiftool -Orientation=1 -n -overwrite_original $Photo
EXIForientations=$(exiftool -a -n -orientation $Photo)
elif [ ${EXIForientations:70:1} = '' ]; then cmd-nulle='0' # à remplacer par la commande nulle
elif [ ! ${EXIForientations:34:1} = ${EXIForientations:70:1} ]; then #L'orientation est donnée par 2 valeurs,
ERREUR=2 # qu'il vaut mieux avoir identiques
fi
}
ControlSuffixe
ControlOrientation
if [ $ERREUR = 0 ]; then #if n° 1
# TRAITEMENT DES DATES EVENTUELLENT PRESENTES DANS LES TAGS
# (utile pour initialiser un DateTimeOriginal dans d'anciennes photos=> avantage pour générer légende, gérer photothèque...)
Tags=$(identify -format "%[IPTC:2:25]" $Photo) #keywords (tags, séparés par des ;)
# La date communiquée via un tag dans une photo ancienne a le format (AAAA ou AAAA:MM ou AAAA:MM:JJ) :
DateNouvelle=$(expr match "$Tags" '.*\(\([0-9]\{4\}\)\(:[0-3][0-9]\)\{,2\}\);.*')
if [ -z "$DateNouvelle" ]; then
DateNouvelle=$(expr match "$Tags" '.*\(\([0-9]\{4\}\)\(:[0-3][0-9]\)\{,2\}\)$')
fi
if [ "$DateNouvelle" != '' ] ; then
Datemotcle=$DateNouvelle
DateNouvelle=$(echo $DateNouvelle | sed -e 's/^\(.\{4\}\)$/\1:01:01 01:01:01/') #siAAAA on génère AAAA:01:01 01:01:01 (convention perso)
DateNouvelle=$(echo $DateNouvelle | sed -e 's/^\(.\{7\}\)$/\1:02 02:02:02/') #siAAAA:MM on génère AAAA:MM:02 02:02:02 (convention perso)
DateNouvelle=$(echo $DateNouvelle | sed -e 's/^\(.\{10\}\)$/\1 03:03:03/') #siAAAA:MM:JJ on génère AAAA:MM:JJ 03:03:03 (convention perso)
# cp $Photo "original_$(basename $Photo)"
# la date est retirée des tags (exif:keywords et xmp-dc:subject) et sa version standardisée attribuée à DateTimeOriginal :
exiftool -DateTimeOriginal=$DateNouvelle -Subject-=$Datemotcle -Keywords-=$Datemotcle -overwrite_original $Photo
Tags=$(identify -format "%[IPTC:2:25]" $Photo)
fi
# EXTRACTION des métadonnées de l'image jpeg
# date de prise de vue
# (formats : aaaa:mm:jj hh:mm:ss ou aaaa-mm-jjThh:mm:ss)
Datedeprisedevue=$(identify -format "%[EXIF:DateTimeOriginal]" $Photo)
Datedeprisedevue=$(echo $Datedeprisedevue | sed -e 's/[ T]03:03:03//') #utile pour dates anciennes
Datedeprisedevue=$(echo $Datedeprisedevue | sed -e 's/[-:]02[ T]02:02:02//')
Datedeprisedevue=$(echo $Datedeprisedevue | sed -e 's/[-:]01[-:]01[ T]01:01:01//')
#et passage au format jj-mm-aaaa
Datedeprisedevue=$(echo $Datedeprisedevue | sed -e 's/^\([0-9]\{4\}\)[-:]\([0-9]\{2\}\)$/\2\-\1/')
Datedeprisedevue=$(echo $Datedeprisedevue | sed -e 's/\([0-9]\{4\}\)[-:]\([0-9]\{2\}\)[-:]\([0-9]\{2\}\)/\3\-\2\-\1/')
ORIENT=${EXIForientations:34:1}
if [[ $ORIENT = 1 || $ORIENT = 3 || $ORIENT = 2 || $ORIENT = 4 ]] ; then #orientation TopLeft ou BottomRight ou miroir
Hauteur=$(identify -format %H $Photo)
Largeur=$(identify -format %W $Photo)
fi
if [[ $ORIENT = 6 || $ORIENT = 8 || $ORIENT = 5 || $ORIENT = 7 ]] ; then #orientation RightTop ou LeftBottom ou miroir
Hauteur=$(identify -format %W $Photo)
Largeur=$(identify -format %H $Photo)
fi
Titre=$(identify -format "%[IPTC:2:105]" $Photo) #titre (répété en 2:120 (légende))
identify -format "%[EXIF:UserComment]" $Photo > w1usercomment #extraction du commentaire
Lcomment=$(expr $(/bin/ls -l w1usercomment | awk '{print $5}')) #extraction de la longueur du fichier commentaire
# au sein de la réponse à ls
ExComment=0 #Indicateurs d'existence
ExTitre=0
ExTags=0
ExDate=0
ExLigne=0
if [ "$Lcomment" -gt 1 ]; then ExComment=1 ; fi
if [ "$Titre" != '' ] ; then ExTitre=1 ; fi
if [ "$Tags" != '' ] ; then ExTags=1 ; fi
if [ "$Datedeprisedevue" != '' ] ; then ExDate=1 ; fi
#echo "$(basename $Photo);$ExTitre;$ExComment;$ExDate;$ExTags" >> Photos_légendées/Etat_des_metadonnées.csv
if [ "$ExComment" = 1 ] || [ "$ExTitre" = 1 ] || [ "$ExTags" = 1 ] || [ "$ExDate" = 1 ] ; then #if n° 2
# CONVERSION DE EXIF:UserComment
# Cette étiquette exif est codée unicode uft-8 (2 octets par carcatère), dont l' extraction par
# identify (commande imagemagick) représente chaque caractères par un espace
# (1er octet uft-8) suivi d'un nombre décimal (2eme octet uft-8) suivi d'une virgule !
# Conversion un peu laborieuse. UNE SOLUTION PLUS ELEGANTE SERAIT BIENVENUE !!
if [ "$ExComment" = 1 ] ; then
IFS=$' \t\n' #Rétablissement de IFS - controle de valeur par : echo $( set | grep ^IFS= )
sed --silent -e 's/,//g ; w w2usercomment' w1usercomment ; #suppression des virgules
sed --silent -e 's/^.\{16\}// ; w w3usercomment' w2usercomment; #suppression des 8 caractères d'en-tete indiquant le mode de codage unicode
printf "%x" $(cat w3usercomment) > w4usercomment; #conversion de décimal à hexadécimal
sed --silent -e 's/../\\x&/g ; w w5usercomment' w4usercomment; #insertion de \x tous les 2 caractères pour signifier l'hexadécimal
Commentaire=$(printf $(cat w5usercomment)); #conversion de héxadécimal à Latin1
fi
# Suppression des tags intermédiaires
# (si hiérarchie des tags, par ex Lieu, Famille, Amis, Evènements...)
if [ "$ExTags" = 1 ] ; then
# Les 6 commandes suivantes sont à supprimer si l'arborescence des tags est simplifiée
Tags=$(echo $Tags';') #la liste des tags est fournie sans séparateur de fin (;)
Tags=$(echo $Tags | sed -e 's/Lieu *\;//') #$(echo ${Tags/Lieu *\;/})
Tags=$(echo $Tags | sed -e 's/Amis *\;//') #$(echo ${Tags/Amis *\;/})
Tags=$(echo $Tags | sed -e 's/Famille *\;//') #$(echo ${Tags/Famille *\;/})
Tags=$(echo $Tags | sed -e 's/Evènements *\;//') #$(echo ${Tags/Evènements *\;/})
Tags=$(echo $Tags | sed -e 's/;$//') #suppression de ; en fin
Tags=$(echo $Tags | sed -e 's/([0-9][0-9]*-[0-9][0-9]-[0-9][0-9][0-9][0-9])//g') #suppression des dates de naissance éventuelles
if [ ! $(expr match "$Tags" '\(^.\)') = '&' ]; then ##les noms sont précédés de & (convention personnelle)
Tags=$(echo $Tags | sed -e 's/;&/ \/ /'); fi # si le 1er car n'est pas &, alors le 1er ;& est remplacé par /
Tags=$(echo $Tags | sed -e 's/;&/ ; /g') # tous les autres ;& sont remplacés par ;
Tags=$(echo $Tags | sed -e 's/^&//') # suppression de & s'il est en tête
if [ ! $(expr match "$Tags" '\(^.\)') = 'à' ]; then ##les lieux sont précédés de à (convention personnelle)
Tags=$(echo $Tags | sed -e 's/;à/ \/ /'); fi
Tags=$(echo $Tags | sed -e 's/;à/ ; /g')
Tags=$(echo $Tags | sed -e 's/^à//')
if [ ! $(expr match "$Tags" '\(^.\)') = '!' ]; then ##les évènements sont précédés de ! (convention personnelle)
Tags=$(echo $Tags | sed -e 's/;!/ \/ /'); fi
Tags=$(echo $Tags | sed -e 's/;!/ ; /g')
Tags=$(echo $Tags | sed -e 's/^!//')
fi
# Création de l'image TAGS + DATE pour le bas de page
function EcrTags {
LargeurTags=`expr $Largeur - $LargeurDate ` #largeur de l'image des tags = largeur de la photo - largeur de la date
convert -fill black -density 150 -font Ubuntu-Italic -pointsize $PointSize -gravity West \
-size "$LargeurTags"x caption:"$Tags" tags.jpg
}
#-------------------------------------------------------------------------------
function EcrDate {
if [ "$ExTags" = 0 ] ; then
LargeurDate=$Largeur
else
LargeurDate=$(expr $PointSize \* 20) #pour une taille 10, la date prendra 200 pixels (en densité 150dpi)
fi
convert -fill black -density 150 -font Ubuntu-Italic -pointsize $PointSize -gravity east \
-size "$LargeurDate"x caption:"$Datedeprisedevue" Datedeprisedevue.jpg
}
#-------------------------------------------------------------------------------
if [ "$ExTags" = 1 ] || [ "$ExDate" = 1 ] ; then
PointSize=$(expr $Hauteur / 160) #pour une hauteur d'image de 1920 pixels, cette ligne sera en taille 12
if [ "$PointSize" -lt 6 ] ; then PointSize=6 ; fi
if [ "$ExTags" = 0 ] ; then
EcrDate
mv Datedeprisedevue.jpg legende-bas.jpg
elif [ "$ExDate" = 0 ] ; then
LargeurDate=0
EcrTags
mv tags.jpg legende-bas.jpg
else
EcrDate
EcrTags
montage -geometry +0+0 -tile 2x tags.jpg Datedeprisedevue.jpg legende-bas.jpg
fi
fi
# Création des lignes <TITRE -- COMMENTAIRE>
function creationlignes {
convert -fill black -density 150 -font Ubuntu-Italic -pointsize $PointSize -gravity center\
-size "$Largeur"x caption:"$Legende" legende-haut.jpg
}
#-------------------------------------------------------------------------------
PointSize=$(expr $Hauteur / 160) #Pour une hauteur d'image de 1920 pixels, cette ligne sera en taille 12 (PointSize)
if [ "$PointSize" -lt 6 ] ; then PointSize=6 ; fi
if [ "$ExTitre" = 0 ] && [ "$ExComment" = 1 ]; then Legende="$Commentaire" ; creationlignes ; fi
if [ "$ExTitre" = 1 ] && [ "$ExComment" = 0 ]; then Legende="$Titre" ; creationlignes ; fi
if [ "$ExTitre" = 1 ] && [ "$ExComment" = 1 ]; then Legende="$Titre -- $Commentaire" ; creationlignes ; fi
# ASSEMBLAGE DES LIGNES AVEC LA PHOTO
IFS=$'\n' #Retour à la valeur de IFS nécessaire pour traiter NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
if [ -f legende-bas.jpg ] && [ -f legende-haut.jpg ]; then
montage -geometry +0+0 -tile x2 legende-haut.jpg legende-bas.jpg legende.jpg
fi
if [ ! -f legende-bas.jpg ] ; then mv legende-haut.jpg legende.jpg ; fi
if [ ! -f legende-haut.jpg ] ; then mv legende-bas.jpg legende.jpg ; fi
if [[ $ORIENT = 1 ]] ; then
montage -geometry +0+0 -tile x2 $Photo legende.jpg Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 2 ]] ; then
mogrify -flop legende.jpg
montage -geometry +0+0 -tile x2 $Photo legende.jpg Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 3 ]] ; then
mogrify -rotate "180" legende.jpg
montage -geometry +0+0 -tile x2 legende.jpg $Photo Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 4 ]] ; then
mogrify -flop -rotate "180" legende.jpg
montage -geometry +0+0 -tile x2 legende.jpg $Photo Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 6 ]] ; then
mogrify -rotate "270" legende.jpg
montage -geometry +0+0 -tile 2x $Photo legende.jpg Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 7 ]] ; then
mogrify -flip -rotate "270" legende.jpg
montage -geometry +0+0 -tile 2x legende.jpg $Photo Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 8 ]] ; then
mogrify -rotate "90" legende.jpg
montage -geometry +0+0 -tile 2x legende.jpg $Photo Photos_légendées/$(basename $Photo)
fi
if [[ $ORIENT = 5 ]] ; then
mogrify -flip -rotate "90" legende.jpg
montage -geometry +0+0 -tile 2x $Photo legende.jpg Photos_légendées/$(basename $Photo)
fi
rm 'w'[1-5]usercomment Datedeprisedevue.jpg legende-haut.jpg legende-bas.jpg legende.jpg tags.jpg
else #if n° 2
cp $Photo Photos_légendées
fi #if n° 2
else #if n° 1
if [ $ERREUR = 1 ]; then
zenity --info --title 'LégenderPhotos' --text "Fichier non traité $Photo (seuls les .jpg .JPG .jpeg ou .JPEG sont admis)"
fi
if [ $ERREUR = 2 ]; then
zenity --info --text "Les 2 valeurs pour l'orientation ne sont pas identiques pour $Photo"\
"\n\nCommande pour contrôler les valeurs : exiftool -a -orientation photo.jpg"
fi
fi #if n° 1
done
cd Photos_légendées
jhead -te "../&i" * # copie des données exif et IPTC en masse
cd ..
zenity --info --title 'LégenderPhotos' --text "Les copies légendées des photos sont dans le répertoire Photos_légendées, "\
"sous le même nom et avec les mêmes metadata que les originaux."
exit 0
- Scripts n°5 et 6 : il peuvent assembler à l'horizontale ou à la verticale un nombre quelconque d'images (pratique pour un recto-verso de carte postale)
#!/bin/bash
# AUTEUR : alberto33 (forum.ubuntu-fr.org)
# NOM : 5.AssemblerHorizontal
# VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
# DESCRIPTION : ASSEMBLAGE HORIZONTAL DE 2 OU PLUS IMAGES
# L'image produite a pour nom celui de la première photo de la liste suffixé par _multi
# L'image produite a pour hauteur celle de la première de la liste
# !!!! Les autres images de la liste sont retaillées, si nécessaire, à la hauteur de la première.
# L'orientation EXIF est recalée sur top-left ; une bordure blanche est ajoutée
# LOGICIELS REQUIS : imagemagick
# (qualification sous Ubuntu 14.04, imagemagick 6.7.7-10)
# PRE-REQUIS : format jpeg
# PARAMETRE 1 : liste des noms des images jpeg sélectionnées dans Nautilus
#-----------------------------------------------------------------------------------------------------------------------
#
# Paragraphe destiné à une utilisation dans le navigateur de fichiers Nautilus
# Les chemins des fichiers sélectionnés dans Nautilus sont ligne à ligne
IFS=$'\n' # le séparateur interne de champs (IFS) sera limité à LineFeed
#Utile pour analyser NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
function Retailler {
if [ ! $HauteurRef = $Hauteur ] ; then
mogrify -resize x"$HauteurRef" $Photo_trav
fi
}
I=1
for Photo in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
do
if [[ $(expr match "$Photo" '.*\(...\)') = 'jpg' || $(expr match "$Photo" '.*\(...\)') = 'JPG' \
|| $(expr match "$Photo" '.*\(....\)') = 'jpeg' || $(expr match "$Photo" '.*\(....\)') = 'JPEG' ]]; then
Photo_trav=${Photo%'.'*}"_trav.jpg"
convert $Photo -bordercolor white -border 5 $Photo_trav #bordure blanche de 5 pixels
if [ $I = 1 ] ; then
LxH=$(identify -format %G $Photo) #G=largeur x hauteur (car l'orientation est tp-left)
HauteurRef=${LxH#[0-9]*x} #suppression du début de chaîne correspondant à [0-9]*x : HauteurRef=H
Photo_multi=${Photo%'.'*}"_multi.jpg"
mv $Photo_trav $Photo_multi
I=2
else
LxH=$(identify -format %G $Photo_trav)
Hauteur=${LxH#[0-9]*x}
Retailler
montage -geometry +0+0 -tile 2x -compress jpeg -quality 50 $Photo_multi $Photo_trav $Photo_multi
rm $Photo_trav
exiftool -Orientation=1 -n -overwrite_original $Photo_multi #recale l'orientation sur top-left
fi
else #if n° 1
zenity --info --title 'AssemblerHorizontal' --text "Arrêt du traitement car un fichier n'est pas suffixé en .jpg .JPG .jpeg ou .JPEG"
exit 1
fi
done
exit 0
# ==============================================================================
# ATTENTION : si l'image résultante a une dimension supérieure à 32768 pixels, elle n'est pas lisible par
# Image Viewer voire Adobe Photoshop. Une réduction est possible par la commande
# convert -resize 32760x img1.jpg img2.jpg (si c'est la largeur qui pose problème)
#!/bin/bash
# AUTEUR : alberto33 (forum.ubuntu-fr.org)
# NOM : 6.AssemblerVertical
# VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
# DESCRIPTION : ASSEMBLAGE VERTICAL DE 2 OU PLUS IMAGES
# L'image produite a pour nom celui de la première photo de la liste suffixé par _multi
# L'image produite a pour largeur celle de la première de la liste
# !!!! Les autres images de la liste sont retaillées, si nécessaire, à la largeur de la première.
# L'orientation EXIF est recalée sur top-left ; une bordure blanche est ajoutée
# LOGICIELS REQUIS : imagemagick
# (qualification sous Ubuntu 14.04, imagemagick 6.7.7-10)
# PRE-REQUIS : format jpeg
# PARAMETRE 1 : liste des noms des images jpeg sélectionnées dans Nautilus
#-----------------------------------------------------------------------------------------------------------------------
#
######### Paragraphe destiné à une utilisation dans le navigateur de fichiers Nautilus
# Les chemins des fichiers sélectionnés dans Nautilus sont ligne à ligne
IFS=$'\n' # le séparateur interne de champs (IFS) sera limité à LineFeed
#Utile pour analyser NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
function Retailler {
if [ ! $LargeurRef = $Largeur ] ; then
mogrify -resize "$LargeurRef"x $Photo_trav
fi
}
I=1
for Photo in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ;
do
if [[ $(expr match "$Photo" '.*\(...\)') = 'jpg' || $(expr match "$Photo" '.*\(...\)') = 'JPG' \
|| $(expr match "$Photo" '.*\(....\)') = 'jpeg' || $(expr match "$Photo" '.*\(....\)') = 'JPEG' ]]; then
Photo_trav=${Photo%'.'*}"_trav.jpg"
convert $Photo -bordercolor white -border 5 $Photo_trav #bordure blanche de 5 pixels
if [ $I = 1 ] ; then
LxH=$(identify -format %G $Photo_trav) #G=largeur x hauteur (car l'orientation est tp-left)
LargeurRef=${LxH%x[0-9]*} #suppression de la fin de chaîne correspondant à x[0-9]* : LargeurRef=L
Photo_multi=${Photo%'.'*}"_multi.jpg"
mv $Photo_trav $Photo_multi
I=2
else
LxH=$(identify -format %G $Photo_trav)
Largeur=${LxH%x[0-9]*}
Retailler
montage -geometry +0+0 -tile x2 -compress jpeg -quality 50 $Photo_multi $Photo_trav $Photo_multi
rm $Photo_trav
exiftool -Orientation=1 -n -overwrite_original $Photo_multi #recale l'orientation sur top-left
fi
else #if n° 1
zenity --info --title 'AssemblerVertical' --text "Arrêt du traitement car un fichier n'est pas suffixé en .jpg .JPG .jpeg ou .JPEG"
exit 1
fi
done
exit 0
# ==============================================================================
# ATTENTION : si l'image résultante a une dimension supérieure à 32768 pixels, elle n'est pas lisible par
# Image Viewer voire Adobe Photoshop. Une réduction est possible par la commande
# convert -resize x32760 img1.jpg img2.jpg (si c'est la hauteur qui pose problème)
A cela s'ajoute une documentation (2 pages) qui détaille les protocoles de base pour gérer les photos actuelles issue d'un appareil numérique ou les photos issues d'un scan, ainsi que la mise en place de ces outils.
Script pour lancer l'ouverture du document :
#!/bin/bash
#AUTEUR : alberto33 (forum.ubuntu-fr.org)
#NOM : 7.Aide
#VERSION : 31/12/2016 : version 0.1 pour scripts Nautilus
#DESCRIPTION : Lancement de la visualisation du fichier d'aide aux utilitaires photo
#LOGICIELS REQUIS : evince (standard sous Ubuntu)
#PRE-REQUIS :
# (Police de l'éditeur de texte : courrier 10 pitch 12)
#PARAMETRE :
cd ~/.local/share/nautilus/scripts/Photo
evince 7.Aide_Photo.pdf
exit
Et le document proprement dit est disponible ici : https://mon-partage.fr/f/OKlNOf3d/ au moins jusqu'à fin 2017 (je ne sais pas le joindre autrement dans ce forum)
Enfin, il y a un lanceur shottwell qui permet de compartimenter le stockage des photos (par exemple une base pour les photos contemporaines, une base pour les photos anciennes). Cette précaution est peut-être superflue...
#!/bin/bash
#AUTEUR : alberto33 (forum.ubuntu-fr.org)
#NOM : LShotwell
#VERSION : 31/12/2016 : version 0.1
#DESCRIPTION : script de lancement du gestionnaire de phothèque Shotwell
# SELECTION DE LA LIBRAIRIE 0 UTILISER
#LOGICIELS REQUIS :
#PRE-REQUIS :
# (Police de l'éditeur de texte : courrier 10 pitch 12)
#PARAMETRE :
#set -x #Mettre en commentaire pour éxécution standard
#exec >./journal.txt 2>&1 #le compte-rendu d'éxécution est dirigé dans journal.txt - Mettre en commentaire
#
LIBRAIRIE=''
function ChoixLibrairie {
LIBRAIRIE=$(zenity --list --text="<b><big><tt><span color=\"blue\"><span font-family=\"webdings\">Choix de la librairie pour Shotwell
</span></span></tt></big></b>" \
--window-icon=/usr/share/icons/hicolor/scalable/apps/shotwell.svg \
--title="Lancement de Shotwell" \
--column="Librairies disponibles" \
"Photos actuelles" \
"Photos anciennes")
}
while [ "$LIBRAIRIE" = '' ]
do
ChoixLibrairie
if [ $? != '0' ]; then exit ; fi
if [ "$LIBRAIRIE" = 'Photos actuelles' ]; then
shotwell -d ~/.local/share/shotwell1
exit
fi
if [ "$LIBRAIRIE" = 'Photos anciennes' ]; then
shotwell -d ~/.local/share/shotwell2
exit
fi
done
exit
Ces scripts utilisent quelques outils tels que exiftool, imagemagick, jhead, et zenity disponibles sur le centre de logiciels Ubuntu.
Je reste disponible pour aider quiconque à s'en servir , pour écouter et discuter des critiques fonctionnelles ou techniques. Enfin j'espère ne pas avoir réinventé l'eau chaude, mais j'avoue que j'aurais largement préféré trouver l'outillage tout prêt pour mon utilisation qui n'a rien d'exotique.
Et en ce début 2017, j'espère ainsi apporter un petit cadeau à quelques autres amateurs !
Michel
Hors ligne
#2 Le 03/01/2017, à 20:59
- nam1962
Re : Petit amateur de photos, mais exigeant, je ne veux plus galérer.
Wahhh ! Bravo !
[ Modéré ]
Hors ligne
#3 Le 09/01/2017, à 10:27
- SESTAY
Re : Petit amateur de photos, mais exigeant, je ne veux plus galérer.
bonjour,
juste une petite astuce (remarque) au sujet du fichier d'aide.
Lors de l'exportation pdf avec libre office, dans la boite de dialogue d'exportation, [Général] cocher la case [incorporer le fichier OpenDocument].
Ainsi le document pdf sera éditable normalement avec writer un peu plus lourd (430 ko au lieu de 385) .
une modeste participation à ffDiaporama Changement d'adresse du site http://tvb2016.pagesperso-orange.fr/ff/co/siteWeb.html.
Actuellement le projet ffDiaporama est en stand by, si des amateurs veulent s'y coller, ils seront les bienvenues.
Hors ligne