Joyeux anniversaire / Mariage / Heureux événement. Tout le monde a un beau numérique, et on se retrouve avec quelques centaines de photos de dizaines d'appareil photos, de plus les photos ont été modifiés et les dates des fichiers ne sont plus du tout valable... Vous vous dites, mais comment vais-je faire pour avoir une archive cohérente du tout ? Une solution proposée ici est celle de se baser sur les données exifs de l'appareil. Ces données contiennent entre autre, la date de la prise de la photo. Mais tous les appareils photos auront forcément des dates différentes, il va donc falloir remettre tout le monde à une heure commune à toutes.
Note : Les scripts ne sont valable que pour linux.
commande exif
apt-cache show exif
Description: command-line utility to show EXIF information in JPEG files
Most digital cameras produce EXIF files, which are JPEG files with
extra tags that contain information about the image.
.
'exif' is a small command-line utility to show EXIF information hidden
in JPEG files.
Obtenir la date exif d'une photo
# !/bin/bash
#getExifDateTime.sh : get exif date for a digital camera image with exif data
#Note : grep argument is "Date et heure (origi", digital camera is configured in french
dateTime=`exif $1 | grep "Date et heure (origi"`
dateTime=${dateTime:21:19}
echo "$dateTime"
Trouver une image référente
C'est le plus dur, prennez toutes les photos et trouvez un même événement pris par tous les appareils photos (ou une bonne partie) et décidez d'un appareil qui semble avoir une date la plus proche du "réel". Calculez l'écart entre les différentes photos (qui ont pris le même événement) en secondes. Ainsi si la photo référente date du : 2007:01:11 22:36:24 et la photo d'un autre appareil date du 2007:01:10 21:38:48, il faudra rajouter 1 journée, 1 heure, 2 minutes et 24 secondes. Ce qui donne comme temps à ajouter : 3600*24 + 3600*1 + 60*2 + 24 soit 90144 secondes.
Ajouter le temps aux différentes photos
Chaque appareil a un répertoire qui lui est propre, et on exécute le script suivant avec l'écart de temps calculé ce qui permettera de remettre toutes les photos a des dates approximativement cohérentes.
# !/bin/bash
#addExifDateTime.sh : copy image and add time in seconds to exif tag 0x9003 of all jpeg images of current direcory
if (( $# < 2)); then
echo "Not enough argument"
echo "addExifDateTime targetDir timeToAddInS rootImageName"
exit 1
fi
targetDir=$1
timeToAddInS=$2
rootImageName=$3
regexpToFind="$rootImageName*.jpg"
echo "add $timeToAddInS seconds at all $regexpToFind to $targetDir"
test -d $targetDir || exit 1
for i in `find . -maxdepth 1 -iname "$regexpToFind"`; do
echo $i
dateFormated=`~/linux/script/getExifDateTime.sh $i`
echo "dateFormated original : $dateFormated"
dateFormated=`echo $dateFormated | sed -e "s/\(....\):\(..\):\(..\)/\1\/\2\/\3/g"`
dateS=`date +"%s" -u -d "$dateFormated"`
#echo "date original in seconds : $dateS"
newDateS=$((dateS+$timeToAddInS))
#echo "new date in seconds : $newDateS"
newDateFormated=`date +"%Y:%m:%d %H:%M:%S" -d "1970-01-01 $newDateS sec"`
echo "new date formated : $newDateFormated"
exif $i -t 0x9003 --ifd=EXIF --set-value="$newDateFormated" -o $targetDir/$i
done
On a donc toutes les photos avec une date approximativement la même. Mais il est conseillé de séparer les photos par "lieu", il est possible d'avoir deux photos à la même date mais n'ayant rien avoir ! Faites donc un répertoire par "lieu".
Triller par date
Copier toutes les photos dans un même répertoire et appliquer le script suivant :
# !/bin/bash
#sortPhotoWithExifDate.sh: sort images with exif time and copy them to target dir
if (( $# < 1)); then
echo "Not enough argument"
echo "sortPhotoWithExifDate.sh targetDir"
exit 1
fi
targetDir=$1
test -f dateWithName.txt && rm dateWithName.txt
for i in `find -iname '*.jpg' -maxdepth 1`
do
exifDate=`getExifDateTime.sh $i`
echo "$exifDate $i" >> dateWithName.txt
echo -n "."
done
echo ""
$(sort dateWithName.txt > dateWithNameSorted.txt)
rm dateWithName.txt
a=0
for i in `cat dateWithNameSorted.txt`
do
if [ -f $i ]
then
a=$(( $a + 1 ))
b=$a
c=$a
while [ $c -lt 10000 ]
do
b="0$b"
c=$(( $c*10 ))
done
cp $i "$targetDir/$b.jpg"
echo -n "."
fi
done
echo ""
rm dateWithNameSorted.txt