4 ## @brief Extract embedded jpegs from a raw file
6 ## Use exiftool if it detects a higher number of preview
7 ## images, otherwise use exiv2 if available
8 ## - exiv2 does not see the largest preview image in a .cr3 file.
10 ## Note that exiftool is noticeably slower than exiv2
12 ## - Display a list of the embedded files
13 ## - Extract the selected image to a tmp folder
14 ## - Rotate image if exif data is available
15 ## - If jpgicc is installed, correct for currently selected rendering intent
16 ## - Store in a new file
17 ## - Set Geeqie focus to the newly generated image
22 if ! [ -x "$(command -v exiftool)" ]
24 if ! [ -x "$(command -v exiv2)" ]
26 zenity --info --width=300 --height=100 --text="Export jpeg from raw file\n\nNeither exiftoool nor exiv2 are installed" --title="Geeqie export jpeg" 2> /dev/null
31 if ! [ -x "$(command -v jpgicc)" ]
33 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
40 if list=$(exiv2 --print preview "$1")
42 if [ "$(echo "$list" | wc --words)" -gt 1 ]
44 exiv2_count=$(echo "$list" | wc --lines)
49 in_list=$(exiftool -veryshort -preview:all -orientation# "$1")
50 if echo "$in_list" | grep --quiet Orientation -
52 exiftool_count=$(($(echo "$in_list" | wc --lines) - 1))
54 exiftool_count=$(echo "$in_list" | wc --words)
57 if [ "$exiftool_count" -gt "$exiv2_count" ]
60 count="$exiftool_count"
65 if [ "$use_exiftool" = "true" ]
67 # An integer value is returned by a # suffix
68 in_list=$(exiftool -veryshort -preview:all -orientation# "$1")
70 if [ "$(echo "$in_list" | wc --lines)" -gt 0 ]
72 # $in_list is in the form of lines e.g.
74 # OtherImage: (Binary data 138367 bytes, use -b option to extract)
75 # PreviewImage: (Binary data 138367 bytes, use -b option to extract)
79 if echo "$in_list" | grep --quiet Orientation -
81 orientation=$(echo "$in_list" | tail --lines=1 | cut --delimiter=' ' --fields=2)
82 count=$(($(echo "$in_list" | wc --lines) - 1))
83 list=$(echo "$in_list" | head --lines=-1 | sort --field-separator=: --key=2 --sort=human-numeric --reverse)
92 orientation_str=$(exiv2 -g Exif.Image.Orientation -pv "$1")
94 # orientation in the form e.g.
95 # 0x0112 Image Orientation Short 1 8
97 orientation=$(echo "$orientation_str" | tr --squeeze-repeats ' ' | cut --delimiter=' ' --fields=6)
100 if [ "$count" -eq 0 ]
102 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
106 case "$orientation" in
111 rotation="-rotate 180"
117 rotation="-transpose"
120 rotation="-rotate 90"
123 rotation="-transverse"
126 rotation="-rotate -90"
138 if [ "$use_exiftool" = "true" ]
140 # $image is in the form of e.g.
141 # OtherImage: (Binary data 138367 bytes, use -b option to extract)
143 preview_name_colon=$(echo "$image" | cut --delimiter=' ' --fields=1)
144 preview_name=$(echo "$preview_name_colon" | cut --delimiter=':' --fields=1)
145 bytes=$(echo "$image" | cut --delimiter=' ' --fields=4)
147 params=$(exiftool -b -"$preview_name" "$1" | exiftool -veryshort -short -ImageSize -MIMEType -)
148 size=$(echo "$params" | head -1)
149 mime=$(echo "$params" | tail -1)
151 if [ "$n" -eq "$count" ]
153 image_list="${image_list:+${image_list}}TRUE\nPreview $n: $mime,\t $size pixels,\t $bytes bytes\n$n:$preview_name:$mime"
155 image_list="${image_list:+${image_list}}FALSE\nPreview $n: $mime,\t $size pixels,\t $bytes bytes\n$n:$preview_name:$mime\n"
158 if [ "$n" -eq "$count" ]
160 image_list="${image_list:+${image_list}}TRUE\n$image\n$n"
162 image_list="${image_list:+${image_list}}FALSE\n$image\n$n\n"
169 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)
171 if [ -n "$image_selected" ]
173 tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
175 if [ "$use_exiftool" = "true" ]
177 # $image_selected is in the form e.g.
178 # 4:jpegfromraw:image/jpeg
180 image_no=$(echo "$image_selected" | cut --delimiter=':' --fields=1)
181 image_id=$(echo "$image_selected" | cut --delimiter=':' --fields=2)
182 image_mime=$(echo "$image_selected" | cut --delimiter=':' --fields=3)
183 image_extension=$(echo "$image_mime" | cut --delimiter='/' --fields=2)
184 base_name=$(basename "$1")
185 image_name="${base_name%.*}"
186 exiftool -b -"$image_id" "$1" > "$tmpdir/$image_name-preview$image_no.$image_extension"
188 exiv2 --location "$tmpdir" -ep"$image_selected" "$1"
191 if [ -n "$rotation" ]
193 command_str="mogrify $rotation \"$tmpdir/*\""
197 base_name=$(basename "$tmpdir/"*)
198 image_extension="${base_name##*.}"
200 if echo "$base_name" | grep --quiet --ignore-case "\.jpeg$" || echo "$base_name" | grep --quiet --ignore-case "\.jpg$"
202 render_str=$(geeqie --remote --get-render-intent)
208 "Relative Colorimetric")
214 "Absolute Colorimetric")
222 filename=$(basename "$tmpdir/"* ".$image_extension")
223 if [ -x "$(command -v jpgicc)" ]
225 filename_ri="$tmpdir/""$filename""-ri.jpg"
226 jpgicc -t "$render_key" "$tmpdir/""$filename"".$image_extension" "$filename_ri"
228 rm "$tmpdir/$filename.$image_extension"
232 geeqie --remote --view="$tmpdir/"