Fix #635: Export in JPG
authorColin Clark <colin.clark@cclark.uk>
Sun, 14 Oct 2018 11:40:03 +0000 (12:40 +0100)
committerColin Clark <colin.clark@cclark.uk>
Sun, 14 Oct 2018 11:40:03 +0000 (12:40 +0100)
https://github.com/BestImageViewer/geeqie/issues/635

Implemented via plugin

configure.in
plugins/Makefile.am
plugins/export-jpeg/Makefile.am [new file with mode: 0644]
plugins/export-jpeg/export-jpeg.desktop.in [new file with mode: 0644]
plugins/export-jpeg/geeqie-export-jpeg [new file with mode: 0755]
src/remote.c
web/geeqie-install-debian.sh

index 751e9fb..ee23e07 100644 (file)
@@ -619,6 +619,7 @@ AC_CONFIG_FILES([
     plugins/ufraw/Makefile
     plugins/import/Makefile
     plugins/geocode-parameters/Makefile
+    plugins/export-jpeg/Makefile
     geeqie.spec
 ])
 
index 9d1aaca..9176d2b 100644 (file)
@@ -1,6 +1,6 @@
 #FIXME enable or disable individual plugins from configure
 
-SUBDIRS = rotate symlink ufraw import geocode-parameters
+SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg
 qq_desktoptemplatedir = $(appdir)
 qq_desktoptemplate_DATA = template.desktop
 
diff --git a/plugins/export-jpeg/Makefile.am b/plugins/export-jpeg/Makefile.am
new file mode 100644 (file)
index 0000000..b2a7da3
--- /dev/null
@@ -0,0 +1,9 @@
+dist_gq_bin_SCRIPTS = geeqie-export-jpeg
+
+gq_desktopdir = $(appdir)/applications
+gq_desktop_in_files = export-jpeg.desktop.in
+gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST = $(gq_desktop_in_files)
+CLEANFILES = $(gq_desktop_DATA)
diff --git a/plugins/export-jpeg/export-jpeg.desktop.in b/plugins/export-jpeg/export-jpeg.desktop.in
new file mode 100644 (file)
index 0000000..3cfdb73
--- /dev/null
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+_Name=Export jpeg
+
+Exec=geeqie-export-jpeg %f
+
+# show only if these are installed
+#TryExec=exiv2
+#TryExec=jpgicc
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff --git a/plugins/export-jpeg/geeqie-export-jpeg b/plugins/export-jpeg/geeqie-export-jpeg
new file mode 100755 (executable)
index 0000000..3b8baf6
--- /dev/null
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+# Extract emdedded jpegs from a raw file:
+#
+# Display a list of the embedded files
+# Extract the selected image to a tmp folder
+# If jpgicc is installed, correct for currently selected rendering intent
+#  and store in a new file
+# Set Geeqie focus to the newly generated image
+
+count=$(exiv2 -pp "$1" | wc -l)
+
+if [[ $count -eq 0 ]]
+then
+       zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\nFile contains no embedded images" --title="Geeqie export jpeg" 2>/dev/null
+       exit
+fi
+
+if ! [ -x "$(command -v exiv2)" ]
+then
+       zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\nexiv2 is not installed" --title="Geeqie export jpeg" 2>/dev/null
+       exit 1
+fi
+
+if ! [ -x "$(command -v jpgicc)" ]
+then
+       zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\njpgicc is not installed\ncolor corrections will not be made\nYou may install via liblcms2-utils" --title="Geeqie export jpeg" 2>/dev/null
+fi
+
+list=$(exiv2 -pp "$1")
+readarray -t split_list <<<"$list"
+
+image_list=""
+n=1
+
+for image in "${split_list[@]}"
+do
+       if [[ $n -eq $count ]]
+       then
+               image_list="$image_list"$'TRUE\n'"$image"$'\n'"$n"
+       else
+               image_list="$image_list"$'FALSE\n'"$image"$'\n'"$n"$'\n'
+       fi
+       n=$((n+1))
+done
+
+image_selected=$(echo "$image_list" | zenity  --width=500 --height=250 --title="Geeqie export jpeg" --list  --text "Select embedded image" --radiolist  --column "Select" --column "Image" --column "n" --hide-column=3 --print-column=3 2>/dev/null) 
+
+if [[ ! -z "$image_selected" ]]
+then
+       tmpdir=$(mktemp --tmpdir --directory geeqie_export_jpeg_XXXXXX)
+
+       exiv2 -ep"$image_selected" "$1" --location "$tmpdir"
+
+       render_str=$(geeqie --remote --get-render-intent)
+
+       case $render_str in
+               "Perceptual" )
+               render_key=0;;
+               "Relative Colorimetric" )
+               render_key=1;;
+               "Saturation" )
+               render_key=2;;
+               "Absolute Colorimetric" )
+               render_key=3;;
+       esac
+
+       filename=$(basename "$tmpdir/"* ".jpg")
+       if [ -x "$(command -v jpgicc)" ]
+       then
+               filename_ri="$tmpdir/""$filename""-ri.jpg"
+               jpgicc -t $render_key "$tmpdir/""$filename"".jpg"  "$filename_ri"
+
+               rm "$tmpdir/""$filename"".jpg"
+
+               geeqie --remote view:"$filename_ri"
+       else
+               geeqie --remote view:"$tmpdir/""$filename"".jpg"
+       fi
+fi
index 58d4ec3..15cb871 100644 (file)
@@ -718,6 +718,35 @@ static void gr_rectangle(const gchar *text, GIOChannel *channel, gpointer data)
                }
 }
 
+static void gr_render_intent(const gchar *text, GIOChannel *channel, gpointer data)
+{
+       gchar *render_intent;
+
+       switch (options->color_profile.render_intent)
+               {
+               case 0:
+                       render_intent = g_strdup("Perceptual");
+                       break;
+               case 1:
+                       render_intent = g_strdup("Relative Colorimetric");
+                       break;
+               case 2:
+                       render_intent = g_strdup("Saturation");
+                       break;
+               case 3:
+                       render_intent = g_strdup("Absolute Colorimetric");
+                       break;
+               default:
+                       render_intent = g_strdup("none");
+                       break;
+               }
+
+       g_io_channel_write_chars(channel, render_intent, -1, NULL, NULL);
+       g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+
+       g_free(render_intent);
+}
+
 static void gr_file_tell(const gchar *text, GIOChannel *channel, gpointer data)
 {
        if (!layout_valid(&lw_id)) return;
@@ -910,6 +939,7 @@ static RemoteCommandEntry remote_commands[] = {
        { NULL, "--tell",               gr_file_tell,           FALSE, FALSE, NULL, N_("print filename of current image") },
        { NULL, "--pixel-info",         gr_pixel_info,          FALSE, FALSE, NULL, N_("print pixel info of mouse pointer on current image") },
        { NULL, "--get-rectangle",      gr_rectangle,           FALSE, FALSE, NULL, N_("get rectangle co-ordinates") },
+       { NULL, "--get-render-intent",  gr_render_intent,       FALSE, FALSE, NULL, N_("get render intent") },
        { NULL, "view:",                gr_file_view,           TRUE,  FALSE, N_("<FILE>"), N_("open FILE in new window") },
        { NULL, "--list-clear",         gr_list_clear,          FALSE, FALSE, NULL, N_("clear command line collection list") },
        { NULL, "--list-add:",          gr_list_add,            TRUE,  FALSE, N_("<FILE>"), N_("add FILE to command line collection list") },
index dbd664e..1c61d98 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/bash
-version="2018-08-20"
+version="2018-10-14"
 description=$'
 Geeqie is an image viewer.
 This script will download, compile, and install Geeqie on Debian-based systems.
@@ -51,6 +51,10 @@ optional_array=(
 "imagemagick"
 "ufraw (for RAW file handling)"
 "ufraw"
+"exiv2 command line (for jpeg export)"
+"exiv2"
+"jpgicc (for jpeg export color correction)"
+"liblcms2-utils"
 "markdown (for generating README help file)"
 "markdown"
 )