exiftool_vendored 12.58.0 → 12.59.0
Sign up to get free protection for your applications and to get access to all the features.
- 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' },
|