Eliminate some GitHub action warnings
[geeqie.git] / plugins / export-jpeg / geeqie-export-jpeg
1 #!/bin/sh
2
3 ## @file
4 ## @brief Extract embedded jpegs from a raw file
5 ##
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.
9 ##
10 ## Note that exiftool is noticeably slower than exiv2
11 ##
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
18 ##
19
20 use_exiftool="false"
21
22 if ! [ -x "$(command -v exiftool)" ]
23 then
24         if ! [ -x "$(command -v exiv2)" ]
25         then
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
27                 exit 1
28         fi
29 fi
30
31 if ! [ -x "$(command -v jpgicc)" ]
32 then
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
34 fi
35
36 IFS='
37 '
38
39 exiv2_count=0
40 if list=$(exiv2 --print preview "$1")
41 then
42         if [ "$(echo "$list" | wc --words)" -gt 1 ]
43         then
44                 exiv2_count=$(echo "$list" | wc --lines)
45         fi
46 fi
47
48 exiftool_count=0
49 in_list=$(exiftool -veryshort -preview:all -orientation# "$1")
50 if echo "$in_list" | grep --quiet Orientation -
51 then
52         exiftool_count=$(($(echo "$in_list" | wc --lines) - 1))
53 else
54         exiftool_count=$(echo "$in_list" | wc --words)
55 fi
56
57 if [ "$exiftool_count" -gt "$exiv2_count" ]
58 then
59         use_exiftool="true"
60         count="$exiftool_count"
61 else
62         count="$exiv2_count"
63 fi
64
65 if [ "$use_exiftool" = "true" ]
66 then
67         # An integer value is returned by a # suffix
68         in_list=$(exiftool -veryshort -preview:all -orientation# "$1")
69
70         if [ "$(echo "$in_list" | wc --lines)" -gt 0 ]
71         then
72                 # $in_list is in the form of lines e.g.
73                 #
74                 # OtherImage: (Binary data 138367 bytes, use -b option to extract)
75                 # PreviewImage: (Binary data 138367 bytes, use -b option to extract)
76                 # ...
77                 # Orientation: 8
78
79                 if echo "$in_list" | grep --quiet Orientation -
80                 then
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)
84                 else
85                         orientation=0
86                         list="$in_list"
87                 fi
88         else
89                 count=0
90         fi
91 else
92         orientation_str=$(exiv2 -g Exif.Image.Orientation -pv "$1")
93
94         # orientation in the form e.g.
95         # 0x0112 Image        Orientation                 Short       1  8
96
97         orientation=$(echo "$orientation_str" | tr --squeeze-repeats ' ' | cut --delimiter=' ' --fields=6)
98 fi
99
100 if [ "$count" -eq 0 ]
101 then
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
103         exit 0
104 fi
105
106 case "$orientation" in
107         2)
108                 rotation="-flop"
109                 ;;
110         3)
111                 rotation="-rotate 180"
112                 ;;
113         4)
114                 rotation="-flip"
115                 ;;
116         5)
117                 rotation="-transpose"
118                 ;;
119         6)
120                 rotation="-rotate 90"
121                 ;;
122         7)
123                 rotation="-transverse"
124                 ;;
125         8)
126                 rotation="-rotate -90"
127                 ;;
128         *)
129                 rotation=""
130                 ;;
131 esac
132
133 n=1
134 image_list=""
135
136 for image in $list
137 do
138         if [ "$use_exiftool" = "true" ]
139         then
140                 # $image is in the form of e.g.
141                 # OtherImage: (Binary data 138367 bytes, use -b option to extract)
142
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)
146
147                 params=$(exiftool -b -"$preview_name" "$1" | exiftool -veryshort -short -ImageSize -MIMEType -)
148                 size=$(echo "$params" | head -1)
149                 mime=$(echo "$params" | tail -1)
150
151                 if [ "$n" -eq "$count" ]
152                 then
153                         image_list="${image_list:+${image_list}}TRUE\nPreview $n: $mime,\t $size pixels,\t $bytes bytes\n$n:$preview_name:$mime"
154                 else
155                         image_list="${image_list:+${image_list}}FALSE\nPreview $n: $mime,\t $size pixels,\t $bytes bytes\n$n:$preview_name:$mime\n"
156                 fi
157         else
158                 if [ "$n" -eq "$count" ]
159                 then
160                         image_list="${image_list:+${image_list}}TRUE\n$image\n$n"
161                 else
162                         image_list="${image_list:+${image_list}}FALSE\n$image\n$n\n"
163                 fi
164         fi
165
166         n=$((n + 1))
167 done
168
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)
170
171 if [ -n "$image_selected" ]
172 then
173         tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
174
175         if [ "$use_exiftool" = "true" ]
176         then
177                 # $image_selected is in the form e.g.
178                 # 4:jpegfromraw:image/jpeg
179
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"
187         else
188                 exiv2 --location "$tmpdir" -ep"$image_selected" "$1"
189         fi
190
191         if [ -n "$rotation" ]
192         then
193                 command_str="mogrify $rotation \"$tmpdir/*\""
194                 sh -c "$command_str"
195         fi
196
197         base_name=$(basename "$tmpdir/"*)
198         image_extension="${base_name##*.}"
199
200         if echo "$base_name" | grep --quiet --ignore-case "\.jpeg$" || echo "$base_name" | grep --quiet --ignore-case "\.jpg$"
201         then
202                 render_str=$(geeqie --remote --get-render-intent)
203
204                 case $render_str in
205                         "Perceptual")
206                                 render_key=0
207                                 ;;
208                         "Relative Colorimetric")
209                                 render_key=1
210                                 ;;
211                         "Saturation")
212                                 render_key=2
213                                 ;;
214                         "Absolute Colorimetric")
215                                 render_key=3
216                                 ;;
217                         *)
218                                 render_key=0
219                                 ;;
220                 esac
221
222                 filename=$(basename "$tmpdir/"* ".$image_extension")
223                 if [ -x "$(command -v jpgicc)" ]
224                 then
225                         filename_ri="$tmpdir/""$filename""-ri.jpg"
226                         jpgicc -t "$render_key" "$tmpdir/""$filename"".$image_extension" "$filename_ri"
227
228                         rm "$tmpdir/$filename.$image_extension"
229                 fi
230         fi
231
232         geeqie --remote --view="$tmpdir/"
233 fi