From 1db3c0af21fdd49589187aa8fdfe2db2ca4072e7 Mon Sep 17 00:00:00 2001 From: Colin Clark Date: Sun, 14 Oct 2018 12:40:03 +0100 Subject: [PATCH] Fix #635: Export in JPG https://github.com/BestImageViewer/geeqie/issues/635 Implemented via plugin --- configure.in | 1 + plugins/Makefile.am | 2 +- plugins/export-jpeg/Makefile.am | 9 +++ plugins/export-jpeg/export-jpeg.desktop.in | 19 +++++ plugins/export-jpeg/geeqie-export-jpeg | 80 ++++++++++++++++++++++ src/remote.c | 30 ++++++++ web/geeqie-install-debian.sh | 6 +- 7 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 plugins/export-jpeg/Makefile.am create mode 100644 plugins/export-jpeg/export-jpeg.desktop.in create mode 100755 plugins/export-jpeg/geeqie-export-jpeg diff --git a/configure.in b/configure.in index 751e9fb8..ee23e071 100644 --- a/configure.in +++ b/configure.in @@ -619,6 +619,7 @@ AC_CONFIG_FILES([ plugins/ufraw/Makefile plugins/import/Makefile plugins/geocode-parameters/Makefile + plugins/export-jpeg/Makefile geeqie.spec ]) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 9d1aaca3..9176d2b3 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -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 index 00000000..b2a7da35 --- /dev/null +++ b/plugins/export-jpeg/Makefile.am @@ -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 index 00000000..3cfdb738 --- /dev/null +++ b/plugins/export-jpeg/export-jpeg.desktop.in @@ -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 index 00000000..3b8baf60 --- /dev/null +++ b/plugins/export-jpeg/geeqie-export-jpeg @@ -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 diff --git a/src/remote.c b/src/remote.c index 58d4ec31..15cb8715 100644 --- a/src/remote.c +++ b/src/remote.c @@ -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_(""), 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_(""), N_("add FILE to command line collection list") }, diff --git a/web/geeqie-install-debian.sh b/web/geeqie-install-debian.sh index dbd664e0..1c61d985 100755 --- a/web/geeqie-install-debian.sh +++ b/web/geeqie-install-debian.sh @@ -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" ) -- 2.20.1