diff options
author | exiftool <phil@work3.phy.queensu.ca> | 2016-12-19 14:04:05 -0500 |
---|---|---|
committer | exiftool <phil@work3.phy.queensu.ca> | 2016-12-19 14:04:05 -0500 |
commit | 0a8bd6c38914d5d39ee96f29241e32c20707d51c (patch) | |
tree | 25532a6a5bce5edc1227006689caaf97e17a925a | |
parent | 6f0b01aacf9969355dec3b24f15a1bab142db97a (diff) |
Update to 10.37
-rw-r--r-- | Changes | 12 | ||||
-rw-r--r-- | README | 4 | ||||
-rw-r--r-- | config_files/time_zone.config | 20 | ||||
-rwxr-xr-x | exiftool | 25 | ||||
-rw-r--r-- | html/ExifTool.html | 5 | ||||
-rw-r--r-- | html/TagNames/BMP.html | 149 | ||||
-rw-r--r-- | html/TagNames/FujiFilm.html | 17 | ||||
-rw-r--r-- | html/TagNames/Sony.html | 5 | ||||
-rw-r--r-- | html/exiftool_pod.html | 9 | ||||
-rw-r--r-- | html/geotag.html | 13 | ||||
-rw-r--r-- | html/history.html | 13 | ||||
-rw-r--r-- | html/index.html | 14 | ||||
-rw-r--r-- | html/install.html | 22 | ||||
-rw-r--r-- | html/under.html | 25 | ||||
-rw-r--r-- | lib/Image/ExifTool.pm | 18 | ||||
-rw-r--r-- | lib/Image/ExifTool.pod | 5 | ||||
-rw-r--r-- | lib/Image/ExifTool/BMP.pm | 204 | ||||
-rw-r--r-- | lib/Image/ExifTool/FujiFilm.pm | 7 | ||||
-rw-r--r-- | lib/Image/ExifTool/Photoshop.pm | 15 | ||||
-rw-r--r-- | lib/Image/ExifTool/QuickTime.pm | 12 | ||||
-rw-r--r-- | lib/Image/ExifTool/Sony.pm | 9 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagInfoXML.pm | 2 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagLookup.pm | 16 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagNames.pod | 27 | ||||
-rw-r--r-- | perl-Image-ExifTool.spec | 2 | ||||
-rw-r--r-- | t/BMP_2.out | 7 | ||||
-rw-r--r-- | t/Pentax_4.out | 7 | ||||
-rw-r--r-- | t/RIFF_3.out | 7 | ||||
-rwxr-xr-x | windows_exiftool | 27 |
29 files changed, 572 insertions, 126 deletions
@@ -7,6 +7,18 @@ RSS feed: http://owl.phy.queensu.ca/~phil/exiftool/rss.xml Note: The most recent production release is Version 10.36. (Other versions are considered development releases, and are not uploaded to CPAN.) +Dec. 19, 2016 - Version 10.37 + + - Decode more information from BMP V4 and V5 images + - Added a few new FujiFlashMode values (thanks Albert Shan) + - Changed -geotime default to use unconverted value of DateTimeOriginal + - Changed a couple of Sony Voigtlander LensType strings (thanks Jos Roost) + - Warn about invalid TAG name + - Generate default-language version of QuickTime tags even if the same-named + tag already exists in another group + - Fixed bug reading some Photoshop layer information + - Fixed problems in sample config file time_zone.config (thanks Hayo Baan) + Nov. 24, 2016 - Version 10.36 (production release) - Added 3D Studio MAX files to the list of supported file types @@ -101,8 +101,8 @@ your home directory, then you would type the following commands in a terminal window to extract and run ExifTool: cd ~/Desktop - gzip -dc Image-ExifTool-10.36.tar.gz | tar -xf - - cd Image-ExifTool-10.36 + gzip -dc Image-ExifTool-10.37.tar.gz | tar -xf - + cd Image-ExifTool-10.37 ./exiftool t/images/ExifTool.jpg Note: These commands extract meta information from one of the test images. diff --git a/config_files/time_zone.config b/config_files/time_zone.config index e29aae9b..a497aa6e 100644 --- a/config_files/time_zone.config +++ b/config_files/time_zone.config @@ -4,20 +4,26 @@ # Description: ExifTool config file to return time zone from an image # # Notes: The Composite:TimeZone tag defined here attempts to determine -# the time zone for an image. If possible, the time zone for +# the time zone for an image. If possible, the camera time zone +# is used, if that does not exist, the time zone for # DateTimeOriginal is returned, but if this can't be determined # then the time zone for CreateDate and then ModifyDate are used. +# If this all does not result in a time zone, the timezone of the +# TimeCreated tag is used # # Usage: exiftool -config time_zone.config -timezone FILE # -# Requires: Any version of ExifTool +# Requires: ExifTool version 7.74 or later # # Revisions: 2016/10/03 - P. Harvey Created +# 2016/12/12 - H. Baan Corrected tag name, added support for +# camera time zone/daylight savings info in +# MakerNotes #------------------------------------------------------------------------------ %Image::ExifTool::UserDefined = ( 'Image::ExifTool::Composite' => { - FileName => { + TimeZone => { Desire => { 0 => 'DateTimeOriginal', 1 => 'CreateDate', @@ -28,8 +34,12 @@ 6 => 'OffsetTimeDigitized', # (CreateDate) 7 => 'OffsetTime', # (ModifyDate) 8 => 'TimeZoneOffset', # (ModifyDate) + 9 => 'MakerNotes:TimeZone', + 10 => 'MakerNotes:DaylightSavings', + 11 => 'TimeCreated', }, RawConv => q{ + return TimeZoneString($val[9] + ($val[10] ? 60 : 0)) if defined $val[9]; return $val[5] if $val[5]; return $val[6] if $val[6]; return $val[7] if $val[7]; @@ -40,13 +50,15 @@ } if (defined $val[3] and defined $val[4]) { my $loc = $val[0] || $val[1] || $val[2]; - print "$loc\n";#TEST if ($loc) { my @loc = split /[: ]/, $loc; my @gmt = split /[: ]/, "$val[3] $val[4]"; return TimeZoneString(GetTimeZone([@loc[5,4,3,2]], [@gmt[5,4,3,2]])); } } + if ($val[11] && $val[11] =~ /[0-9]{2}[0-9]{2}[0-9]{2}([+-][0-9]{2})([0-9]{2})/) { + return TimeZoneString($1 * 60 + $2); + } return undef; }, }, @@ -12,7 +12,7 @@ use strict; require 5.004; -my $version = '10.36'; +my $version = '10.37'; # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool' my $exeDir; @@ -1180,7 +1180,7 @@ for (;;) { } elsif (/^([-\w]+:)*(geotag|geotime)\b/i) { if (lc $2 eq 'geotag') { if ((not defined $addGeotime or $addGeotime) and length $val) { - $addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal'; + $addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal#'; } } else { $addGeotime = ''; @@ -1207,10 +1207,12 @@ for (;;) { $addGeotime = ''; } } - } elsif (/^-(.*)/) { - push @exclude, $1; } else { - push @tags, $_; + my $lst = s/^-// ? \@exclude : \@tags; + unless (/^([-\w*]+:)*([-\w*?]+)#?$/) { + Warn(qq(Invalid TAG name: $_\n)); + } + push @$lst, $_; # (push everything for backward compatibility) } } } else { @@ -3532,7 +3534,7 @@ sub AddPrintFormat($) #------------------------------------------------------------------------------ # Get suggested file extension based on tag value for binary output -# Inputs: 0) data ref +# Inputs: 0) ExifTool ref, 1) data ref, 2) tag name # Returns: file extension (lower case), or 'dat' if unknown sub SuggestedExtension($$$) { @@ -3561,6 +3563,8 @@ sub SuggestedExtension($$$) $ext = $ext ? lc($ext) : 'raw'; } elsif ($tag eq 'EXIF') { $ext = 'exif'; + } elsif ($tag eq 'ICC_Profile') { + $ext = 'icc'; } elsif ($$valPt =~ /^(MM\0\x2a|II\x2a\0)/) { $ext = 'tiff'; } elsif ($$valPt !~ /^.{0,4096}\0/s) { @@ -4856,7 +4860,7 @@ with this command: produces output like this: - -- Generated by ExifTool 10.36 -- + -- Generated by ExifTool 10.37 -- File: a.jpg - 2003:10:31 15:44:19 (f/5.6, 1/60s, ISO 100) File: b.jpg - 2006:05:23 11:57:38 @@ -5574,11 +5578,12 @@ Geotag images from the specified GPS track log file. Using the B<-geotag> option is equivalent to writing a value to the C<Geotag> tag. After the B<-geotag> option has been specified, the value of the C<Geotime> tag is written to define a date/time for the position interpolation. If C<Geotime> -is not specified, the value is copied from C<DateTimeOriginal>. For -example, the following two commands are equivalent: +is not specified, the value is copied from C<DateTimeOriginal#> (the C<#> is +added to copy the unformatted value, avoiding potential conflicts with the +B<-d> option). For example, the following two commands are equivalent: exiftool -geotag track.log image.jpg - exiftool -geotag "-Geotime<DateTimeOriginal" image.jpg + exiftool -geotag track.log "-Geotime<DateTimeOriginal#" image.jpg When the C<Geotime> value is converted to UTC, the local system timezone is assumed unless the date/time value contains a timezone. Writing C<Geotime> diff --git a/html/ExifTool.html b/html/ExifTool.html index 9be3b8b4..6c43978b 100644 --- a/html/ExifTool.html +++ b/html/ExifTool.html @@ -949,6 +949,11 @@ specified information. May be called repeatedly to write the same information to additional files without the need to call <a href="#SetNewValue">SetNewValue</a> again.</p> +<p>Note that it is <b>NOT</b> necessary to call <a href="#ExtractInfo">ExtractInfo</a> +or <a href="#ImageInfo">ImageInfo</a> before <a href="#WriteInfo">WriteInfo</a>. +<a href="#WriteInfo">WriteInfo</a> changes only metadata specified by previous +calls to <a href="#SetNewValue">SetNewValue</a>.</p> + <blockquote><table class='norm'> <tr><td><b>Prototype</b></td><td>WriteInfo($$;$$)</td></tr> <tr><td valign=top><b>Inputs</b></td><td><b>0)</b> ExifTool object reference diff --git a/html/TagNames/BMP.html b/html/TagNames/BMP.html index f89aa25c..36d98953 100644 --- a/html/TagNames/BMP.html +++ b/html/TagNames/BMP.html @@ -15,26 +15,36 @@ of image related information.</p> <tr class=h><th>Index1</th><th>Tag Name</th> <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr> <tr> +<td class=r title='0 = 0x0'>0</td> +<td>BMPVersion</td> +<td class=c>N</td> +<td><span class=s><span class=n>(this is actually the size of the BMP header, but used to determine the BMP +version)</span> + <br>40 = Windows V3 + <br>68 = AVI BMP structure? + <br>108 = Windows V4 + <br>124 = Windows V5</span></td></tr> +<tr class=b> <td class=r title='4 = 0x4'>4</td> <td>ImageWidth</td> <td class=c>N</td> <td> </td></tr> -<tr class=b> +<tr> <td class=r title='8 = 0x8'>8</td> <td>ImageHeight</td> <td class=c>N</td> <td> </td></tr> -<tr> +<tr class=b> <td class=r title='12 = 0xc'>12</td> <td>Planes</td> <td class=c>N</td> <td> </td></tr> -<tr class=b> +<tr> <td class=r title='14 = 0xe'>14</td> <td>BitDepth</td> <td class=c>N</td> <td> </td></tr> -<tr> +<tr class=b> <td class=r title='16 = 0x10'>16</td> <td>Compression</td> <td class=c>N</td> @@ -46,31 +56,112 @@ of image related information.</p> <br>4 = JPEG <br>5 = PNG</td></tr></table> </td></tr> -<tr class=b> +<tr> <td class=r title='20 = 0x14'>20</td> <td>ImageLength</td> <td class=c>N</td> <td> </td></tr> -<tr> +<tr class=b> <td class=r title='24 = 0x18'>24</td> <td>PixelsPerMeterX</td> <td class=c>N</td> <td> </td></tr> -<tr class=b> +<tr> <td class=r title='28 = 0x1c'>28</td> <td>PixelsPerMeterY</td> <td class=c>N</td> <td> </td></tr> -<tr> +<tr class=b> <td class=r title='32 = 0x20'>32</td> <td>NumColors</td> <td class=c>N</td> <td> </td></tr> -<tr class=b> +<tr> <td class=r title='36 = 0x24'>36</td> <td>NumImportantColors</td> <td class=c>N</td> <td> </td></tr> +<tr class=b> +<td class=r title='40 = 0x28'>40</td> +<td>RedMask</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td class=r title='44 = 0x2c'>44</td> +<td>GreenMask</td> +<td class=c>N</td> +<td> </td></tr> +<tr class=b> +<td class=r title='48 = 0x30'>48</td> +<td>BlueMask</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td class=r title='52 = 0x34'>52</td> +<td>AlphaMask</td> +<td class=c>N</td> +<td> </td></tr> +<tr class=b> +<td class=r title='56 = 0x38'>56</td> +<td>ColorSpace</td> +<td class=c>N</td> +<td><table class=cols><tr> + <td>0 = Calibrated RGB + <br>1 = Device RGB + <br>2 = Device CMYK + <br>'LINK' = Linked Color Profile + <br>'MBED' = Embedded Color Profile + <br>'Win ' = Windows Color Space + <br>'sRGB' = sRGB</td></tr></table> +</td></tr> +<tr> +<td class=r title='60 = 0x3c'>60</td> +<td>RedEndpoint</td> +<td class=c>N</td> +<td> </td></tr> +<tr class=b> +<td class=r title='72 = 0x48'>72</td> +<td>GreenEndpoint</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td class=r title='84 = 0x54'>84</td> +<td>BlueEndpoint</td> +<td class=c>N</td> +<td> </td></tr> +<tr class=b> +<td class=r title='96 = 0x60'>96</td> +<td>GammaRed</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td class=r title='100 = 0x64'>100</td> +<td>GammaGreen</td> +<td class=c>N</td> +<td> </td></tr> +<tr class=b> +<td class=r title='104 = 0x68'>104</td> +<td>GammaBlue</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td class=r title='108 = 0x6c'>108</td> +<td>RenderingIntent</td> +<td class=c>N</td> +<td><span class=s>1 = Graphic (LCS_GM_BUSINESS) + <br>2 = Proof (LCS_GM_GRAPHICS) + <br>4 = Picture (LCS_GM_IMAGES) + <br>8 = Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)</span></td></tr> +<tr class=b> +<td class=r title='112 = 0x70'>112</td> +<td>ProfileDataOffset</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td class=r title='116 = 0x74'>116</td> +<td>ProfileSize</td> +<td class=c>N</td> +<td> </td></tr> </table></td></tr></table></blockquote> <h2><a name='OS2'>BMP OS2 Tags</a></h2> @@ -81,30 +172,62 @@ of image related information.</p> <tr class=h><th>Index1</th><th>Tag Name</th> <th>Writable</th><th>Values / <span class=n>Notes</span></th></tr> <tr> +<td class=r title='0 = 0x0'>0</td> +<td>BMPVersion</td> +<td class=c>N</td> +<td><span class=s><span class=n>(again, the header size is used to determine the BMP version)</span> + <br>12 = OS/2 V1 + <br>64 = OS/2 V2</span></td></tr> +<tr class=b> <td class=r title='4 = 0x4'>4</td> <td>ImageWidth</td> <td class=c>N</td> <td> </td></tr> -<tr class=b> +<tr> <td class=r title='6 = 0x6'>6</td> <td>ImageHeight</td> <td class=c>N</td> <td> </td></tr> -<tr> +<tr class=b> <td class=r title='8 = 0x8'>8</td> <td>Planes</td> <td class=c>N</td> <td> </td></tr> -<tr class=b> +<tr> <td class=r title='10 = 0xa'>10</td> <td>BitDepth</td> <td class=c>N</td> <td> </td></tr> </table></td></tr></table></blockquote> +<h2><a name='Extra'>BMP Extra Tags</a></h2> +<p>Extra information extracted from some BMP images.</p> +<blockquote> +<table class=frame><tr><td> +<table class=inner cellspacing=1> +<tr class=h><th>Tag Name</th> +<th>Writable</th><th>Values / <span class=n>Notes</span></th></tr> +<tr> +<td>EmbeddedJPG</td> +<td class=c>N</td> +<td> </td></tr> +<tr class=b> +<td>EmbeddedPNG</td> +<td class=c>N</td> +<td> </td></tr> +<tr> +<td>ICC_Profile</td> +<td class=c>-</td> +<td>--> <a href='ICC_Profile.html'>ICC_Profile Tags</a></td></tr> +<tr class=b> +<td>LinkedProfileName</td> +<td class=c>N</td> +<td> </td></tr> +</table></td></tr></table></blockquote> + <hr> (This document generated automatically by Image::ExifTool::BuildTagLookup) -<br><i>Last revised Jan 21, 2010</i> +<br><i>Last revised Dec 7, 2016</i> <p class=lf><a href='index.html'><-- ExifTool Tag Names</a></p> </body> </html> diff --git a/html/TagNames/FujiFilm.html b/html/TagNames/FujiFilm.html index 40061816..8802d671 100644 --- a/html/TagNames/FujiFilm.html +++ b/html/TagNames/FujiFilm.html @@ -138,12 +138,15 @@ necessarily correspond to the camera body number -- this needs to be checked)</s <td>FujiFlashMode</td> <td class=c>int16u</td> <td><table class=cols><tr> - <td>0 = Auto - <br>1 = On - <br>2 = Off</td><td> </td> - <td>3 = Red-eye reduction - <br>4 = External - <br>16 = Commander</td></tr></table> + <td>0x0 = Auto + <br>0x1 = On + <br>0x2 = Off + <br>0x3 = Red-eye reduction + <br>0x4 = External + <br>0x10 = Commander + <br>0xa920 = 1st Curtain (front) + <br>0xc920 = 2nd Curtain (rear) + <br>0xe920 = High Speed Sync (HSS)</td></tr></table> </td></tr> <tr class=b> <td title='0x1011 = 4113'>0x1011</td> @@ -858,7 +861,7 @@ RAF-format information.</p> <hr> (This document generated automatically by Image::ExifTool::BuildTagLookup) -<br><i>Last revised Nov 21, 2016</i> +<br><i>Last revised Dec 6, 2016</i> <p class=lf><a href='index.html'><-- ExifTool Tag Names</a></p> </body> </html> diff --git a/html/TagNames/Sony.html b/html/TagNames/Sony.html index d4db66ee..6c9dfc95 100644 --- a/html/TagNames/Sony.html +++ b/html/TagNames/Sony.html @@ -4693,8 +4693,9 @@ multi-frame noise reduction)</span></span></td></tr> </tr><tr><td>50492</td><td>= Sigma 24-105mm F4 DG OS HSM | A 013 + MC-11</td> </tr><tr><td>50493</td><td>= Sigma 17-70mm F2.8-4 DC MACRO OS HSM | C 013 + MC-11</td> </tr><tr><td>50495</td><td>= Sigma 50-100mm F1.8 DC HSM | A 016 + MC-11</td> +</tr><tr><td>50992</td><td>= Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III</td> </tr><tr><td>50993</td><td>= Voigtlander HELIAR-HYPER WIDE 10mm F5.6</td> -</tr><tr><td>50994</td><td>= Voigtlander HELIAR-HYPER WIDE 12mm F5.6 III Aspherical</td> +</tr><tr><td>50994</td><td>= Voigtlander ULTRA WIDE-HELIAR 12mm F5.6 III</td> </tr></table></td></tr></table></blockquote> <h2><a name='CameraSettingsUnknown'>Sony CameraSettingsUnknown Tags</a></h2> @@ -10298,7 +10299,7 @@ the JPEG image from a PMP file)</span></span></td></tr> <hr> (This document generated automatically by Image::ExifTool::BuildTagLookup) -<br><i>Last revised Nov 23, 2016</i> +<br><i>Last revised Dec 19, 2016</i> <p class=lf><a href='index.html'><-- ExifTool Tag Names</a></p> </body> </html> diff --git a/html/exiftool_pod.html b/html/exiftool_pod.html index 6a40cddb..0983c2f8 100644 --- a/html/exiftool_pod.html +++ b/html/exiftool_pod.html @@ -914,7 +914,7 @@ are ignored. For example, this format file:</p> exiftool -p test.fmt a.jpg b.jpg</pre> <p>produces output like this:</p> <pre> - -- Generated by ExifTool 10.36 -- + -- Generated by ExifTool 10.37 -- File: a.jpg - 2003:10:31 15:44:19 (f/5.6, 1/60s, ISO 100) File: b.jpg - 2006:05:23 11:57:38 @@ -1624,11 +1624,12 @@ for more details about optional libraries).</p> option is equivalent to writing a value to the <code>Geotag</code> tag. After the <strong>-geotag</strong> option has been specified, the value of the <code>Geotime</code> tag is written to define a date/time for the position interpolation. If <code>Geotime</code> -is not specified, the value is copied from <code>DateTimeOriginal</code>. For -example, the following two commands are equivalent:</p> +is not specified, the value is copied from <code>DateTimeOriginal#</code> (the <code>#</code> is +added to copy the unformatted value, avoiding potential conflicts with the +<strong>-d</strong> option). For example, the following two commands are equivalent:</p> <pre> exiftool -geotag track.log image.jpg - exiftool -geotag "-Geotime<DateTimeOriginal" image.jpg</pre> + exiftool -geotag track.log "-Geotime<DateTimeOriginal#" image.jpg</pre> <p>When the <code>Geotime</code> value is converted to UTC, the local system timezone is assumed unless the date/time value contains a timezone. Writing <code>Geotime</code> causes the following tags to be written (provided they can be calculated diff --git a/html/geotag.html b/html/geotag.html index 62450088..b082491d 100644 --- a/html/geotag.html +++ b/html/geotag.html @@ -192,8 +192,8 @@ DateTimeOriginal, CreateDate, ModifyDate, FileModifyDate</li> position is calculated (by interpolating between fixes in the GPS track log). Unless a group is specified, exiftool writes the generated tags to the default groups. If a value for <code>Geotime</code> is not given, it is taken from -<code>DateTimeOriginal</code> for each image (as if -<code>"-Geotime<DateTimeOriginal"</code> had been specified), but the value +unformatted value of <code>DateTimeOriginal</code> for each image (as if +<code>"-Geotime<DateTimeOriginal#"</code> had been specified), but the value may be copied from any other date/time tag or set directly from a date/time string.</p> @@ -216,7 +216,7 @@ lines illustrating various aspects of the geotagging feature.</p> <blockquote class=lt><i>Programmers: Note that <code>Geotime</code> must always be specified when geotagging via the API -- the default value of -<code>DateTimeOriginal</code> is implemented by the application.</i> +<code>DateTimeOriginal#</code> is implemented by the application.</i> </blockquote> <a name="Examples"></a> @@ -224,8 +224,9 @@ be specified when geotagging via the API -- the default value of <p>Geotag all images in the "c:\images" directory from position information in a GPS track log ("c:\gps logs\track.log"). Since the <code>Geotime</code> time is -not specified, the value of <code>DateTimeOriginal</code> is used. Local system -time is assumed unless <code>DateTimeOriginal</code> contains a timezone:</p> +not specified, the value of <code>DateTimeOriginal#</code> is used. Local +system time is assumed unless <code>DateTimeOriginal#</code> contains a +timezone:</p> <pre>exiftool -geotag "c:\gps logs\track.log" c:\images</pre> @@ -654,7 +655,7 @@ forum post</a> for more useful tips about creating KML files.</p> <hr> <i>Created Apr. 2, 2009</i><br> -<i>Last revised Nov. 23, 2016</i> +<i>Last revised Dec. 6, 2016</i> <p class='lf'><a href="index.html"><-- Back to ExifTool home page</a></p> </body> </html> diff --git a/html/history.html b/html/history.html index 726832a6..9ad53f19 100644 --- a/html/history.html +++ b/html/history.html @@ -17,6 +17,19 @@ considered development releases, and are not uploaded to <a href="http://search. <!-- Use line width of 80 --> <!-- *********************************************************************** --> +<a name='v10.37'><b>Dec. 19, 2016 - Version 10.37</b></a> +<ul> +<li>Decode more information from BMP V4 and V5 images +<li>Added a few new FujiFlashMode values (thanks Albert Shan) +<li>Changed -geotime default to use unconverted value of DateTimeOriginal +<li>Changed a couple of Sony Voigtlander LensType strings (thanks Jos Roost) +<li>Warn about invalid TAG name +<li>Generate default-language version of QuickTime tags even if the same-named + tag already exists in another group +<li>Fixed bug reading some Photoshop layer information +<li>Fixed problems in sample config file time_zone.config (thanks Hayo Baan) +</ul> + <a name='v10.36'><b>Nov. 24, 2016 - Version 10.36</b></a> <span class=grn>(production release)</span> <ul> <li>Added 3D Studio MAX files to the list of supported file types diff --git a/html/index.html b/html/index.html index 5b9d6eac..ffbd9593 100644 --- a/html/index.html +++ b/html/index.html @@ -74,9 +74,9 @@ span.sup { font-size: 0.8em; font-weight: normal; position: relative; top </div> <blockquote><table class='dl lg'><tr><td><b> -<a href="http://sourceforge.net/projects/exiftool/files/Image-ExifTool-10.36.tar.gz/download"> -Download Version 10.36</a> (4.0 MB) - -<a href="history.html">Nov. 24, 2016</a></b></td></tr></table></blockquote> +<a href="http://sourceforge.net/projects/exiftool/files/Image-ExifTool-10.37.tar.gz/download"> +Download Version 10.37</a> (4.0 MB) - +<a href="history.html">Dec. 19, 2016</a></b></td></tr></table></blockquote> <p><b>ExifTool is a platform-independent <a href="ExifTool.html">Perl library</a> plus a <a href="exiftool_pod.html">command-line application</a> for @@ -127,8 +127,8 @@ distribution above.)</i></p> <blockquote><table class='dl lg'><tr><td><b> <a name="alone">Windows Executable:</a> -<a href="http://sourceforge.net/projects/exiftool/files/exiftool-10.36.zip/download"> - exiftool-10.36.zip</a> (5.8 MB)</b></td></tr></table></blockquote> +<a href="http://sourceforge.net/projects/exiftool/files/exiftool-10.37.zip/download"> + exiftool-10.37.zip</a> (5.8 MB)</b></td></tr></table></blockquote> <p><b>The stand-alone Windows executable</b> does not require Perl. Just download and un-zip the archive then double-click on @@ -140,7 +140,7 @@ of Windows.</p> <blockquote><table class='dl lg'><tr><td><b> Mac OS X Package: <a href="http://sourceforge.net/projects/exiftool/files/ExifTool-9.70.dmg/download"> - ExifTool-10.36.dmg</a> (2.6 MB)</b></td></tr></table></blockquote> + ExifTool-10.37.dmg</a> (2.6 MB)</b></td></tr></table></blockquote> <p><b>The OS X package</b> installs the ExifTool command-line application and libraries in /usr/local/bin. After installing, type "<code>exiftool</code>" in @@ -1106,7 +1106,7 @@ binary data. The simple script above does not handle this case.</p> <li><a href="faq.html">ExifTool FAQ</a></li> <li><a href="https://sourceforge.net/p/exiftool/discussion/">ExifTool Forum</a></li> <li><a href="TagNames/index.html">ExifTool Tag Names</a></li> -<li><a href="history.html">Nov. 24, 2016</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/rss.xml">RSS feed</a>)</li> +<li><a href="history.html">Dec. 19, 2016</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/rss.xml">RSS feed</a>)</li> <li><a href="exiftool_pod.html">exiftool Application Documentation</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/exiftool_pod.pdf">download in PDF format</a>)</li> <li><a href="ExifTool.html">Image::ExifTool API Documentation</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/ExifTool.pdf">download in PDF format</a>)</li> <li><a href="Shift.html">Date/Time Shift Module</a> (<a href="http://owl.phy.queensu.ca/~phil/exiftool/Shift.pdf">download in PDF format</a>)</li> diff --git a/html/install.html b/html/install.html index 8a790f7d..7c098416 100644 --- a/html/install.html +++ b/html/install.html @@ -55,10 +55,10 @@ documentation or some other files of the full distribution.</p> <h3>Stand-Alone Executable</h3> <ol> <li><b>Download</b> the <b>Windows Executable</b> from the <a href="index.html">ExifTool home page</a>. -<br><span class=lt>(The file you download will have a name like "<code>exiftool-10.36.zip</code>".)</span></li> +<br><span class=lt>(The file you download will have a name like "<code>exiftool-10.37.zip</code>".)</span></li> <li><b>Extract "<code>exiftool(-k).exe</code>"</b> from the "<code>.zip</code>" file, and place it <b>on your Desktop</b>. -<br><span class=lt>(Double-click on "<code>exiftool-10.36.zip</code>" to open +<br><span class=lt>(Double-click on "<code>exiftool-10.37.zip</code>" to open the archive, then drag "<code>exiftool(-k).exe</code>" to your Desktop.)</span></li> </ol> <p>You can now double-click on "<code>exiftool(-k).exe</code>" to read the @@ -106,7 +106,7 @@ can be downloaded from <a href="http://www.activestate.com/activeperl/">activeperl.com</a>.)</p> <ol> <li><b>Download</b> the <b>Image-ExifTool distribution</b> from the <a href="index.html">ExifTool home page</a> -<br><span class=lt>(The file you download will have a name like "<code>Image-ExifTool-10.36.tar.gz</code>".)</span></li> +<br><span class=lt>(The file you download will have a name like "<code>Image-ExifTool-10.37.tar.gz</code>".)</span></li> <li><b>Extract the ExifTool files</b> from the archive. <br><span class=lt>(The archive is a gzipped tar file, and can be opened with various Windows utilities, including WinZip.)</span></li> @@ -148,7 +148,7 @@ in the OS X package. Both versions run natively on PPC and Intel Macs.</p> <h3>OS X Package</h3> <ol> <li><b>Download</b> the <b>ExifTool OS X Package</b> from the <a href="index.html">ExifTool home page</a>. -<br><span class=lt>(The file you download will have a name like "<code>ExifTool-10.36.dmg</code>".)</span></li> +<br><span class=lt>(The file you download will have a name like "<code>ExifTool-10.37.dmg</code>".)</span></li> <li><b>Install</b> as a normal <b>OS X package</b>. <br><span class=lt>(Open the disk image, double-click on the install package, and follow the instructions.) </span></li> @@ -163,12 +163,12 @@ in the OS X package. Both versions run natively on PPC and Intel Macs.</p> <ol> <li><b>Download</b> the <b>Image-ExifTool distribution</b> from the <a href="index.html">ExifTool home page</a> to your Desktop. -<br><span class=lt>(The file you download will have a name like "<code>Image-ExifTool-10.36.tar.gz</code>".)</span></li> +<br><span class=lt>(The file you download will have a name like "<code>Image-ExifTool-10.37.tar.gz</code>".)</span></li> <li><b>Launch</b> the <b>Terminal</b> application from the Utilities folder in your Applications folder.</li> <li>In the Terminal window, <b>type the following</b>: <pre class='code'> cd ~/Desktop - tar -xzf Image-ExifTool-10.36.tar.gz - cd Image-ExifTool-10.36 + tar -xzf Image-ExifTool-10.37.tar.gz + cd Image-ExifTool-10.37 sudo cp -r exiftool lib /usr/local/bin </pre> <span class=lt>(Note: The last step above will require you to enter your @@ -184,7 +184,7 @@ your Perl version. If both sets of libraries exist, /usr/local/bin/lib takes precedence for exiftool, but /Library/Perl/#.#.# is the default for any other Perl scripts.</li> <li>In OS X 10.8 or later, you may see this message when you try to open the install package: -<blockquote class=red>"ExifTool-10.36.pkg" can't be opened because it is from an +<blockquote class=red>"ExifTool-10.37.pkg" can't be opened because it is from an unidentified developer.</blockquote> The solution is to control-click on the pkg then select "Open" from the pop-up menu instead of just double-clicking. An alternative is to lower the security settings by changing "Allow applications downloaded from" to @@ -210,11 +210,11 @@ have the wrong "<code>lib</code>" folder.</li> <ol> <li><b>Download</b> the <b>Image-ExifTool distribution</b> from the <a href="index.html">ExifTool home page</a> -<br><span class=lt>(The file you download will have a name like "<code>Image-ExifTool-10.36.tar.gz</code>".)</span></li> +<br><span class=lt>(The file you download will have a name like "<code>Image-ExifTool-10.37.tar.gz</code>".)</span></li> <li><b>Unpack the distribution</b> and <b>make it your current directory</b> by typing: <pre class='code'> cd <i><your download directory></i> - gzip -dc Image-ExifTool-10.36.tar.gz | tar -xf - - cd Image-ExifTool-10.36 + gzip -dc Image-ExifTool-10.37.tar.gz | tar -xf - + cd Image-ExifTool-10.37 </pre> <span class=lt>(At this point you may run exiftool by typing "<code>exiftool <i><image file name></i></code>".)</span></li> diff --git a/html/under.html b/html/under.html index c36d30a3..b6a4539f 100644 --- a/html/under.html +++ b/html/under.html @@ -58,9 +58,12 @@ translate numbers into words for better readability. The <code>-lang</code> <code>-c</code> and <code>-d</code> (CoordFormat and DateFormat) options specify this formatting for GPS coordinates and date/time values.</li></ol> -<ol start=2><li>The "<b>ValueConv</b>" value is a numerical value, suitable for -use in calculations. Typically, this value is converted to standard units (eg. -degrees, meters, or seconds) to make calculations simpler. This value is +<ol start=2><li>For numerical values, the "<b>ValueConv</b>" value is a +machine-readable value suitable for use in calculations, typically converted to +standard units (eg. degrees, meters, or seconds). For date/time values the +standard EXIF date/time format is used ("YYYY:mm:dd HH:MM:SS" plus decimal +seconds and time zone of they exist). For tags which are a closed choice of +string, this is the stored value of the string. The ValueConv value is returned for all tags when the <code>-n</code> option is used, or for individual tags by suffixing the tag name with a <code>#</code> character.</li></ol> @@ -82,13 +85,19 @@ gives the format of this binary data for writable tags.</li></ol> <blockquote><table class=norm> <tr><th>Tag</th><th>3. PrintConv</th><th>2. ValueConv</th><th>1. Raw</th><th>0. Binary</th></tr> -<tr align='center'><td>Orientation</td><td>Horizontal (normal)</td><td>1</td><td>1</td><td><pre>00 01</pre></td></tr> -<tr align='center'><td>GPSLatitude</td><td>45 deg 20' 11.00"</td><td>45.3363888888889</td><td>45 20 11<br>(45/1 20/1 11/1)</td> +<tr align='center'><td>EXIF:Orientation</td><td>Horizontal (normal)</td><td>1</td><td>1</td><td><pre>00 01</pre></td></tr> +<tr align='center'><td>EXIF:GPSLatitude</td><td>45 deg 20' 11.00"</td><td>45.3363888888889</td><td>45 20 11<br>(45/1 20/1 11/1)</td> <td><pre>00 00 00 2d 00 00 00 01<br>00 00 00 14 00 00 00 01<br>00 00 00 0b 00 00 00 01</pre></td></tr> -<tr align='center'><td>ExposureTime</td><td>1/30</td><td>0.03333333333</td><td>0.03333333333<br>(1/30)</td> +<tr align='center'><td>XMP:GPSLatitude</td><td>45 deg 20' 11.00"</td><td>45.3363888888889</td><td>45,20.183333N</td> + <td>"45,20.183333N"</td></tr> +<tr align='center'><td>EXIF:ExposureTime</td><td>1/30</td><td>0.03333333333</td><td>0.03333333333<br>(1/30)</td> <td><pre>00 00 00 01 00 00 00 1e</pre></td></tr> -<tr align='center'><td>ShutterSpeedValue</td><td>1/30</td><td>0.0333333334629176</td><td>4.90689059<br>(19868/4049)</td> +<tr align='center'><td>EXIF:ShutterSpeedValue</td><td>1/30</td><td>0.0333333334629176</td><td>4.90689059<br>(19868/4049)</td> <td><pre>00 00 4d 9c 00 00 0f d1</pre></td></tr> +<tr align='center'><td>EXIF:ModifyDate</td><td>(set by <code>-d</code> option)</td><td>2016:11:25 11:56:39</td><td>2016:11:25 11:56:39</td> + <td>"2016:11:25 11:56:39\0"</td></tr> +<tr align='center'><td>XMP:ModifyDate</td><td>(set by <code>-d</code> option)</td><td>2016:11:25 11:56:39.00-05:00</td><td>2016-11-25T11:56:39.00-05:00</td> + <td>"2016-11-25T11:56:39.00-05:00"</td></tr> </table></blockquote> <a name="philophies"></a> @@ -122,7 +131,7 @@ which have helped to influence the overall development:</p> <hr> <i>Created Jun. 24, 2009</i><br> -<i>Last revised Dec. 24, 2013</i> +<i>Last revised Nov. 25, 2016</i> <p class='lf'><a href="index.html"><-- Back to ExifTool home page</a></p> </body> </html> diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm index 5aa20003..0b3ccf85 100644 --- a/lib/Image/ExifTool.pm +++ b/lib/Image/ExifTool.pm @@ -27,7 +27,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd %jpegMarker %specialTags); -$VERSION = '10.36'; +$VERSION = '10.37'; $RELEASE = ''; @ISA = qw(Exporter); %EXPORT_TAGS = ( @@ -129,14 +129,14 @@ sub ReadValue($$$$$;$); # unless tweaked in BuildTagLookup::GetTableOrder(). @loadAllTables = qw( PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw - SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BPG BPG::Extensions PICT PNG - MNG FLIF DjVu DPX OpenEXR MIFF PGF PSP PhotoCD Radiance PDF PostScript - Photoshop::Header Photoshop::Layers Photoshop::ImageData FujiFilm::RAF - FujiFilm::IFD Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 - FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio - MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile Matroska MOI MXF - DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile RIFF AIFF ASF - DICOM MIE HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE + SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions + PICT PNG MNG FLIF DjVu DPX OpenEXR MIFF PGF PSP PhotoCD Radiance PDF + PostScript Photoshop::Header Photoshop::Layers Photoshop::ImageData + FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD + Sony::PMP ITC ID3 FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible + MPC MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile + Matroska MOI MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile + RIFF AIFF ASF DICOM MIE HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF EXE::ELF EXE::AR EXE::CHM LNK Font VCard VCard::VCalendar RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork ISO FLIR::AFF FLIR::FPF diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod index cfc3d847..d077d667 100644 --- a/lib/Image/ExifTool.pod +++ b/lib/Image/ExifTool.pod @@ -1032,6 +1032,11 @@ created in the destination file as required to store the specified information. May be called repeatedly to write the same information to additional files without the need to call L</SetNewValue> again. +Note that it is NOT necessary to call L</ExtractInfo> or L</ImageInfo> +before L</WriteInfo>. L</WriteInfo> changes only metadata specified by +previous calls to L</SetNewValue>. + + # add information to a source file, writing output to new file $exifTool->WriteInfo($srcfile, $dstfile); diff --git a/lib/Image/ExifTool/BMP.pm b/lib/Image/ExifTool/BMP.pm index cfe46401..39488b96 100644 --- a/lib/Image/ExifTool/BMP.pm +++ b/lib/Image/ExifTool/BMP.pm @@ -7,6 +7,7 @@ # # References: 1) http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html # 2) http://www.fourcc.org/rgb.php +# 3) https://msdn.microsoft.com/en-us/library/dd183381(v=vs.85).aspx #------------------------------------------------------------------------------ package Image::ExifTool::BMP; @@ -15,7 +16,21 @@ use strict; use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.08'; +$VERSION = '1.09'; + +# conversions for fixed-point 2.30 format values +my %fixed2_30 = ( + ValueConv => q{ + my @a = split ' ', $val; + $_ /= 0x40000000 foreach @a; + "@a"; + }, + PrintConv => q{ + my @a = split ' ', $val; + $_ = sprintf('%.6f', $_) foreach @a; + "@a"; + }, +); # BMP chunks %Image::ExifTool::BMP::Main = ( @@ -25,13 +40,21 @@ $VERSION = '1.08'; There really isn't much meta information in a BMP file as such, just a bit of image related information. }, - # 0 => size of bitmap structure: - # 12 bytes => 'OS/2 V1', - # 40 bytes => 'Windows V3', - # 64 bytes => 'OS/2 V2', - # 68 bytes => some bitmap structure in AVI videos - # 108 bytes => 'Windows V4', - # 124 bytes => 'Windows V5', + 0 => { + Name => 'BMPVersion', + Format => 'int32u', + Notes => q{ + this is actually the size of the BMP header, but used to determine the BMP + version + }, + RawConv => '$$self{BMPVersion} = $val', + PrintConv => { + 40 => 'Windows V3', + 68 => 'AVI BMP structure?', #PH (seen in AVI movies from some Casio and Nikon cameras) + 108 => 'Windows V4', + 124 => 'Windows V5', + }, + }, 4 => { Name => 'ImageWidth', Format => 'int32u', @@ -44,6 +67,7 @@ $VERSION = '1.08'; 12 => { Name => 'Planes', Format => 'int16u', + # values: 0,1,4,8,16,24,32 }, 14 => { Name => 'BitDepth', @@ -52,6 +76,7 @@ $VERSION = '1.08'; 16 => { Name => 'Compression', Format => 'int32u', + RawConv => '$$self{BMPCompression} = $val', # (formatted as string[4] for some values in AVI images) ValueConv => '$val > 256 ? unpack("A4",pack("V",$val)) : $val', PrintConv => { @@ -73,6 +98,7 @@ $VERSION = '1.08'; 20 => { Name => 'ImageLength', Format => 'int32u', + RawConv => '$$self{BMPImageLength} = $val', }, 24 => { Name => 'PixelsPerMeterX', @@ -90,8 +116,99 @@ $VERSION = '1.08'; 36 => { Name => 'NumImportantColors', Format => 'int32u', + Hook => '$varSize += $size if $$self{BMPVersion} == 68', # (the rest is invalid for AVI BMP's) PrintConv => '$val ? $val : "All"', }, + 40 => { + Name => 'RedMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 44 => { + Name => 'GreenMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 48 => { + Name => 'BlueMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 52 => { + Name => 'AlphaMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 56 => { + Name => 'ColorSpace', + Format => 'undef[4]', + RawConv => '$$self{BMPColorSpace} = $val =~ /\0/ ? Get32u(\$val, 0) : pack("N",unpack("V",$val))', + PrintConv => { + 0 => 'Calibrated RGB', + 1 => 'Device RGB', + 2 => 'Device CMYK', + LINK => 'Linked Color Profile', + MBED => 'Embedded Color Profile', + sRGB => 'sRGB', + 'Win ' => 'Windows Color Space', + }, + }, + 60 => { + Name => 'RedEndpoint', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'int32u[3]', + %fixed2_30, + }, + 72 => { + Name => 'GreenEndpoint', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'int32u[3]', + %fixed2_30, + }, + 84 => { + Name => 'BlueEndpoint', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'int32u[3]', + %fixed2_30, + }, + 96 => { + Name => 'GammaRed', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'fixed32u', + }, + 100 => { + Name => 'GammaGreen', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'fixed32u', + }, + 104 => { + Name => 'GammaBlue', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'fixed32u', + }, + 108 => { + Name => 'RenderingIntent', + Format => 'int32u', + PrintConv => { + 1 => 'Graphic (LCS_GM_BUSINESS)', + 2 => 'Proof (LCS_GM_GRAPHICS)', + 4 => 'Picture (LCS_GM_IMAGES)', + 8 => 'Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)', + }, + }, + 112 => { + Name => 'ProfileDataOffset', + Condition => '$$self{BMPColorSpace} eq "LINK" or $$self{BMPColorSpace} eq "MBED"', + Format => 'int32u', + RawConv => '$$self{BMPProfileOffset} = $val', + }, + 116 => { + Name => 'ProfileSize', + Condition => '$$self{BMPColorSpace} eq "LINK" or $$self{BMPColorSpace} eq "MBED"', + Format => 'int32u', + RawConv => '$$self{BMPProfileSize} = $val', + }, + # 120 - reserved ); # OS/2 12-byte bitmap header (ref http://www.fileformat.info/format/bmp/egff.htm) @@ -99,13 +216,37 @@ $VERSION = '1.08'; PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, NOTES => 'Information extracted from OS/2-format BMP images.', - # 0 => size of bitmap structure (12) + 0 => { + Name => 'BMPVersion', + Format => 'int32u', + Notes => 'again, the header size is used to determine the BMP version', + PrintConv => { + 12 => 'OS/2 V1', + 64 => 'OS/2 V2', + }, + }, 4 => { Name => 'ImageWidth', Format => 'int16u' }, 6 => { Name => 'ImageHeight', Format => 'int16u' }, 8 => { Name => 'Planes', Format => 'int16u' }, 10 => { Name => 'BitDepth', Format => 'int16u' }, ); +%Image::ExifTool::BMP::Extra = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => 'Extra information extracted from some BMP images.', + VARS => { NO_ID => 1 }, + LinkedProfileName => { }, + ICC_Profile => { SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' } }, + EmbeddedJPG => { + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + EmbeddedPNG => { + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + #------------------------------------------------------------------------------ # Extract EXIF information from a BMP image # Inputs: 0) ExifTool object reference, 1) dirInfo reference @@ -121,20 +262,57 @@ sub ProcessBMP($$) return 0 unless $buff =~ /^BM/; SetByteOrder('II'); my $len = Get32u(\$buff, 14); - return 0 unless $len == 12 or $len >= 40; + # len = v1:12, v4:108, v5:124 + return 0 unless $len == 12 or $len == 16 or ($len >= 40 and $len < 1000000); return 0 unless $raf->Seek(-4, 1) and $raf->Read($buff, $len) == $len; $et->SetFileType(); # set the FileType tag +# +# process the BMP header +# my %dirInfo = ( DataPt => \$buff, DirStart => 0, DirLen => length($buff), ); - if ($len == 12) { # old OS/2 format BMP + if ($len == 12 or $len == 16 or $len == 64) { # old OS/2 format BMP $tagTablePtr = GetTagTable('Image::ExifTool::BMP::OS2'); } else { $tagTablePtr = GetTagTable('Image::ExifTool::BMP::Main'); } $et->ProcessDirectory(\%dirInfo, $tagTablePtr); +# +# extract any embedded images +# + my $extraTable = GetTagTable('Image::ExifTool::BMP::Extra'); + if ($$et{BMPCompression} and $$et{BMPImageLength} and + ($$et{BMPCompression} == 4 or $$et{BMPCompression} == 5)) + { + my $tag = $$et{BMPCompression} == 4 ? 'EmbeddedJPG' : 'EmbeddedPNG'; + my $val = $et->ExtractBinary($raf->Tell(), $$et{BMPImageLength}, $tag); + if ($val) { + $et->HandleTag($extraTable, $tag, $val); + } + } +# +# process profile data if it exists (v5 header only) +# + if ($len == 124 and $$et{BMPProfileOffset}) { + my $pos = $$et{BMPProfileOffset} + 14; # (note the 14-byte shift!) + my $size = $$et{BMPProfileSize}; + if ($raf->Seek($pos, 0) and $raf->Read($buff, $size) == $size) { + my $tag; + if ($$et{BMPColorSpace} eq 'LINK') { + $buff =~ s/\0+$//; # remove null terminator(s) + $buff = $et->Decode($buff, 'Latin'); # convert from Latin + $tag = 'LinkedProfileName'; + } else { + $tag = 'ICC_Profile'; + } + $et->HandleTag($extraTable, $tag => $buff, Size => $size, DataPos => $pos); + } else { + $et->Warn('Error loading profile data', 1); + } + } return 1; } @@ -168,6 +346,10 @@ under the same terms as Perl itself. =item L<http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html> +=item L<http://www.fourcc.org/rgb.php> + +=item L<https://msdn.microsoft.com/en-us/library/dd183381(v=vs.85).aspx> + =back =head1 SEE ALSO diff --git a/lib/Image/ExifTool/FujiFilm.pm b/lib/Image/ExifTool/FujiFilm.pm index ca9579e1..669a9d5b 100644 --- a/lib/Image/ExifTool/FujiFilm.pm +++ b/lib/Image/ExifTool/FujiFilm.pm @@ -16,6 +16,7 @@ # 7) Kai Lappalainen private communication # 8) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5223.0.html # 9) Zilvinas Brobliauskas private communication +# 10) Albert Shan private communication # IB) Iliah Borg private communication (LibRaw) # JD) Jens Duttke private communication #------------------------------------------------------------------------------ @@ -27,7 +28,7 @@ use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; -$VERSION = '1.54'; +$VERSION = '1.55'; sub ProcessFujiDir($$$); sub ProcessFaceRec($$$); @@ -219,6 +220,7 @@ my %faceCategories = ( 0x1010 => { Name => 'FujiFlashMode', Writable => 'int16u', + PrintHex => 1, PrintConv => { 0 => 'Auto', 1 => 'On', @@ -226,6 +228,9 @@ my %faceCategories = ( 3 => 'Red-eye reduction', 4 => 'External', #JD 16 => 'Commander', + 0xa920 => '1st Curtain (front)', #10 (EF-X500 flash) + 0xc920 => '2nd Curtain (rear)', #10 + 0xe920 => 'High Speed Sync (HSS)', #10 }, }, 0x1011 => { diff --git a/lib/Image/ExifTool/Photoshop.pm b/lib/Image/ExifTool/Photoshop.pm index 1cbf3f13..0d39d734 100644 --- a/lib/Image/ExifTool/Photoshop.pm +++ b/lib/Image/ExifTool/Photoshop.pm @@ -28,7 +28,7 @@ use strict; use vars qw($VERSION $AUTOLOAD $iptcDigestInfo); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.50'; +$VERSION = '1.51'; sub ProcessPhotoshop($$$); sub WritePhotoshop($$$); @@ -617,17 +617,20 @@ sub ProcessLayers($$$) $raf->Read($data, $n) == $n or return 0; my $tot = $psb ? Get64u(\$data, 0) : Get32u(\$data, 0); # length of layer and mask info my $len = $psb ? Get64u(\$data, $psiz) : Get32u(\$data, $psiz); # length of layer info section - $et->VerboseDir('Layers', 0, $len); - my $num = Get16u(\$data, $psiz * 2); + my $num = Get16s(\$data, $psiz * 2); $num = -$num if $num < 0; # (first channel is transparency data if negative) $et->HandleTag($tagTablePtr, _xcnt => $num); # LayerCount return 0 if $len > 100000000; # set a reasonable limit on maximum size + $et->VerboseDir('Layers', $num, $len); my $dataPos = $raf->Tell(); # read the layer information data $raf->Read($data, $len) == $len or return 0; + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; my $pos = 0; for ($i=0; $i<$num; ++$i) { + $et->VPrint(0, $oldIndent.'+ [Layer '.($i+1)." of $num]\n"); last if $pos + 18 > $len; # save the layer rectangle $et->HandleTag($tagTablePtr, _xrct => join(' ',ReadValue(\$data, $pos, 'int32u', 4, 16))); @@ -646,7 +649,7 @@ sub ProcessLayers($$$) $n = Get8u(\$data, $pos); # get length of layer name last if $pos + 1 + $n > $len; $et->HandleTag($tagTablePtr, _xnam => substr($data, $pos+1, $n)); # layer name - $n = ($n + 3) & 0xfffffffc; + $n = ($n + 4) & 0xfffffffc; # +1 for length byte then pad to multiple of 4 bytes $pos += $n; # process additional layer info while ($pos + 12 <= $nxt) { @@ -681,6 +684,7 @@ sub ProcessLayers($$$) } $pos = $nxt; } + $$et{INDENT} = $oldIndent; # seek to the end of this section return 0 unless $raf->Seek($dataPos - 2 - $psiz + $tot, 0); return 1; # success! @@ -858,6 +862,8 @@ sub ProcessPSD($$) # read layer and mask information section $dirInfo{RAF} = $raf; $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Layers'); + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; if (ProcessLayers($et, \%dirInfo, $tagTablePtr) and # read compression mode from image data section $raf->Read($data,2) == 2) @@ -869,6 +875,7 @@ sub ProcessPSD($$) $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::ImageData'); $et->ProcessDirectory(\%dirInfo, $tagTablePtr); } + $$et{INDENT} = $oldIndent; # process trailers if they exist my $trailInfo = Image::ExifTool::IdentifyTrailer($raf); $et->ProcessTrailers($trailInfo) if $trailInfo; diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm index 6fddef19..bc1197d3 100644 --- a/lib/Image/ExifTool/QuickTime.pm +++ b/lib/Image/ExifTool/QuickTime.pm @@ -42,7 +42,7 @@ use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; use Image::ExifTool::GPS; -$VERSION = '1.98'; +$VERSION = '1.99'; sub FixWrongFormat($); sub ProcessMOV($$;$); @@ -6617,11 +6617,19 @@ sub ProcessMOV($$;$) # fill in missing defaults for alternate language tags # (the first language is taken as the default) if ($doDefaultLang and $$et{QTLang}) { +QTLang: foreach $tag (@{$$et{QTLang}}) { next unless defined $$et{VALUE}{$tag}; my $langInfo = $$et{TAG_INFO}{$tag} or next; my $tagInfo = $$langInfo{SrcTagInfo} or next; - next if defined $$et{VALUE}{$$tagInfo{Name}}; + my $infoHash = $$et{TAG_INFO}; + my $name = $$tagInfo{Name}; + # loop through all instances of this tag name and generate the default-language + # version only if we don't already have a QuickTime tag with this name + my ($i, $key, $found); + for ($i=0, $key=$name; $$infoHash{$key}; ++$i, $key="$name ($i)") { + next QTLang if $et->GetGroup($key, 0) eq 'QuickTime'; + } $et->FoundTag($tagInfo, $$et{VALUE}{$tag}); } delete $$et{QTLang}; diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm index 407d05dc..0ca0ae29 100644 --- a/lib/Image/ExifTool/Sony.pm +++ b/lib/Image/ExifTool/Sony.pm @@ -31,7 +31,7 @@ use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; use Image::ExifTool::Minolta; -$VERSION = '2.48'; +$VERSION = '2.49'; sub ProcessSRF($$$); sub ProcessSR2($$$); @@ -136,8 +136,9 @@ my %sonyLensTypes2 = ( 50493 => 'Sigma 17-70mm F2.8-4 DC MACRO OS HSM | C 013 + MC-11', #JR 50495 => 'Sigma 50-100mm F1.8 DC HSM | A 016 + MC-11', #JR + 50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR 50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB - 50994 => 'Voigtlander HELIAR-HYPER WIDE 12mm F5.6 III Aspherical', #IB (LensType2 has this value, but unfortunately LensType3 is 50993 for this lens!) + 50994 => 'Voigtlander ULTRA WIDE-HELIAR 12mm F5.6 III', #IB # lenses listed in the Sigma MC-11 list, but not yet seen: # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C 014 + MC-11', @@ -7812,7 +7813,9 @@ my %pictureProfile2010 = ( # 1.40: SEL1635Z, SEL24240, SEL35F14Z, SELP28135G, Zeiss Loxia 35mm/50mm Ver.01, Zeiss Touit Ver.02 # 1.41: SELP18105G Ver.02 # 1.50: SEL28F20, SEL90M28G, Zeiss Batis 18mm/25mm/85mm, Zeiss Loxia 21mm, Zeiss Loxia 35mm/50mm Ver.02 - # 1.60: SEL85F14GM, SEL2470GM, SEL70200GM, SEL50F18F, SEL50F14Z, SEL50M28, SEL70300G, Sigma 30mm F1.4 DC DN, Sigma MC-11 + # 1.60: SEL85F14GM, SEL2470GM, SEL70200GM, SEL50F18F, SEL50F14Z, SEL50M28, SEL70300G, Sigma 30mm F1.4 DC DN, + # Sigma MC-11, Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III + # 1.70: Voigtlander HELIAR-HYPER WIDE 10mm F5.6, ULTRA WIDE-HELIAR 12mm F5.6 III, Zeiss Loxia 85mm }, 0x0015 => { Name => 'LensFirmwareVersion', diff --git a/lib/Image/ExifTool/TagInfoXML.pm b/lib/Image/ExifTool/TagInfoXML.pm index 13a6d207..6a42be1d 100644 --- a/lib/Image/ExifTool/TagInfoXML.pm +++ b/lib/Image/ExifTool/TagInfoXML.pm @@ -109,7 +109,7 @@ sub Write(;$$%) $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST}; my @keys = sort NumbersFirst TagTableKeys($table); $numbersFirst = 1; - # loop throug all tag ID's in this table + # loop through all tag ID's in this table foreach $tagID (@keys) { my @infoArray = GetTagInfoList($table, $tagID); my $xmlID = Image::ExifTool::XMP::FullEscapeXML($tagID); diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm index 85a15dfc..ce1bdf46 100644 --- a/lib/Image/ExifTool/TagLookup.pm +++ b/lib/Image/ExifTool/TagLookup.pm @@ -5460,6 +5460,7 @@ my %tagExists = ( 'alphafiltering' => 1, 'alphaidentifiers' => 1, 'alphainterlace' => 1, + 'alphamask' => 1, 'alphaoffset' => 1, 'alphapreprocessing' => 1, 'alphasample' => 1, @@ -5679,13 +5680,16 @@ my %tagExists = ( 'blocksperframe' => 1, 'blocksperrow' => 1, 'blueadjust' => 1, + 'blueendpoint' => 1, 'bluegain' => 1, + 'bluemask' => 1, 'bluematrixcolumn' => 1, 'blueprimary' => 1, 'bluesample' => 1, 'bluetrc' => 1, 'bluex' => 1, 'bluey' => 1, + 'bmpversion' => 1, 'boardtemperature' => 1, 'bookname' => 1, 'booktitle' => 1, @@ -6459,6 +6463,8 @@ my %tagExists = ( 'embeddedimagename' => 1, 'embeddedimagetype' => 1, 'embeddedimagewidth' => 1, + 'embeddedjpg' => 1, + 'embeddedpng' => 1, 'embeddedvideofile' => 1, 'embeddedvideotype' => 1, 'emphasis' => 1, @@ -6768,7 +6774,10 @@ my %tagExists = ( 'gaindeadmapimageheight' => 1, 'gaindeadmapimagetype' => 1, 'gaindeadmapimagewidth' => 1, + 'gammablue' => 1, + 'gammagreen' => 1, 'gammainfo' => 1, + 'gammared' => 1, 'gamut' => 1, 'gapless' => 1, 'gdalmetadata' => 1, @@ -6838,7 +6847,9 @@ my %tagExists = ( 'grayresponsecurve' => 1, 'graytrc' => 1, 'greenadjust' => 1, + 'greenendpoint' => 1, 'greengain' => 1, + 'greenmask' => 1, 'greenmatrixcolumn' => 1, 'greenprimary' => 1, 'greensample' => 1, @@ -7271,6 +7282,7 @@ my %tagExists = ( 'linearized' => 1, 'lineorder' => 1, 'lines' => 1, + 'linkedprofilename' => 1, 'linkerversion' => 1, 'linkinfo' => 1, 'linkstatus' => 1, @@ -7998,6 +8010,7 @@ my %tagExists = ( 'profilecmmtype' => 1, 'profileconnectionspace' => 1, 'profilecreator' => 1, + 'profiledataoffset' => 1, 'profiledatetime' => 1, 'profiledescription' => 1, 'profiledescriptionml' => 1, @@ -8008,6 +8021,7 @@ my %tagExists = ( 'profiles' => 1, 'profilesequencedesc' => 1, 'profilesequenceidentifier' => 1, + 'profilesize' => 1, 'profiletype' => 1, 'profileversion' => 1, 'progid' => 1, @@ -8166,8 +8180,10 @@ my %tagExists = ( 'rectangleofinterest' => 1, 'redadjust' => 1, 'redblueflatfield' => 1, + 'redendpoint' => 1, 'redeyedata' => 1, 'redgain' => 1, + 'redmask' => 1, 'redmatrixcolumn' => 1, 'redprimary' => 1, 'redsample' => 1, diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod index a7ff25b7..da003dfe 100644 --- a/lib/Image/ExifTool/TagNames.pod +++ b/lib/Image/ExifTool/TagNames.pod @@ -19636,6 +19636,7 @@ of image related information. Index1 Tag Name Writable ------ -------- -------- + 0 BMPVersion N 4 ImageWidth N 8 ImageHeight N 12 Planes N @@ -19646,6 +19647,20 @@ of image related information. 28 PixelsPerMeterY N 32 NumColors N 36 NumImportantColors N + 40 RedMask N + 44 GreenMask N + 48 BlueMask N + 52 AlphaMask N + 56 ColorSpace N + 60 RedEndpoint N + 72 GreenEndpoint N + 84 BlueEndpoint N + 96 GammaRed N + 100 GammaGreen N + 104 GammaBlue N + 108 RenderingIntent N + 112 ProfileDataOffset N + 116 ProfileSize N =head3 BMP OS2 Tags @@ -19653,11 +19668,23 @@ Information extracted from OS/2-format BMP images. Index1 Tag Name Writable ------ -------- -------- + 0 BMPVersion N 4 ImageWidth N 6 ImageHeight N 8 Planes N 10 BitDepth N +=head3 BMP Extra Tags + +Extra information extracted from some BMP images. + + Tag Name Writable + -------- -------- + EmbeddedJPG N + EmbeddedPNG N + ICC_Profile ICC_Profile + LinkedProfileName N + =head2 BPG Tags The information listed below is extracted from BPG (Better Portable diff --git a/perl-Image-ExifTool.spec b/perl-Image-ExifTool.spec index d38fdd4d..18e7668c 100644 --- a/perl-Image-ExifTool.spec +++ b/perl-Image-ExifTool.spec @@ -1,6 +1,6 @@ Summary: perl module for image data extraction Name: perl-Image-ExifTool -Version: 10.36 +Version: 10.37 Release: 1 License: Artistic/GPL Group: Development/Libraries/Perl diff --git a/t/BMP_2.out b/t/BMP_2.out index af4ad1f6..8752d730 100644 --- a/t/BMP_2.out +++ b/t/BMP_2.out @@ -1,14 +1,15 @@ -[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.93 +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 10.37 [File, System, Image] FileName - File Name: BMP.bmp [File, System, Image] Directory - Directory: t/images [File, System, Image] FileSize - File Size: 1142 bytes [File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:21-05:00 -[File, System, Time] FileAccessDate - File Access Date/Time: 2015:04:18 07:17:35-04:00 -[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2015:03:07 15:31:02-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2016:12:07 08:45:27-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2016:11:24 09:55:16-05:00 [File, System, Image] FilePermissions - File Permissions: rw-r--r-- [File, File, Image] FileType - File Type: BMP [File, File, Image] FileTypeExtension - File Type Extension: bmp [File, File, Image] MIMEType - MIME Type: image/bmp +[File, File, Image] 0 - BMP Version: Windows V3 [File, File, Image] 4 - Image Width: 8 [File, File, Image] 8 - Image Height: 8 [File, File, Image] 12 - Planes: 1 diff --git a/t/Pentax_4.out b/t/Pentax_4.out index 645e3d58..ff214178 100644 --- a/t/Pentax_4.out +++ b/t/Pentax_4.out @@ -1,14 +1,15 @@ -[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 10.02 +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 10.37 [File, System, Image] FileName - File Name: Pentax.avi [File, System, Image] Directory - Directory: t/images [File, System, Image] FileSize - File Size: 1672 bytes [File, System, Time] FileModifyDate - File Modification Date/Time: 2009:10:30 08:10:17-04:00 -[File, System, Time] FileAccessDate - File Access Date/Time: 2015:09:03 13:07:16-04:00 -[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2015:09:03 13:07:16-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2016:12:07 08:45:27-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2016:11:24 09:55:16-05:00 [File, System, Image] FilePermissions - File Permissions: rw-r--r-- [File, File, Image] FileType - File Type: AVI [File, File, Image] FileTypeExtension - File Type Extension: avi [File, File, Image] MIMEType - MIME Type: video/x-msvideo +[File, File, Image] 0 - BMP Version: Windows V3 [File, File, Image] 4 - Image Width: 1280 [File, File, Image] 8 - Image Height: 720 [File, File, Image] 12 - Planes: 1 diff --git a/t/RIFF_3.out b/t/RIFF_3.out index 7e2a8f55..78e0f1ae 100644 --- a/t/RIFF_3.out +++ b/t/RIFF_3.out @@ -1,14 +1,15 @@ -[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 9.93 +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 10.37 [File, System, Image] FileName - File Name: RIFF.avi [File, System, Image] Directory - Directory: t/images [File, System, Image] FileSize - File Size: 1262 bytes [File, System, Time] FileModifyDate - File Modification Date/Time: 2008:09:12 12:04:10-04:00 -[File, System, Time] FileAccessDate - File Access Date/Time: 2015:04:18 07:17:35-04:00 -[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2015:03:07 15:31:28-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2016:12:07 08:45:30-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2016:11:30 08:15:11-05:00 [File, System, Image] FilePermissions - File Permissions: rw-r--r-- [File, File, Image] FileType - File Type: AVI [File, File, Image] FileTypeExtension - File Type Extension: avi [File, File, Image] MIMEType - MIME Type: video/x-msvideo +[File, File, Image] 0 - BMP Version: Windows V3 [File, File, Image] 4 - Image Width: 320 [File, File, Image] 8 - Image Height: 240 [File, File, Image] 12 - Planes: 1 diff --git a/windows_exiftool b/windows_exiftool index 6746fa3e..31e3e31d 100755 --- a/windows_exiftool +++ b/windows_exiftool @@ -12,7 +12,7 @@ use strict; require 5.004; -my $version = '10.36'; +my $version = '10.37'; # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool' my $exeDir; @@ -1202,7 +1202,7 @@ for (;;) { } elsif (/^([-\w]+:)*(geotag|geotime)\b/i) { if (lc $2 eq 'geotag') { if ((not defined $addGeotime or $addGeotime) and length $val) { - $addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal'; + $addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal#'; } } else { $addGeotime = ''; @@ -1229,10 +1229,12 @@ for (;;) { $addGeotime = ''; } } - } elsif (/^-(.*)/) { - push @exclude, $1; } else { - push @tags, $_; + my $lst = s/^-// ? \@exclude : \@tags; + unless (/^([-\w*]+:)*([-\w*?]+)#?$/) { + Warn(qq(Invalid TAG name: $_\n)); + } + push @$lst, $_; # (push everything for backward compatibility) } } } else { @@ -3538,7 +3540,7 @@ sub AddPrintFormat($) #------------------------------------------------------------------------------ # Get suggested file extension based on tag value for binary output -# Inputs: 0) data ref +# Inputs: 0) ExifTool ref, 1) data ref, 2) tag name # Returns: file extension (lower case), or 'dat' if unknown sub SuggestedExtension($$$) { @@ -3567,6 +3569,8 @@ sub SuggestedExtension($$$) $ext = $ext ? lc($ext) : 'raw'; } elsif ($tag eq 'EXIF') { $ext = 'exif'; + } elsif ($tag eq 'ICC_Profile') { + $ext = 'icc'; } elsif ($$valPt =~ /^(MM\0\x2a|II\x2a\0)/) { $ext = 'tiff'; } elsif ($$valPt !~ /^.{0,4096}\0/s) { @@ -4869,7 +4873,7 @@ OPTIONS produces output like this: - -- Generated by ExifTool 10.36 -- + -- Generated by ExifTool 10.37 -- File: a.jpg - 2003:10:31 15:44:19 (f/5.6, 1/60s, ISO 100) File: b.jpg - 2006:05:23 11:57:38 @@ -5573,11 +5577,12 @@ OPTIONS tag. After the -geotag option has been specified, the value of the "Geotime" tag is written to define a date/time for the position interpolation. If "Geotime" is not specified, the value is copied - from "DateTimeOriginal". For example, the following two commands - are equivalent: + from "DateTimeOriginal#" (the "#" is added to copy the unformatted + value, avoiding potential conflicts with the -d option). For + example, the following two commands are equivalent: - exiftool -geotag track.log image.jpg - exiftool -geotag "-Geotime<DateTimeOriginal" image.jpg + exiftool -geotag trk.log image.jpg + exiftool -geotag trk.log "-Geotime<DateTimeOriginal#" image.jpg When the "Geotime" value is converted to UTC, the local system timezone is assumed unless the date/time value contains a timezone. |