From: Vladimir Nadvornik Date: Mon, 15 Jun 2009 19:13:45 +0000 (+0000) Subject: improved rotation script X-Git-Tag: v1.0.0~156 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=f63a2dd3fa1b61bec9a04c877f3ca9953b467133 improved rotation script - applies the orientation from metadata - uses exiftran for jpeg an ImageMagick for other files --- diff --git a/plugins/rotate/Makefile.am b/plugins/rotate/Makefile.am index f4647bed..97cf9b01 100644 --- a/plugins/rotate/Makefile.am +++ b/plugins/rotate/Makefile.am @@ -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 --git a/plugins/rotate/geeqie-rotate b/plugins/rotate/geeqie-rotate index 7abe42ba..3aa9673a 100755 --- a/plugins/rotate/geeqie-rotate +++ b/plugins/rotate/geeqie-rotate @@ -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 + diff --git a/plugins/rotate/rotate180.desktop b/plugins/rotate/rotate.desktop similarity index 50% rename from plugins/rotate/rotate180.desktop rename to plugins/rotate/rotate.desktop index a797d27d..2257da91 100644 --- a/plugins/rotate/rotate180.desktop +++ b/plugins/rotate/rotate.desktop @@ -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 index 9db06b84..00000000 --- a/plugins/rotate/rotate270.desktop +++ /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 index b2ac1140..00000000 --- a/plugins/rotate/rotate90.desktop +++ /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;