improved rotation script
authorVladimir Nadvornik <nadvornik@suse.cz>
Mon, 15 Jun 2009 19:13:45 +0000 (19:13 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Mon, 15 Jun 2009 19:13:45 +0000 (19:13 +0000)
- applies the orientation from metadata
- uses exiftran for jpeg an ImageMagick for other files

plugins/rotate/Makefile.am
plugins/rotate/geeqie-rotate
plugins/rotate/rotate.desktop [moved from plugins/rotate/rotate180.desktop with 50% similarity]
plugins/rotate/rotate270.desktop [deleted file]
plugins/rotate/rotate90.desktop [deleted file]

index f4647be..97cf9b0 100644 (file)
@@ -1,7 +1,7 @@
 dist_pkglib_SCRIPTS = geeqie-rotate
 
 qq_desktopdir = $(pkgdatadir)/applications
-qq_desktop_DATA = rotate90.desktop rotate180.desktop rotate270.desktop
+qq_desktop_DATA = rotate.desktop
 
 EXTRA_DIST = $(qq_desktop_DATA)
 
index 7abe42b..3aa9673 100755 (executable)
@@ -1,15 +1,59 @@
-#!/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
+
similarity index 50%
rename from plugins/rotate/rotate180.desktop
rename to plugins/rotate/rotate.desktop
index a797d27..2257da9 100644 (file)
@@ -1,20 +1,19 @@
 [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;
diff --git a/plugins/rotate/rotate270.desktop b/plugins/rotate/rotate270.desktop
deleted file mode 100644 (file)
index 9db06b8..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-[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;
diff --git a/plugins/rotate/rotate90.desktop b/plugins/rotate/rotate90.desktop
deleted file mode 100644 (file)
index b2ac114..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-[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;