# HG changeset patch # User nadvornik # Date 1245093225 0 # Node ID 34c71cbbbd266a7745bd17510d88dd84831e976f # Parent ab5945017b4a0f039d20c11e4f5bcf041fac3b79 improved rotation script - applies the orientation from metadata - uses exiftran for jpeg an ImageMagick for other files diff -r ab5945017b4a -r 34c71cbbbd26 plugins/rotate/Makefile.am --- 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) diff -r ab5945017b4a -r 34c71cbbbd26 plugins/rotate/geeqie-rotate --- 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 + diff -r ab5945017b4a -r 34c71cbbbd26 plugins/rotate/rotate.desktop --- /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; diff -r ab5945017b4a -r 34c71cbbbd26 plugins/rotate/rotate180.desktop --- 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; diff -r ab5945017b4a -r 34c71cbbbd26 plugins/rotate/rotate270.desktop --- 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; diff -r ab5945017b4a -r 34c71cbbbd26 plugins/rotate/rotate90.desktop --- 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;