changeset 1641:34c71cbbbd26

improved rotation script - applies the orientation from metadata - uses exiftran for jpeg an ImageMagick for other files
author nadvornik
date Mon, 15 Jun 2009 19:13:45 +0000
parents ab5945017b4a
children a78ac3a4c32e
files plugins/rotate/Makefile.am plugins/rotate/geeqie-rotate plugins/rotate/rotate.desktop plugins/rotate/rotate180.desktop plugins/rotate/rotate270.desktop plugins/rotate/rotate90.desktop
diffstat 6 files changed, 74 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/rotate/Makefile.am	Sat Jun 13 22:19:57 2009 +0000
+++ b/plugins/rotate/Makefile.am	Mon Jun 15 19:13:45 2009 +0000
@@ -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)
 
--- a/plugins/rotate/geeqie-rotate	Sat Jun 13 22:19:57 2009 +0000
+++ b/plugins/rotate/geeqie-rotate	Mon Jun 15 19:13:45 2009 +0000
@@ -1,15 +1,59 @@
-#!/bin/sh
+#!/bin/bash -x
+
+# This is a helper script that rotate image files according to the metadata
+# requirements: ImageMagick, exiftran, exiv2
+
+GQ_METADATA_DIR="$HOME/.local/share/geeqie/metadata"
 
-# This is a helper script that rotate jpeg files using jpegtran
+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
 
-rotation=$1
-shift
+    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
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/rotate/rotate.desktop	Mon Jun 15 19:13:45 2009 +0000
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Apply the orientation to image content
+
+# call the helper script
+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 "Edit/Orientation"
+X-Geeqie-Menu-Path=EditMenu/OrientationMenu
+
+# It can be made verbose
+# X-Geeqie-Verbose=true
+
+MimeType=image/jpeg;image/png;image/tiff;
--- a/plugins/rotate/rotate180.desktop	Sat Jun 13 22:19:57 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-[Desktop Entry]
-Version=1.0
-Type=Application
-Name=Rotate 180 degrees
-Name[fr]=Rotation 180°
-
-# call the helper script
-Exec=geeqie-rotate 180 %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;
--- a/plugins/rotate/rotate270.desktop	Sat Jun 13 22:19:57 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -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;
--- a/plugins/rotate/rotate90.desktop	Sat Jun 13 22:19:57 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -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;