exiftool_vendored 12.58.0 → 12.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +25 -0
- data/bin/MANIFEST +3 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +1 -0
- data/bin/exiftool +53 -38
- data/bin/lib/Image/ExifTool/DJI.pm +2 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +27 -9
- data/bin/lib/Image/ExifTool/LIF.pm +10 -2
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +9 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +6 -5
- data/bin/lib/Image/ExifTool/Olympus.pm +87 -7
- data/bin/lib/Image/ExifTool/PNG.pm +15 -2
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +11 -6
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +37 -5
- data/bin/lib/Image/ExifTool/RIFF.pm +39 -11
- data/bin/lib/Image/ExifTool/TagLookup.pm +2251 -2244
- data/bin/lib/Image/ExifTool/TagNames.pod +42 -25
- data/bin/lib/Image/ExifTool/WriteExif.pl +11 -4
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +71 -13
- data/bin/lib/Image/ExifTool/XMP.pm +18 -3
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool.pm +82 -13
- data/bin/lib/Image/ExifTool.pod +40 -5
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a40c897eadb8162344b81eedcedd1888cfac911d28c1e5542f8e3d323af06768
|
|
4
|
+
data.tar.gz: a761f6527a380e369e78c34d2c061a9652ae63a3da0b7e70be1854fb8b728ee6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7edad248448957b58317b1621b2ae5b0c67276ee988ec1fb043403f299d6b0476ab7e79f4a15c345f9c655ff79518235350797b65b4b94cc5f80759511a44759
|
|
7
|
+
data.tar.gz: a4cec80d9709c1145958d4c6590349bdf6b0fc18f041e62962fc736a660d0243a29abc5c68e481198c9b42e584cedc7f1536081c0c59ffd57f90caac704fb0ad
|
data/bin/Changes
CHANGED
|
@@ -7,6 +7,31 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 12.50. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Mar. 28, 2023 - Version 12.59
|
|
11
|
+
|
|
12
|
+
- COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
|
|
13
|
+
to include all data from the SOS to the EOI (including the SOS marker but
|
|
14
|
+
not the EOI marker)
|
|
15
|
+
- Added new -fileNUM option to load tags from alternate files
|
|
16
|
+
- Added family 8 groups for accessing tags from alternate files
|
|
17
|
+
- Added new XMP-et:OriginalImageMD5 tag for storing ImageDataMD5 value
|
|
18
|
+
- Added verbose ImageDataMD5 message for JPEG files
|
|
19
|
+
- Added a new Nikon LensID (thanks Warren Hatch)
|
|
20
|
+
- Decode a new Olympus tag and improved decoding of another (thanks Herb)
|
|
21
|
+
- Decode a couple of new PanasonicRaw tags
|
|
22
|
+
- Decode image coordinates for a couple more VNT object types
|
|
23
|
+
- Enhanced ImageDataMD5 to also support MRW, CR3, PNG, MOV/MP4 and RIFF-based
|
|
24
|
+
files
|
|
25
|
+
- Improved verbose messages when deleting NikonApp trailer
|
|
26
|
+
- Patched to avoid structure warnings when copying tags from Nikon files
|
|
27
|
+
containing NKSC metadata
|
|
28
|
+
- Fixed %-C filename format code to work properly with the -fileOrder and
|
|
29
|
+
-progress options
|
|
30
|
+
- Fixed new ImageDataMD5 tag to work properly with PhaseOne IIQ files
|
|
31
|
+
- Fixed potential ValueConv warning when reading LIF files
|
|
32
|
+
- API Changes:
|
|
33
|
+
- Added SetAlternateFile method
|
|
34
|
+
|
|
10
35
|
Mar. 15, 2023 - Version 12.58
|
|
11
36
|
|
|
12
37
|
- Added Extra ImageDataMD5 tag to calculate MD5 of image data only
|
data/bin/MANIFEST
CHANGED
|
@@ -530,6 +530,8 @@ t/ExifTool_3.out
|
|
|
530
530
|
t/ExifTool_30.out
|
|
531
531
|
t/ExifTool_31.out
|
|
532
532
|
t/ExifTool_32.out
|
|
533
|
+
t/ExifTool_33.out
|
|
534
|
+
t/ExifTool_34.out
|
|
533
535
|
t/ExifTool_4.out
|
|
534
536
|
t/ExifTool_5.out
|
|
535
537
|
t/ExifTool_6.out
|
|
@@ -903,6 +905,7 @@ t/Writer_56.out
|
|
|
903
905
|
t/Writer_58.out
|
|
904
906
|
t/Writer_59.out
|
|
905
907
|
t/Writer_6.out
|
|
908
|
+
t/Writer_60.out
|
|
906
909
|
t/Writer_7.out
|
|
907
910
|
t/Writer_9.out
|
|
908
911
|
t/XMP.t
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
|
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
|
|
|
107
107
|
terminal window to extract and run ExifTool:
|
|
108
108
|
|
|
109
109
|
cd ~/Desktop
|
|
110
|
-
gzip -dc Image-ExifTool-12.
|
|
111
|
-
cd Image-ExifTool-12.
|
|
110
|
+
gzip -dc Image-ExifTool-12.59.tar.gz | tar -xf -
|
|
111
|
+
cd Image-ExifTool-12.59
|
|
112
112
|
./exiftool t/images/ExifTool.jpg
|
|
113
113
|
|
|
114
114
|
Note: These commands extract meta information from one of the test images.
|
|
@@ -210,6 +210,7 @@
|
|
|
210
210
|
3 => 'PreviewImage (1)',
|
|
211
211
|
# (if the MPF has 2 previews, MPImage3 could be the larger one)
|
|
212
212
|
4 => 'MPImage3',
|
|
213
|
+
5 => 'JpgFromRaw2', # in RW2 from newer Panasonic models
|
|
213
214
|
},
|
|
214
215
|
# ValueConv may also be a code reference
|
|
215
216
|
# Inputs: 0) reference to list of values, 1) ExifTool object
|
data/bin/exiftool
CHANGED
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '12.
|
|
14
|
+
my $version = '12.59';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
BEGIN {
|
|
@@ -103,6 +103,7 @@ my @newValues; # list of new tag values to set
|
|
|
103
103
|
my @requestTags; # tags to request (for -p or -if option arguments)
|
|
104
104
|
my @srcFmt; # source file name format strings
|
|
105
105
|
my @tags; # list of tags to extract
|
|
106
|
+
my %altFile; # alternate files to extract information (keyed by lower-case family 8 group)
|
|
106
107
|
my %appended; # list of files appended to
|
|
107
108
|
my %countLink; # count hard and symbolic links made
|
|
108
109
|
my %created; # list of files we created
|
|
@@ -115,6 +116,7 @@ my %outComma; # flag that output text file needs a comma
|
|
|
115
116
|
my %outTrailer; # trailer for output text file
|
|
116
117
|
my %preserveTime; # preserved timestamps for files
|
|
117
118
|
my %printFmt; # the contents of the print format file
|
|
119
|
+
my %seqFileDir; # file sequence number in each directory
|
|
118
120
|
my %setTags; # hash of list references for tags to set from files
|
|
119
121
|
my %setTagsList; # list of other tag lists for multiple -tagsFromFile from the same file
|
|
120
122
|
my %usedFileName; # lookup for file names we already used in TestName feature
|
|
@@ -196,7 +198,7 @@ my $saveCount; # count the number of times we will/did call SaveNewValues()
|
|
|
196
198
|
my $scanWritable; # flag to process only writable file types
|
|
197
199
|
my $sectHeader; # current section header for -p option
|
|
198
200
|
my $sectTrailer; # section trailer for -p option
|
|
199
|
-
my $
|
|
201
|
+
my $seqFileDir; # sequential file number used for %-C
|
|
200
202
|
my $seqFileNum; # sequential file number used for %C
|
|
201
203
|
my $setCharset; # character set setting ('default' if not set and -csv -b used)
|
|
202
204
|
my $showGroup; # number of group to show (may be zero or '')
|
|
@@ -450,6 +452,7 @@ undef %outComma;
|
|
|
450
452
|
undef %outTrailer;
|
|
451
453
|
undef %printFmt;
|
|
452
454
|
undef %preserveTime;
|
|
455
|
+
undef %seqFileDir;
|
|
453
456
|
undef %setTags;
|
|
454
457
|
undef %setTagsList;
|
|
455
458
|
undef %usedFileName;
|
|
@@ -536,7 +539,7 @@ $quiet = 0;
|
|
|
536
539
|
$rtnVal = 0;
|
|
537
540
|
$saveCount = 0;
|
|
538
541
|
$sectTrailer = '';
|
|
539
|
-
$
|
|
542
|
+
$seqFileDir = 0;
|
|
540
543
|
$seqFileNum = 0;
|
|
541
544
|
$tabFormat = 0;
|
|
542
545
|
$vout = \*STDOUT;
|
|
@@ -950,6 +953,10 @@ for (;;) {
|
|
|
950
953
|
$mt->Options(FastScan => (length $1 ? $1 : 1));
|
|
951
954
|
next;
|
|
952
955
|
}
|
|
956
|
+
if (/^(file\d+)$/i) {
|
|
957
|
+
$altFile{lc $1} = shift or Error("Expecting file name for -file option\n"), $badCmd=1, next;
|
|
958
|
+
next;
|
|
959
|
+
}
|
|
953
960
|
if (/^fileorder(\d*)$/i) {
|
|
954
961
|
push @fileOrder, shift if @ARGV;
|
|
955
962
|
my $num = $1 || 0;
|
|
@@ -1939,7 +1946,7 @@ Exit $rtnValApp; # all done
|
|
|
1939
1946
|
sub GetImageInfo($$)
|
|
1940
1947
|
{
|
|
1941
1948
|
my ($et, $orig) = @_;
|
|
1942
|
-
my (@foundTags, $info, $file, $ind);
|
|
1949
|
+
my (@foundTags, $info, $file, $ind, $g8);
|
|
1943
1950
|
|
|
1944
1951
|
# set window title for this file if necessary
|
|
1945
1952
|
if (defined $windowTitle and $progressCount >= $progressNext) {
|
|
@@ -1982,6 +1989,11 @@ sub GetImageInfo($$)
|
|
|
1982
1989
|
} else {
|
|
1983
1990
|
$file = $orig;
|
|
1984
1991
|
}
|
|
1992
|
+
# set alternate file names
|
|
1993
|
+
foreach $g8 (sort keys %altFile) {
|
|
1994
|
+
my $altName = FilenameSPrintf($altFile{$g8}, $orig);
|
|
1995
|
+
$et->SetAlternateFile($g8, $altName);
|
|
1996
|
+
}
|
|
1985
1997
|
|
|
1986
1998
|
my $pipe = $file;
|
|
1987
1999
|
if ($doUnzip) {
|
|
@@ -2080,6 +2092,8 @@ sub GetImageInfo($$)
|
|
|
2080
2092
|
return;
|
|
2081
2093
|
}
|
|
2082
2094
|
++$seqFileNum; # increment our file counter
|
|
2095
|
+
my ($dir) = Image::ExifTool::SplitFileName($orig);
|
|
2096
|
+
$seqFileDir = $seqFileDir{$dir} = ($seqFileDir{$dir} || 0) + 1;
|
|
2083
2097
|
|
|
2084
2098
|
my $lineCount = 0;
|
|
2085
2099
|
my ($fp, $outfile, $append);
|
|
@@ -3741,8 +3755,6 @@ sub ScanDir($$;$)
|
|
|
3741
3755
|
$utf8Name = 1;
|
|
3742
3756
|
}
|
|
3743
3757
|
return if $ignore{$dir};
|
|
3744
|
-
my $oldBase = $seqFileBase;
|
|
3745
|
-
$seqFileBase = $seqFileNum;
|
|
3746
3758
|
# use Win32::FindFile on Windows if available
|
|
3747
3759
|
# (ReadDir will croak if there is a wildcard, so check for this)
|
|
3748
3760
|
if ($^O eq 'MSWin32' and $dir !~ /[*?]/) {
|
|
@@ -3774,7 +3786,6 @@ sub ScanDir($$;$)
|
|
|
3774
3786
|
# use standard perl library routines to read directory
|
|
3775
3787
|
unless (opendir(DIR_HANDLE, $dir)) {
|
|
3776
3788
|
Warn("Error opening directory $dir\n");
|
|
3777
|
-
$seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
|
|
3778
3789
|
return;
|
|
3779
3790
|
}
|
|
3780
3791
|
@fileList = readdir(DIR_HANDLE);
|
|
@@ -3854,8 +3865,6 @@ sub ScanDir($$;$)
|
|
|
3854
3865
|
}
|
|
3855
3866
|
++$countDir;
|
|
3856
3867
|
$et->Options(CharsetFileName => $enc); # restore original setting
|
|
3857
|
-
# update sequential file base for parent directory
|
|
3858
|
-
$seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
|
|
3859
3868
|
}
|
|
3860
3869
|
|
|
3861
3870
|
#------------------------------------------------------------------------------
|
|
@@ -4151,16 +4160,15 @@ sub NextUnusedFilename($;$)
|
|
|
4151
4160
|
return $fmt unless $fmt =~ /%[-+]?\d*\.?\d*[lun]?[cC]/;
|
|
4152
4161
|
my %sep = ( '-' => '-', '+' => '_' );
|
|
4153
4162
|
my ($copy, $alpha) = (0, 'a');
|
|
4154
|
-
my $seq = $seqFileNum - 1;
|
|
4155
4163
|
for (;;) {
|
|
4156
4164
|
my ($filename, $pos) = ('', 0);
|
|
4157
4165
|
while ($fmt =~ /(%([-+]?)(\d*)(\.?)(\d*)([lun]?)([cC]))/g) {
|
|
4158
4166
|
$filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
|
|
4159
4167
|
$pos = pos($fmt);
|
|
4160
4168
|
my ($sign, $wid, $dec, $wid2, $mod, $tok) = ($2, $3 || 0, $4, $5 || 0, $6, $7);
|
|
4161
|
-
my $
|
|
4169
|
+
my $seq;
|
|
4162
4170
|
if ($tok eq 'C') {
|
|
4163
|
-
$
|
|
4171
|
+
$seq = $wid + ($sign eq '-' ? $seqFileDir : $seqFileNum) - 1;
|
|
4164
4172
|
$wid = $wid2;
|
|
4165
4173
|
} else {
|
|
4166
4174
|
next unless $dec or $copy;
|
|
@@ -4169,13 +4177,13 @@ sub NextUnusedFilename($;$)
|
|
|
4169
4177
|
$filename .= $sep{$sign} if $sign;
|
|
4170
4178
|
}
|
|
4171
4179
|
if ($mod and $mod ne 'n') {
|
|
4172
|
-
my $a = $tok eq 'C' ? Num2Alpha($
|
|
4180
|
+
my $a = $tok eq 'C' ? Num2Alpha($seq) : $alpha;
|
|
4173
4181
|
my $str = ($wid and $wid > length $a) ? 'a' x ($wid - length($a)) : '';
|
|
4174
4182
|
$str .= $a;
|
|
4175
4183
|
$str = uc $str if $mod eq 'u';
|
|
4176
4184
|
$filename .= $str;
|
|
4177
4185
|
} else {
|
|
4178
|
-
my $c = $tok eq 'C' ?
|
|
4186
|
+
my $c = $tok eq 'C' ? $seq : $copy;
|
|
4179
4187
|
my $num = $c + ($mod ? 1 : 0);
|
|
4180
4188
|
$filename .= $wid ? sprintf("%.${wid}d",$num) : $num;
|
|
4181
4189
|
}
|
|
@@ -4746,6 +4754,7 @@ L<Advanced options|/Advanced options>
|
|
|
4746
4754
|
-echo[NUM] TEXT Echo text to stdout or stderr
|
|
4747
4755
|
-efile[NUM][!] ERRFILE Save names of files with errors
|
|
4748
4756
|
-execute[NUM] Execute multiple commands on one line
|
|
4757
|
+
-fileNUM ALTFILE Load tags from alternate file
|
|
4749
4758
|
-list_dir List directories, not their contents
|
|
4750
4759
|
-srcfile FMT Process a different source file
|
|
4751
4760
|
-stay_open FLAG Keep reading -@ argfile even after EOF
|
|
@@ -5018,16 +5027,14 @@ for list-type tags and conditional replacements because each copy operation
|
|
|
5018
5027
|
on a tag overrides any previous operations. While this avoids duplicate
|
|
5019
5028
|
list items when copying groups of tags from a file containing redundant
|
|
5020
5029
|
information, it also prevents values of different tags from being copied
|
|
5021
|
-
into the same list when this is the intent.
|
|
5022
|
-
|
|
5030
|
+
into the same list when this is the intent. To accumulate values
|
|
5031
|
+
from different operations into the same list, add a C<+> after the initial
|
|
5032
|
+
C<-> of the argument. For example:
|
|
5023
5033
|
|
|
5024
|
-
exiftool -
|
|
5034
|
+
exiftool -tagsfromfile @ '-subject<make' '-+subject<model' ...
|
|
5025
5035
|
|
|
5026
|
-
Similarly,
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
Other than these differences, the B<-tagsFromFile> and B<-addTagsFromFile>
|
|
5030
|
-
options are equivalent.
|
|
5036
|
+
Similarly, C<-+DSTTAG> must be used when conditionally replacing a tag to
|
|
5037
|
+
prevent overriding earlier conditions.
|
|
5031
5038
|
|
|
5032
5039
|
6) The B<-a> option (allow duplicate tags) is always in effect when copying
|
|
5033
5040
|
tags from I<SRCFILE>, but the highest priority tag is always copied last so
|
|
@@ -5307,15 +5314,15 @@ B<-csv>=I<CSVFILE> feature.
|
|
|
5307
5314
|
Organize output by tag group. I<NUM> specifies a group family number, and
|
|
5308
5315
|
may be 0 (general location), 1 (specific location), 2 (category), 3
|
|
5309
5316
|
(document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF
|
|
5310
|
-
format)
|
|
5311
|
-
specified. May be combined with other options to add group
|
|
5312
|
-
output. Multiple families may be specified by separating them
|
|
5313
|
-
By default the resulting group name is simplified by removing
|
|
5314
|
-
C<Main:> and collapsing adjacent identical group names, but this
|
|
5315
|
-
avoided by placing a colon before the first family number (eg.
|
|
5316
|
-
Use the B<-listg> option to list group names for a specified
|
|
5317
|
-
API SavePath and SaveFormat options are automatically enabled
|
|
5318
|
-
respective family 5 or 6 group names are requested. See the
|
|
5317
|
+
format), 7 (tag ID) or 8 (file number). B<-g0> is assumed if a family
|
|
5318
|
+
number is not specified. May be combined with other options to add group
|
|
5319
|
+
names to the output. Multiple families may be specified by separating them
|
|
5320
|
+
with colons. By default the resulting group name is simplified by removing
|
|
5321
|
+
any leading C<Main:> and collapsing adjacent identical group names, but this
|
|
5322
|
+
can be avoided by placing a colon before the first family number (eg.
|
|
5323
|
+
B<-g:3:1>). Use the B<-listg> option to list group names for a specified
|
|
5324
|
+
family. The API SavePath and SaveFormat options are automatically enabled
|
|
5325
|
+
if the respective family 5 or 6 group names are requested. See the
|
|
5319
5326
|
L<API GetGroup documentation|Image::ExifTool/GetGroup> for more information.
|
|
5320
5327
|
|
|
5321
5328
|
=item B<-G>[I<NUM>][:I<NUM>...] (B<-groupNames>)
|
|
@@ -5523,7 +5530,7 @@ with this command:
|
|
|
5523
5530
|
|
|
5524
5531
|
produces output like this:
|
|
5525
5532
|
|
|
5526
|
-
-- Generated by ExifTool 12.
|
|
5533
|
+
-- Generated by ExifTool 12.59 --
|
|
5527
5534
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5528
5535
|
(f/5.6, 1/60s, ISO 100)
|
|
5529
5536
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6414,12 +6421,12 @@ I<SHIFT> string. For example:
|
|
|
6414
6421
|
|
|
6415
6422
|
Add features from specified plug-in I<MODULE>. Currently, the MWG module is
|
|
6416
6423
|
the only plug-in module distributed with exiftool. This module adds
|
|
6417
|
-
read/write support for tags as recommended by the Metadata Working Group.
|
|
6418
|
-
|
|
6419
|
-
for any tag
|
|
6420
|
-
documentation|Image::ExifTool::TagNames/MWG Tags> for more
|
|
6421
|
-
that this option is not reversible, and remains in effect
|
|
6422
|
-
application terminates, even across the B<-execute> option.
|
|
6424
|
+
read/write support for tags as recommended by the Metadata Working Group. As
|
|
6425
|
+
a convenience, C<-use MWG> is assumed if the group name prefix starts with
|
|
6426
|
+
C<MWG:> exactly for any requested tag. See the
|
|
6427
|
+
L<MWG Tags documentation|Image::ExifTool::TagNames/MWG Tags> for more
|
|
6428
|
+
details. Note that this option is not reversible, and remains in effect
|
|
6429
|
+
until the application terminates, even across the B<-execute> option.
|
|
6423
6430
|
|
|
6424
6431
|
=back
|
|
6425
6432
|
|
|
@@ -6523,6 +6530,14 @@ line. I<NUM> is an optional number that is echoed in the "{ready}" message
|
|
|
6523
6530
|
when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
|
|
6524
6531
|
option no longer suppresses the output "{readyNUM}" message.
|
|
6525
6532
|
|
|
6533
|
+
=item B<-file>I<NUM> I<ALTFILE>
|
|
6534
|
+
|
|
6535
|
+
Read tags from an alternate source file. These tags are accessed via the
|
|
6536
|
+
family 8 group name (eg. C<File1:TAG>, C<File2:TAG>, etc). I<ALTFILE> may
|
|
6537
|
+
contain filename formatting codes %d, %f and %e. Among other things, this
|
|
6538
|
+
allows tags from different files to be compared and combined using the
|
|
6539
|
+
B<-if> and B<-p> options.
|
|
6540
|
+
|
|
6526
6541
|
=item B<-list_dir>
|
|
6527
6542
|
|
|
6528
6543
|
List directories themselves instead of their contents. This option
|
|
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
|
|
|
16
16
|
use Image::ExifTool::XMP;
|
|
17
17
|
use Image::ExifTool::GPS;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.08';
|
|
20
20
|
|
|
21
21
|
sub ProcessDJIInfo($$$);
|
|
22
22
|
|
|
@@ -104,7 +104,7 @@ my %convFloat2 = (
|
|
|
104
104
|
0x00 => { Name => 'AmbientTemperature', Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' }, # (NC)
|
|
105
105
|
0x04 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
|
|
106
106
|
0x08 => { Name => 'Emissivity', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
|
|
107
|
-
0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g
|
|
107
|
+
0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %%",$val*100)' },
|
|
108
108
|
0x10 => { Name => 'ReflectedTemperature',Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' },
|
|
109
109
|
0x65 => { Name => 'IDString', Format => 'string[16]' }, # (NC)
|
|
110
110
|
);
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
21
21
|
use Image::ExifTool::Exif;
|
|
22
22
|
use Image::ExifTool::ASF; # for GetGUID()
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.44';
|
|
25
25
|
|
|
26
26
|
sub ProcessFPX($$);
|
|
27
27
|
sub ProcessFPXR($$$);
|
|
@@ -488,16 +488,27 @@ my %fpxFileType = (
|
|
|
488
488
|
IeImg => {
|
|
489
489
|
Name => 'EmbeddedImage',
|
|
490
490
|
Notes => q{
|
|
491
|
-
embedded images in Scene7 vignette VNT files.
|
|
492
|
-
|
|
493
|
-
corresponding EmbeddedImage via the family 3 group name
|
|
491
|
+
embedded images in Scene7 vignette VNT files. The EmbeddedImage Class and
|
|
492
|
+
Rectangle are also extracted for applicable images, and may be associated
|
|
493
|
+
with the corresponding EmbeddedImage via the family 3 group name
|
|
494
494
|
},
|
|
495
495
|
Groups => { 2 => 'Preview' },
|
|
496
496
|
Binary => 1,
|
|
497
497
|
},
|
|
498
|
-
|
|
498
|
+
IeImg_class => {
|
|
499
|
+
Name => 'EmbeddedImageClass',
|
|
500
|
+
Notes => q{
|
|
501
|
+
not a real tag. This information is extracted if available for the
|
|
502
|
+
corresponding EmbeddedImage from the Contents of a VNT file
|
|
503
|
+
},
|
|
504
|
+
# eg. "Cache", "Mask"
|
|
505
|
+
},
|
|
506
|
+
IeImg_rect => { #
|
|
499
507
|
Name => 'EmbeddedImageRectangle',
|
|
500
|
-
|
|
508
|
+
Notes => q{
|
|
509
|
+
not a real tag. This information is extracted if available for the
|
|
510
|
+
corresponding EmbeddedImage from the Contents of a VNT file
|
|
511
|
+
},
|
|
501
512
|
},
|
|
502
513
|
);
|
|
503
514
|
|
|
@@ -1577,13 +1588,16 @@ sub ProcessContents($$$)
|
|
|
1577
1588
|
pos($$dataPt) += $size;
|
|
1578
1589
|
}
|
|
1579
1590
|
$$et{IeImg_lkup} = { };
|
|
1580
|
-
|
|
1591
|
+
$$et{IeImg_class} = { };
|
|
1592
|
+
# - the byte before \x80 is 0x0d, 0x11 or 0x1f for separate images in my samples,
|
|
1581
1593
|
# and 0x1c or 0x23 for inline masks
|
|
1582
|
-
|
|
1583
|
-
|
|
1594
|
+
# - the byte after \xff\xff is 0x3b in my samples for $1 containing 'VnMask' or 'VnCache'
|
|
1595
|
+
while ($$dataPt =~ /\x0bTargetRole1(?:.\x80|\xff\xff.\0.\0Vn(\w+))\0\0\x01.{4}(.{24})/sg) {
|
|
1596
|
+
my ($index, @coords) = unpack('Vx4V4', $2);
|
|
1584
1597
|
next if $index == 0xffffffff;
|
|
1585
1598
|
$$et{IeImg_lkup}{$index} and $et->WarnOnce('Duplicate image index');
|
|
1586
1599
|
$$et{IeImg_lkup}{$index} = "@coords";
|
|
1600
|
+
$$et{IeImg_class}{$index} = $1 if $1;
|
|
1587
1601
|
}
|
|
1588
1602
|
}
|
|
1589
1603
|
}
|
|
@@ -2395,6 +2409,10 @@ sub ProcessFPX($$)
|
|
|
2395
2409
|
# save position of this image
|
|
2396
2410
|
$et->HandleTag($tagTablePtr, IeImg_rect => $$et{IeImg_lkup}{$num});
|
|
2397
2411
|
delete $$et{IeImg_lkup}{$num};
|
|
2412
|
+
if ($$et{IeImg_class} and $$et{IeImg_class}{$num}) {
|
|
2413
|
+
$et->HandleTag($tagTablePtr, IeImg_class => $$et{IeImg_class}{$num});
|
|
2414
|
+
delete $$et{IeImg_class}{$num};
|
|
2415
|
+
}
|
|
2398
2416
|
}
|
|
2399
2417
|
delete $$et{DOC_NUM};
|
|
2400
2418
|
} else {
|
|
@@ -13,7 +13,7 @@ use vars qw($VERSION);
|
|
|
13
13
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::XMP;
|
|
15
15
|
|
|
16
|
-
$VERSION = '1.
|
|
16
|
+
$VERSION = '1.01';
|
|
17
17
|
|
|
18
18
|
%Image::ExifTool::LIF::Main = (
|
|
19
19
|
GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
|
|
@@ -30,7 +30,15 @@ $VERSION = '1.00';
|
|
|
30
30
|
my $unixTimeZero = 134774 * 24 * 3600;
|
|
31
31
|
my @vals = split ' ', $val;
|
|
32
32
|
foreach (@vals) {
|
|
33
|
-
|
|
33
|
+
if (/[^0-9a-f]/i) {
|
|
34
|
+
$_ = '0000:00:00 00:00:00';
|
|
35
|
+
} elsif (length $_ > 8) {
|
|
36
|
+
my $lo = hex substr($_, -8);
|
|
37
|
+
my $hi = hex substr($_, 0, -8);
|
|
38
|
+
$_ = 1e-7 * ($hi * 4294967296 + $lo);
|
|
39
|
+
} else {
|
|
40
|
+
$_ = 1e-7 * hex($_);
|
|
41
|
+
}
|
|
34
42
|
# shift from Jan 1, 1601 to Jan 1, 1970
|
|
35
43
|
$_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero);
|
|
36
44
|
}
|
|
@@ -17,7 +17,7 @@ use vars qw($VERSION);
|
|
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
18
18
|
use Image::ExifTool::Minolta;
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.17';
|
|
21
21
|
|
|
22
22
|
sub ProcessMRW($$;$);
|
|
23
23
|
sub WriteMRW($$;$);
|
|
@@ -489,6 +489,14 @@ sub ProcessMRW($$;$)
|
|
|
489
489
|
$err and $et->Error("MRW format error", $$et{TIFF_TYPE} eq 'ARW');
|
|
490
490
|
} else {
|
|
491
491
|
$err and $et->Warn("MRW format error");
|
|
492
|
+
if ($$et{ImageDataMD5}) {
|
|
493
|
+
my ($num, $md5) = (0, $$et{ImageDataMD5});
|
|
494
|
+
while ($raf->Read($data, 65536)) {
|
|
495
|
+
$md5->add($data);
|
|
496
|
+
$num += length $data;
|
|
497
|
+
}
|
|
498
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $num bytes of raw data)\n");
|
|
499
|
+
}
|
|
492
500
|
}
|
|
493
501
|
return $rtnVal;
|
|
494
502
|
}
|
|
@@ -64,7 +64,7 @@ use Image::ExifTool::Exif;
|
|
|
64
64
|
use Image::ExifTool::GPS;
|
|
65
65
|
use Image::ExifTool::XMP;
|
|
66
66
|
|
|
67
|
-
$VERSION = '4.
|
|
67
|
+
$VERSION = '4.21';
|
|
68
68
|
|
|
69
69
|
sub LensIDConv($$$);
|
|
70
70
|
sub ProcessNikonAVI($$$);
|
|
@@ -5298,6 +5298,7 @@ my %nikonFocalConversions = (
|
|
|
5298
5298
|
35 => 'Nikkor Z 28-75mm f/2.8', #IB
|
|
5299
5299
|
36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
|
|
5300
5300
|
37 => 'Nikkor Z 600mm f/4 TC VR S', #28
|
|
5301
|
+
38 => 'Nikkor Z 85mm f/1.2 S', #28
|
|
5301
5302
|
39 => 'Nikkor Z 17-28mm f/2.8', #IB
|
|
5302
5303
|
32768 => 'Nikkor Z 400mm f/2.8 TC VR S TC-1.4x', #28
|
|
5303
5304
|
32769 => 'Nikkor Z 600mm f/4 TC VR S TC-1.4x', #28
|
|
@@ -11836,19 +11837,19 @@ sub ProcessNikonApp($;$)
|
|
|
11836
11837
|
my $trailerLen = unpack('N', $buff);
|
|
11837
11838
|
$trailerLen > $fileEnd and $et->Warn('Bad NikonApp trailer size'), return 0;
|
|
11838
11839
|
if ($dirInfo) {
|
|
11839
|
-
$$dirInfo{DirLen} = $trailerLen
|
|
11840
|
+
$$dirInfo{DirLen} = $trailerLen;
|
|
11840
11841
|
$$dirInfo{DataPos} = $fileEnd - $trailerLen;
|
|
11841
11842
|
if ($$dirInfo{OutFile}) {
|
|
11842
11843
|
if ($$et{DEL_GROUP}{NikonApp}) {
|
|
11844
|
+
$et->VPrint(0, " Deleting NikonApp trailer ($trailerLen bytes)\n");
|
|
11843
11845
|
++$$et{CHANGED};
|
|
11844
|
-
# just copy the trailer when writing
|
|
11846
|
+
# just copy the trailer when writing (read directly into output buffer)
|
|
11845
11847
|
} elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or
|
|
11846
11848
|
$raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen)
|
|
11847
11849
|
{
|
|
11848
11850
|
return 0;
|
|
11849
|
-
} else {
|
|
11850
|
-
return 1;
|
|
11851
11851
|
}
|
|
11852
|
+
return 1;
|
|
11852
11853
|
}
|
|
11853
11854
|
$et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
|
|
11854
11855
|
}
|
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
40
40
|
use Image::ExifTool::Exif;
|
|
41
41
|
use Image::ExifTool::APP12;
|
|
42
42
|
|
|
43
|
-
$VERSION = '2.
|
|
43
|
+
$VERSION = '2.81';
|
|
44
44
|
|
|
45
45
|
sub PrintLensInfo($$$);
|
|
46
46
|
|
|
@@ -3165,21 +3165,38 @@ my %indexInfo = (
|
|
|
3165
3165
|
PrintHex => 1,
|
|
3166
3166
|
ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
|
|
3167
3167
|
ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
|
|
3168
|
-
PrintConv => [
|
|
3168
|
+
PrintConv => [ # herb values added:
|
|
3169
|
+
# based on code of W.P. in https://exiftool.org/forum/index.php?topic=14144.0
|
|
3169
3170
|
{
|
|
3170
|
-
0x00 => '(none)',
|
|
3171
|
-
0x01 => 'Center',
|
|
3171
|
+
# 0x00 => '(none)',
|
|
3172
|
+
# 0x01 => 'Center',
|
|
3172
3173
|
# need to fill this in...
|
|
3174
|
+
0x00 => '(none)',
|
|
3175
|
+
0x02 => 'Top-center (horizontal)',
|
|
3176
|
+
0x04 => 'Right (horizontal)',
|
|
3177
|
+
0x05 => 'Mid-right (horizontal)',
|
|
3178
|
+
0x06 => 'Center (horizontal)',
|
|
3179
|
+
0x07 => 'Mid-left (horizontal)',
|
|
3180
|
+
0x08 => 'Left (horizontal)',
|
|
3181
|
+
0x0a => 'Bottom-center (horizontal)',
|
|
3182
|
+
0x0c => 'Top-center (vertical)',
|
|
3183
|
+
0x0f => 'Right (vertical)',
|
|
3184
|
+
0x15 => 'Bottom-center (vertical)',
|
|
3185
|
+
0x10 => 'Mid-right (vertical)',
|
|
3186
|
+
0x11 => 'Center (vertical)',
|
|
3187
|
+
0x12 => 'Mid-left (vertical)',
|
|
3188
|
+
0x13 => 'Left (vertical)',
|
|
3173
3189
|
},
|
|
3174
3190
|
{
|
|
3175
3191
|
0x00 => 'Single Target',
|
|
3176
3192
|
0x40 => 'All Target', # (guess)
|
|
3177
3193
|
},
|
|
3178
3194
|
]
|
|
3179
|
-
},{ #
|
|
3195
|
+
},{ #herb all camera model except E-Mxxx and OM-x
|
|
3180
3196
|
Name => 'AFPoint',
|
|
3197
|
+
Condition => '$$self{Model} !~ /^(E-M|OM-)/ ',
|
|
3181
3198
|
Writable => 'int16u',
|
|
3182
|
-
Notes => 'other
|
|
3199
|
+
Notes => 'models other than E-Mxxx and OM-x',
|
|
3183
3200
|
RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
|
|
3184
3201
|
PrintConv => {
|
|
3185
3202
|
# (E-P1 always writes 0, maybe other models do too - PH)
|
|
@@ -3189,10 +3206,73 @@ my %indexInfo = (
|
|
|
3189
3206
|
3 => 'Center (vertical)', #6 (E-510)
|
|
3190
3207
|
255 => 'None',
|
|
3191
3208
|
},
|
|
3209
|
+
},{ #herb all newer models E-Mxxx and OM-x; we do not know details
|
|
3210
|
+
Name => 'AFPoint',
|
|
3211
|
+
Writable => 'int16u',
|
|
3212
|
+
Notes => 'other models',
|
|
3192
3213
|
}
|
|
3193
3214
|
],
|
|
3194
3215
|
# 0x31a Continuous AF parameters?
|
|
3195
|
-
#
|
|
3216
|
+
0x31b => [ #herb, based on investigations of abgestumpft: https://exiftool.org/forum/index.php?topic=14527.0
|
|
3217
|
+
# for newer models E-Mxxx and OM-x
|
|
3218
|
+
{
|
|
3219
|
+
Name => 'AFPointDetails',
|
|
3220
|
+
Condition => '$$self{Model} =~ m/^E-M|^OM-/ ',
|
|
3221
|
+
Writable => 'int16u',
|
|
3222
|
+
Notes => 'models E-Mxxx and OM-x',
|
|
3223
|
+
PrintHex => 1,
|
|
3224
|
+
ValueConv => '(($val >> 13) & 0x7) . " " . (($val >> 12) & 0x1) . " " . (($val >> 11) & 0x1) . " " .
|
|
3225
|
+
# subject detect face and eye half press
|
|
3226
|
+
(($val >> 8) & 0x3) . " " . (($val >> 7) & 0x1) . " " . (($val >> 5) & 0x1) . " " .
|
|
3227
|
+
# eye AF face detect x-AF with MF
|
|
3228
|
+
(($val >> 4) & 0x1) . " " . (($val >> 3) & 0x1) . " " . ($val & 0x7)',
|
|
3229
|
+
# release object found MF...
|
|
3230
|
+
PrintConvColumns => 4,
|
|
3231
|
+
PrintConv => [
|
|
3232
|
+
{
|
|
3233
|
+
# should be identical to AISubjectTrackingMode
|
|
3234
|
+
0 => 'No Subject Detection',
|
|
3235
|
+
1 => 'Motorsports',
|
|
3236
|
+
2 => 'Airplanes',
|
|
3237
|
+
3 => 'Trains',
|
|
3238
|
+
4 => 'Birds',
|
|
3239
|
+
5 => 'Dogs & Cats',
|
|
3240
|
+
},{
|
|
3241
|
+
0 => 'Face Priority',
|
|
3242
|
+
1 => 'Target Priority',
|
|
3243
|
+
},{
|
|
3244
|
+
0 => 'Normal AF',
|
|
3245
|
+
1 => 'AF on Half Press',
|
|
3246
|
+
},{
|
|
3247
|
+
0 => 'No Eye-AF',
|
|
3248
|
+
1 => 'Right Eye Priority',
|
|
3249
|
+
2 => 'Left Eye Priority',
|
|
3250
|
+
3 => 'Both Eyes Priority',
|
|
3251
|
+
},{
|
|
3252
|
+
0 => 'No Face Detection',
|
|
3253
|
+
1 => 'Face Detection',
|
|
3254
|
+
},{
|
|
3255
|
+
0 => 'No MF',
|
|
3256
|
+
1 => 'With MF',
|
|
3257
|
+
},{
|
|
3258
|
+
0 => 'AF Priority',
|
|
3259
|
+
1 => 'Release Priority',
|
|
3260
|
+
},{
|
|
3261
|
+
0 => 'No Object found',
|
|
3262
|
+
1 => 'Object found',
|
|
3263
|
+
},{
|
|
3264
|
+
0 => 'MF',
|
|
3265
|
+
1 => 'S-AF',
|
|
3266
|
+
2 => 'C-AF',
|
|
3267
|
+
6 => 'C-AF + TR',
|
|
3268
|
+
},
|
|
3269
|
+
],
|
|
3270
|
+
},{ # for older models
|
|
3271
|
+
Name => 'AFPointDetails',
|
|
3272
|
+
Writable => 'int16u',
|
|
3273
|
+
Notes => 'other models',
|
|
3274
|
+
}
|
|
3275
|
+
],
|
|
3196
3276
|
0x328 => { #PH
|
|
3197
3277
|
Name => 'AFInfo',
|
|
3198
3278
|
SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AFInfo' },
|