-#!/bin/sh
+#!/bin/bash -x
-# This is a helper script that rotate jpeg files using jpegtran
+# This is a helper script that rotate image files according to the metadata
+# requirements: ImageMagick, exiftran, exiv2
-rotation=$1
-shift
+GQ_METADATA_DIR="$HOME/.local/share/geeqie/metadata"
+rotate()
+{
+ ext=`echo "${1##*.}" |tr "[:upper:]" "[:lower:]"`
+ [ "x$ext" == "x" ] && return 1 #no extension
+
+ gq_metadata="$GQ_METADATA_DIR/$1.gq.xmp"
+ if [ -f "$gq_metadata" ]; then
+ gq_orientation=`exiv2 -PXkv "$gq_metadata"|grep Xmp.tiff.Orientation|sed -e "s|Xmp.tiff.Orientation *||"`
+ else
+ gq_orientation=
+ fi
+
+ case "$ext" in
+ jpg|jpeg)
+ [ -n "$gq_orientation" ] && exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+ if exiftran -aip "$1" ; then
+ # exiftran ignores xmp, set it manually
+ exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
+ #http://dev.exiv2.org/issues/show/639
+ [ -n "$gq_orientation" ] && exiv2 -M "set Xmp.tiff.Orientation 1" \
+ -M "set Exif.Image.Orientation 1" "$gq_metadata"
+ return 0
+ fi
+ ;;
+
+ tif|tiff|png)
+ [ -n "$gq_orientation" ] && exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+ if mogrify -auto-orient "$1" ; then
+ # mogrify ignores xmp, set it manually
+ exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
+ #http://dev.exiv2.org/issues/show/639
+ [ -n "$gq_orientation" ] && exiv2 -M "set Xmp.tiff.Orientation 1" \
+ -M "set Exif.Image.Orientation 1" "$gq_metadata"
+ return 0
+ fi
+ ;;
+ *) #not supported
+ return 0
+ ;;
+ esac
+}
+
+# iterate over files on commandline
for file in "$@" ; do
- tmp="$file".$$
- if jpegtran -rotate "$rotation" -copy all -outfile "$tmp" "$file"; then
- mv -f "$tmp" "$file";
- else
- rm -f "$tmp";
- fi
+ # we got only one file for each group, typically the main one
+ # get the sidecars:
+ geeqie -r --get-sidecars:"$file" |while read sidecar ; do
+ # the main file is included in the sidecar file list, no special handling is required
+ rotate "$sidecar"
+ done
done
+
[Desktop Entry]
Version=1.0
Type=Application
-Name=Rotate 180 degrees
-Name[fr]=Rotation 180°
+Name=Apply the orientation to image content
# call the helper script
-Exec=geeqie-rotate 180 %f
+Exec=geeqie-rotate %f
# Desktop files that are usable only in Geeqie should be marked like this:
Categories=X-Geeqie;
OnlyShowIn=X-Geeqie;
-# Show in menu "File"
-X-Geeqie-Menu-Path=FileMenu/FileOpsSection
+# Show in menu "Edit/Orientation"
+X-Geeqie-Menu-Path=EditMenu/OrientationMenu
# It can be made verbose
-#X-Geeqie-Verbose=true
+# X-Geeqie-Verbose=true
-MimeType=image/jpeg;image/jpg;
+MimeType=image/jpeg;image/png;image/tiff;
+++ /dev/null
-[Desktop Entry]
-Version=1.0
-Type=Application
-Name=Rotate 90 degrees counterclockwise
-Name[fr]=Rotation 90° vers la gauche
-
-# call the helper script
-Exec=geeqie-rotate 270 %f
-
-# Desktop files that are usable only in Geeqie should be marked like this:
-Categories=X-Geeqie;
-OnlyShowIn=X-Geeqie;
-
-# Show in menu "File"
-X-Geeqie-Menu-Path=FileMenu/FileOpsSection
-
-# It can be made verbose
-#X-Geeqie-Verbose=true
-
-MimeType=image/jpeg;image/jpg;
+++ /dev/null
-[Desktop Entry]
-Version=1.0
-Type=Application
-Name=Rotate 90 degrees clockwise
-Name[fr]=Rotation 90° vers la droite
-
-# call the helper script
-Exec=geeqie-rotate 90 %f
-
-# Desktop files that are usable only in Geeqie should be marked like this:
-Categories=X-Geeqie;
-OnlyShowIn=X-Geeqie;
-
-# Show in menu "File"
-X-Geeqie-Menu-Path=FileMenu/FileOpsSection
-
-# It can be made verbose
-#X-Geeqie-Verbose=true
-
-MimeType=image/jpeg;image/jpg;