exiftool_vendored 12.56.0 → 12.57.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 +21 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +74 -30
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +4 -0
- data/bin/lib/Image/ExifTool/GPS.pm +7 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/Nikon.pm +665 -845
- data/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
- data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +36 -5
- data/bin/lib/Image/ExifTool/QuickTime.pm +18 -2
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +2 -0
- data/bin/lib/Image/ExifTool/README +11 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +2 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4654 -4628
- data/bin/lib/Image/ExifTool/TagNames.pod +194 -86
- data/bin/lib/Image/ExifTool/Writer.pl +36 -16
- data/bin/lib/Image/ExifTool.pm +38 -22
- data/bin/lib/Image/ExifTool.pod +4 -4
- 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: 1c02a2a1efe1fc3f63f7527ed968432fc73d7e1ebeda7cfbf424413b8907bd0c
|
|
4
|
+
data.tar.gz: 5140c2587870d324d63d4d35beb70d1cbbecb92a78fb6ea55d9885cf9f320c1b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: edd012dc39bc24a6b257f147e5d698648c686aa54e1ac04229cd3cd4880a91d96e21f6f017305a6d763826470ef1f990e94221320bd1d7ee0a73fb5cb2b32ab4
|
|
7
|
+
data.tar.gz: 78856db2a60493444afe450c663d190553147b651140c2f18a2a2641e8c9bc0d5af7f31bd0db4a5f55c89f72b460119192889f4f10190cad3a21bffae976e630
|
data/bin/Changes
CHANGED
|
@@ -7,10 +7,29 @@ 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
|
+
Feb. 23, 2023 - Version 12.57
|
|
11
|
+
|
|
12
|
+
- Added two new Nikon Z lenses (thanks LibRaw)
|
|
13
|
+
- Added a new Sigma LensType (thanks LibRaw)
|
|
14
|
+
- Added a new Olympus LensType (thanks Herb)
|
|
15
|
+
- Decode more new Nikon tags (thanks Warren Hatch)
|
|
16
|
+
- Decode Photoshop LayerColors, LayerSections and LayerVisible tags
|
|
17
|
+
- Improved Verbose output for QuickTime-format files
|
|
18
|
+
- Set family 1 group name for Garmin GPS from uuid atom
|
|
19
|
+
- Enhanced -progress option to allow message to be displayed every NUM files
|
|
20
|
+
- Significant improvements to parsing of Nikon ShotInfo records for newer
|
|
21
|
+
models
|
|
22
|
+
- Removed hex dump of APP segments from -v3 output when writing
|
|
23
|
+
- Fixed bug writing negative MIE GPS coordinates
|
|
24
|
+
- Fixed bug where a duplicate XMP could be generated when writing XMP to a
|
|
25
|
+
JPEG XL image which already contained XMP
|
|
26
|
+
- Fixed problem where HEAD lines may be duplicated in an output file if the -p
|
|
27
|
+
option was combined with -w+ or -W+
|
|
28
|
+
|
|
10
29
|
Feb. 9, 2023 - Version 12.56
|
|
11
30
|
|
|
12
|
-
- Added support for VNT (both Scene7 Vignette and V-Note document)
|
|
13
|
-
- Added read support for InfiRay
|
|
31
|
+
- Added support for VNT files (both Scene7 Vignette and V-Note document)
|
|
32
|
+
- Added read support for InfiRay IJPEG metadata (thanks Marcos Del Sol Vives)
|
|
14
33
|
- Added some new Sony LensType values (thanks Jos Roost and Francois Piette)
|
|
15
34
|
- Added a new FujiFilm VideoRecordingMode value (thanks Greybeard)
|
|
16
35
|
- Added two new Canon LensTypes and CanonModelIDs (thanks Norbert Wasser)
|
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.57.tar.gz | tar -xf -
|
|
111
|
+
cd Image-ExifTool-12.57
|
|
112
112
|
./exiftool t/images/ExifTool.jpg
|
|
113
113
|
|
|
114
114
|
Note: These commands extract meta information from one of the test images.
|
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.57';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
BEGIN {
|
|
@@ -77,6 +77,7 @@ sub AcceptFile($);
|
|
|
77
77
|
sub SlurpFile($$);
|
|
78
78
|
sub FilterArgfileLine($);
|
|
79
79
|
sub ReadStayOpen($);
|
|
80
|
+
sub Progress($$);
|
|
80
81
|
sub PrintTagList($@);
|
|
81
82
|
sub PrintErrors($$$);
|
|
82
83
|
|
|
@@ -182,7 +183,9 @@ my $pause; # pause before returning
|
|
|
182
183
|
my $preserveTime; # flag to preserve times of updated files (2=preserve FileCreateDate only)
|
|
183
184
|
my $progress; # flag to calculate total files to process (0=calculate but don't display)
|
|
184
185
|
my $progressCount; # count of files processed
|
|
186
|
+
my $progressIncr; # increment for progress counter
|
|
185
187
|
my $progressMax; # total number of files to process
|
|
188
|
+
my $progressNext; # next progress count to output
|
|
186
189
|
my $progStr; # progress message string
|
|
187
190
|
my $quiet; # flag to disable printing of informational messages / warnings
|
|
188
191
|
my $rafStdin; # File::RandomAccess for stdin (if necessary to rewind)
|
|
@@ -211,6 +214,7 @@ my $validFile; # flag indicating we processed a valid file
|
|
|
211
214
|
my $verbose; # verbose setting
|
|
212
215
|
my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
|
|
213
216
|
my $windowTitle; # title for console window
|
|
217
|
+
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
|
214
218
|
my $xml; # flag for XML-formatted output
|
|
215
219
|
|
|
216
220
|
# flag to keep the input -@ argfile open:
|
|
@@ -489,7 +493,9 @@ undef $outOpt;
|
|
|
489
493
|
undef $preserveTime;
|
|
490
494
|
undef $progress;
|
|
491
495
|
undef $progressCount;
|
|
496
|
+
undef $progressIncr;
|
|
492
497
|
undef $progressMax;
|
|
498
|
+
undef $progressNext;
|
|
493
499
|
undef $recurse;
|
|
494
500
|
undef $scanWritable;
|
|
495
501
|
undef $sectHeader;
|
|
@@ -1119,9 +1125,11 @@ for (;;) {
|
|
|
1119
1125
|
}
|
|
1120
1126
|
(/^P$/ or $a eq 'preserve') and $preserveTime = 1, next;
|
|
1121
1127
|
/^password$/i and $mt->Options(Password => shift), next;
|
|
1122
|
-
if (/^progress(:.*)?$/i) {
|
|
1123
|
-
|
|
1124
|
-
|
|
1128
|
+
if (/^progress(\d*)(:.*)?$/i) {
|
|
1129
|
+
$progressIncr = $1 || 1;
|
|
1130
|
+
$progressNext = 0; # start showing progress at the first file
|
|
1131
|
+
if ($2) {
|
|
1132
|
+
$windowTitle = substr $2, 1;
|
|
1125
1133
|
$windowTitle = 'ExifTool %p%%' unless length $windowTitle;
|
|
1126
1134
|
$windowTitle =~ /%\d*[bpr]/ and $progress = 0 unless defined $progress;
|
|
1127
1135
|
} else {
|
|
@@ -1239,7 +1247,8 @@ for (;;) {
|
|
|
1239
1247
|
next;
|
|
1240
1248
|
}
|
|
1241
1249
|
if (/^(w|textout|tagout)([!+]*)$/i) {
|
|
1242
|
-
|
|
1250
|
+
# (note: all logic ignores $textOut of 0 or '')
|
|
1251
|
+
$textOut = shift || Warn("Expecting argument for -$_ option\n");
|
|
1243
1252
|
my ($t1, $t2) = ($1, $2);
|
|
1244
1253
|
$textOverwrite = 0;
|
|
1245
1254
|
$textOverwrite += 1 if $t2 =~ /!/; # overwrite
|
|
@@ -1711,7 +1720,7 @@ if (defined $showGroup and not (@tags and $allGroup) and ($sortOpt or not define
|
|
|
1711
1720
|
$mt->Options(Sort => "Group$showGroup");
|
|
1712
1721
|
}
|
|
1713
1722
|
|
|
1714
|
-
if (
|
|
1723
|
+
if ($textOut) {
|
|
1715
1724
|
CleanFilename($textOut); # make all forward slashes
|
|
1716
1725
|
# add '.' before output extension if necessary
|
|
1717
1726
|
$textOut = ".$textOut" unless $textOut =~ /[.%]/ or defined $tagOut;
|
|
@@ -1935,7 +1944,7 @@ sub GetImageInfo($$)
|
|
|
1935
1944
|
my (@foundTags, $info, $file, $ind);
|
|
1936
1945
|
|
|
1937
1946
|
# set window title for this file if necessary
|
|
1938
|
-
if (defined $windowTitle) {
|
|
1947
|
+
if (defined $windowTitle and $progressCount >= $progressNext) {
|
|
1939
1948
|
my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
|
|
1940
1949
|
my $title = $windowTitle;
|
|
1941
1950
|
my ($num, $denom) = split '/', $prog;
|
|
@@ -1951,6 +1960,7 @@ sub GetImageInfo($$)
|
|
|
1951
1960
|
);
|
|
1952
1961
|
$title =~ s/%([%bfpr])/$lkup{$1}/eg;
|
|
1953
1962
|
SetWindowTitle($title);
|
|
1963
|
+
undef $progressNext;
|
|
1954
1964
|
}
|
|
1955
1965
|
unless (length $orig or $outOpt) {
|
|
1956
1966
|
Warn qq(Error: Zero-length file name - ""\n);
|
|
@@ -2044,7 +2054,7 @@ sub GetImageInfo($$)
|
|
|
2044
2054
|
undef @foundTags if $fastCondition; # ignore if we didn't get all tags
|
|
2045
2055
|
}
|
|
2046
2056
|
unless ($result) {
|
|
2047
|
-
$
|
|
2057
|
+
Progress($vout, "-------- $file (failed condition)") if $verbose;
|
|
2048
2058
|
EFile($file, 2);
|
|
2049
2059
|
++$countFailed;
|
|
2050
2060
|
return;
|
|
@@ -2054,7 +2064,7 @@ sub GetImageInfo($$)
|
|
|
2054
2064
|
undef $info if $verbose or defined $fastCondition;
|
|
2055
2065
|
}
|
|
2056
2066
|
if (defined $deleteOrig) {
|
|
2057
|
-
|
|
2067
|
+
Progress($vout, "======== $file") if defined $verbose;
|
|
2058
2068
|
++$count;
|
|
2059
2069
|
my $original = "${file}_original";
|
|
2060
2070
|
$et->Exists($original) or return;
|
|
@@ -2084,12 +2094,12 @@ sub GetImageInfo($$)
|
|
|
2084
2094
|
}
|
|
2085
2095
|
|
|
2086
2096
|
if ($isWriting) {
|
|
2087
|
-
|
|
2097
|
+
Progress($vout, "======== $file") if defined $verbose;
|
|
2088
2098
|
SetImageInfo($et, $file, $orig);
|
|
2089
2099
|
$info = $et->GetInfo('Warning', 'Error');
|
|
2090
2100
|
PrintErrors($et, $info, $file);
|
|
2091
2101
|
# close output text file if necessary
|
|
2092
|
-
if ($outfile) {
|
|
2102
|
+
if (defined $outfile) {
|
|
2093
2103
|
undef $tmpText;
|
|
2094
2104
|
close($fp);
|
|
2095
2105
|
$et->Options(TextOut => $vout);
|
|
@@ -2108,7 +2118,7 @@ sub GetImageInfo($$)
|
|
|
2108
2118
|
unless ($file eq '-' or $et->Exists($file)) {
|
|
2109
2119
|
Warn "Error: File not found - $file\n";
|
|
2110
2120
|
FileNotFound($file);
|
|
2111
|
-
$outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
|
|
2121
|
+
defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
|
|
2112
2122
|
EFile($file);
|
|
2113
2123
|
++$countBad;
|
|
2114
2124
|
return;
|
|
@@ -2125,7 +2135,7 @@ sub GetImageInfo($$)
|
|
|
2125
2135
|
}
|
|
2126
2136
|
}
|
|
2127
2137
|
$o = \*STDERR if $progress and not $o;
|
|
2128
|
-
$o
|
|
2138
|
+
Progress($o, "======== $file") if $o;
|
|
2129
2139
|
if ($info) {
|
|
2130
2140
|
# get the information we wanted
|
|
2131
2141
|
if (@tags and not %printFmt) {
|
|
@@ -2147,7 +2157,7 @@ sub GetImageInfo($$)
|
|
|
2147
2157
|
}
|
|
2148
2158
|
# all done now if we already wrote output text file (eg. verbose option)
|
|
2149
2159
|
if ($fp) {
|
|
2150
|
-
if ($outfile) {
|
|
2160
|
+
if (defined $outfile) {
|
|
2151
2161
|
$et->Options(TextOut => \*STDOUT);
|
|
2152
2162
|
undef $tmpText;
|
|
2153
2163
|
if ($info->{Error}) {
|
|
@@ -2176,7 +2186,7 @@ sub GetImageInfo($$)
|
|
|
2176
2186
|
}
|
|
2177
2187
|
|
|
2178
2188
|
# open output file (or stdout if no output file) if not done already
|
|
2179
|
-
unless ($outfile or $tagOut) {
|
|
2189
|
+
unless (defined $outfile or $tagOut) {
|
|
2180
2190
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
|
2181
2191
|
$fp or EFile($file), ++$countBad, return;
|
|
2182
2192
|
$tmpText = $outfile unless $append;
|
|
@@ -2201,6 +2211,10 @@ sub GetImageInfo($$)
|
|
|
2201
2211
|
my $skipBody;
|
|
2202
2212
|
foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
|
|
2203
2213
|
my $prf = $printFmt{$type} or next;
|
|
2214
|
+
if ($type eq 'HEAD' and defined $outfile) {
|
|
2215
|
+
next if $wroteHEAD{$outfile};
|
|
2216
|
+
$wroteHEAD{$outfile} = 1;
|
|
2217
|
+
}
|
|
2204
2218
|
next if $type eq 'BODY' and $skipBody;
|
|
2205
2219
|
if ($lastDoc) {
|
|
2206
2220
|
if ($doc) {
|
|
@@ -2238,7 +2252,7 @@ sub GetImageInfo($$)
|
|
|
2238
2252
|
}
|
|
2239
2253
|
}
|
|
2240
2254
|
}
|
|
2241
|
-
delete $printFmt{HEAD} unless $outfile; # print header only once per output file
|
|
2255
|
+
delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
|
|
2242
2256
|
my $errs = $et->GetInfo('Warning', 'Error');
|
|
2243
2257
|
PrintErrors($et, $errs, $file) and EFile($file);
|
|
2244
2258
|
} elsif (not $disableOutput) {
|
|
@@ -2394,7 +2408,7 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2394
2408
|
next TAG;
|
|
2395
2409
|
}
|
|
2396
2410
|
my @groups = $et->GetGroup($tag);
|
|
2397
|
-
$outfile and close($fp), undef($tmpText); # (shouldn't happen)
|
|
2411
|
+
defined $outfile and close($fp), undef($tmpText); # (shouldn't happen)
|
|
2398
2412
|
my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName');
|
|
2399
2413
|
($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org);
|
|
2400
2414
|
$fp or ++$countBad, next TAG;
|
|
@@ -2700,7 +2714,7 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2700
2714
|
}
|
|
2701
2715
|
}
|
|
2702
2716
|
}
|
|
2703
|
-
if ($outfile) {
|
|
2717
|
+
if (defined $outfile) {
|
|
2704
2718
|
if ($textOverwrite & 0x02) {
|
|
2705
2719
|
# save state of this file if we may be appending
|
|
2706
2720
|
$outComma{$outfile} = $comma;
|
|
@@ -3661,8 +3675,19 @@ sub ProcessFiles($;$)
|
|
|
3661
3675
|
foreach $file (@files) {
|
|
3662
3676
|
$et->Options(CharsetFileName => 'UTF8') if $utf8FileName{$file};
|
|
3663
3677
|
if (defined $progressMax) {
|
|
3678
|
+
unless (defined $progressNext) {
|
|
3679
|
+
$progressNext = $progressCount + $progressIncr;
|
|
3680
|
+
$progressNext -= $progressNext % $progressIncr;
|
|
3681
|
+
$progressNext = $progressMax if $progressNext > $progressMax;
|
|
3682
|
+
}
|
|
3664
3683
|
++$progressCount;
|
|
3665
|
-
|
|
3684
|
+
if ($progress) {
|
|
3685
|
+
if ($progressCount >= $progressNext) {
|
|
3686
|
+
$progStr = " [$progressCount/$progressMax]";
|
|
3687
|
+
} else {
|
|
3688
|
+
undef $progStr; # don't update progress yet
|
|
3689
|
+
}
|
|
3690
|
+
}
|
|
3666
3691
|
}
|
|
3667
3692
|
if ($et->IsDirectory($file) and not $listDir) {
|
|
3668
3693
|
$multiFile = $validFile = 1;
|
|
@@ -3670,7 +3695,7 @@ sub ProcessFiles($;$)
|
|
|
3670
3695
|
} elsif ($filterFlag and not AcceptFile($file)) {
|
|
3671
3696
|
if ($et->Exists($file)) {
|
|
3672
3697
|
$filtered = 1;
|
|
3673
|
-
$
|
|
3698
|
+
Progress($vout, "-------- $file (wrong extension)") if $verbose;
|
|
3674
3699
|
} else {
|
|
3675
3700
|
Warn "Error: File not found - $file\n";
|
|
3676
3701
|
FileNotFound($file);
|
|
@@ -4426,6 +4451,18 @@ sub EFile($$)
|
|
|
4426
4451
|
}
|
|
4427
4452
|
}
|
|
4428
4453
|
|
|
4454
|
+
#------------------------------------------------------------------------------
|
|
4455
|
+
# Print progress message if it is time for it
|
|
4456
|
+
# Inputs: 0) file ref, 1) message
|
|
4457
|
+
sub Progress($$)
|
|
4458
|
+
{
|
|
4459
|
+
my ($file, $msg) = @_;
|
|
4460
|
+
if (defined $progStr) {
|
|
4461
|
+
print $file $msg, $progStr, "\n";
|
|
4462
|
+
undef $progressNext;
|
|
4463
|
+
}
|
|
4464
|
+
}
|
|
4465
|
+
|
|
4429
4466
|
#------------------------------------------------------------------------------
|
|
4430
4467
|
# Print list of tags
|
|
4431
4468
|
# Inputs: 0) message, 1-N) list of tag names
|
|
@@ -4672,7 +4709,7 @@ L<Processing control|/Processing control>
|
|
|
4672
4709
|
-overwrite_original_in_place Overwrite original by copying tmp file
|
|
4673
4710
|
-P (-preserve) Preserve file modification date/time
|
|
4674
4711
|
-password PASSWD Password for processing protected files
|
|
4675
|
-
-progress[:[TITLE]]
|
|
4712
|
+
-progress[NUM][:[TITLE]] Show file progress count
|
|
4676
4713
|
-q (-quiet) Quiet processing
|
|
4677
4714
|
-r[.] (-recurse) Recursively process subdirectories
|
|
4678
4715
|
-scanForXMP Brute force XMP scan
|
|
@@ -4819,6 +4856,9 @@ are removed if the containing group is deleted:
|
|
|
4819
4856
|
- Deleting EXIF only removes ExifIFD which also deletes
|
|
4820
4857
|
InteropIFD and MakerNotes.
|
|
4821
4858
|
|
|
4859
|
+
MOV/MP4 video:
|
|
4860
|
+
- Deleting ItemList also deletes Keys tags
|
|
4861
|
+
|
|
4822
4862
|
Notes:
|
|
4823
4863
|
|
|
4824
4864
|
1) B<Many tag values may be assigned in a single command>. If two
|
|
@@ -4915,7 +4955,9 @@ prevent shell redirection, and there is no C<=> sign as when assigning new
|
|
|
4915
4955
|
values. Source and/or destination tags may be prefixed by a group name
|
|
4916
4956
|
and/or suffixed by C<#>. Wildcards are allowed in both the source and
|
|
4917
4957
|
destination tag names. A destination group and/or tag name of C<All> or
|
|
4918
|
-
C<*> writes to the same family 1 group and/or tag name as the source
|
|
4958
|
+
C<*> writes to the same family 1 group and/or tag name as the source (but
|
|
4959
|
+
the family may be specified by adding a leading number to the group name,
|
|
4960
|
+
eg. C<0All> writes to the same family 0 group as the source). If no
|
|
4919
4961
|
destination group is specified, the information is written to the preferred
|
|
4920
4962
|
group. Whitespace around the C<E<gt>> or C<E<lt>> is ignored. As a
|
|
4921
4963
|
convenience, C<-tagsFromFile @> is assumed for any redirected tags which are
|
|
@@ -5477,7 +5519,7 @@ with this command:
|
|
|
5477
5519
|
|
|
5478
5520
|
produces output like this:
|
|
5479
5521
|
|
|
5480
|
-
-- Generated by ExifTool 12.
|
|
5522
|
+
-- Generated by ExifTool 12.57 --
|
|
5481
5523
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5482
5524
|
(f/5.6, 1/60s, ISO 100)
|
|
5483
5525
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6110,7 +6152,7 @@ If a password is required but not given, a warning is issued and the
|
|
|
6110
6152
|
document is not processed. This option is ignored if a password is not
|
|
6111
6153
|
required.
|
|
6112
6154
|
|
|
6113
|
-
=item B<-progress>[:[I<TITLE>]]
|
|
6155
|
+
=item B<-progress>[NUM][:[I<TITLE>]]
|
|
6114
6156
|
|
|
6115
6157
|
Show the progress when processing files. Without a colon, the B<-progress>
|
|
6116
6158
|
option adds a progress count in brackets after the name of each processed
|
|
@@ -6118,17 +6160,19 @@ file, giving the current file number and the total number of files to be
|
|
|
6118
6160
|
processed. Implies the B<-v0> option, causing the names of processed files
|
|
6119
6161
|
to also be printed when writing. When combined with the B<-if> option, the
|
|
6120
6162
|
total count includes all files before the condition is applied, but files
|
|
6121
|
-
that fail the condition will not have their names printed.
|
|
6163
|
+
that fail the condition will not have their names printed. If NUM is
|
|
6164
|
+
specified, the progress is shown every NUM input files.
|
|
6122
6165
|
|
|
6123
6166
|
If followed by a colon (ie. B<-progress:>), the console window title is set
|
|
6124
6167
|
according to the specified I<TITLE> string. If no I<TITLE> is given, a
|
|
6125
6168
|
default I<TITLE> string of "ExifTool %p%%" is assumed. In the string, %f
|
|
6126
6169
|
represents the file name, %p is the progress as a percent, %r is the
|
|
6127
|
-
progress as a ratio, %##b is a progress bar of width "##" (
|
|
6128
|
-
|
|
6129
|
-
|
|
6130
|
-
|
|
6131
|
-
to
|
|
6170
|
+
progress as a ratio, %##b is a progress bar of width "##" (where "##" is an
|
|
6171
|
+
integer specifying the bar width in characters, or 20 characters by default
|
|
6172
|
+
if "##" is omitted), and %% is a % character. May be combined with the
|
|
6173
|
+
normal B<-progress> option to also show the progress count in console
|
|
6174
|
+
messages. (Note: For this feature to function correctly on Mac/Linux, stderr
|
|
6175
|
+
must go to the console.)
|
|
6132
6176
|
|
|
6133
6177
|
=item B<-q> (B<-quiet>)
|
|
6134
6178
|
|
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
|
35
35
|
use Image::ExifTool::Validate;
|
|
36
36
|
use Image::ExifTool::MacOS;
|
|
37
37
|
|
|
38
|
-
$VERSION = '3.
|
|
38
|
+
$VERSION = '3.51';
|
|
39
39
|
@ISA = qw(Exporter);
|
|
40
40
|
|
|
41
41
|
sub NumbersFirst($$);
|
|
@@ -445,6 +445,11 @@ QuickTime-based files; it extracts other track-specific and timed metadata,
|
|
|
445
445
|
but can not yet edit tags in these locations (with the exception of
|
|
446
446
|
track-level date/time tags).
|
|
447
447
|
|
|
448
|
+
Beware that the Keys tags are actually stored inside the ItemList in the
|
|
449
|
+
file, so deleting the ItemList group as a block (ie. C<-ItemList:all=>) also
|
|
450
|
+
deletes Keys tags. Instead, to preserve Keys tags the ItemList tags may be
|
|
451
|
+
deleted individually with C<-QuickTime:ItemList:all=>.
|
|
452
|
+
|
|
448
453
|
Alternate language tags may be accessed for
|
|
449
454
|
L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
|
|
450
455
|
L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding
|
|
@@ -1051,7 +1056,7 @@ TagID: foreach $tagID (@keys) {
|
|
|
1051
1056
|
if ($$tagInfo{SubIFD}) {
|
|
1052
1057
|
warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
|
|
1053
1058
|
} else {
|
|
1054
|
-
warn "Warning: SubIFD flag not set for $short $name\n" if $isSub;
|
|
1059
|
+
warn "Warning: SubIFD flag not set for $short $name\n" if $isSub and not $processBinaryData;
|
|
1055
1060
|
}
|
|
1056
1061
|
if ($$tagInfo{Notes}) {
|
|
1057
1062
|
my $note = $$tagInfo{Notes};
|
|
@@ -318,6 +318,10 @@ my %fpxFileType = (
|
|
|
318
318
|
unrecognized Windows Compound Binary file as a FlashPix (FPX) file. See
|
|
319
319
|
L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix
|
|
320
320
|
specification.
|
|
321
|
+
|
|
322
|
+
Note that Microsoft is not consistent with the time zone used for some
|
|
323
|
+
date/time tags, and it may be either UTC or local time depending on the
|
|
324
|
+
software used to create the file.
|
|
321
325
|
},
|
|
322
326
|
"\x05SummaryInformation" => {
|
|
323
327
|
Name => 'SummaryInfo',
|
|
@@ -482,13 +482,13 @@ sub PrintTimeStamp($)
|
|
|
482
482
|
#------------------------------------------------------------------------------
|
|
483
483
|
# Convert degrees to DMS, or whatever the current settings are
|
|
484
484
|
# Inputs: 0) ExifTool reference, 1) Value in degrees,
|
|
485
|
-
# 2) format code (0=no format, 1=CoordFormat, 2=XMP format)
|
|
485
|
+
# 2) format code (0=no format, 1=CoordFormat, 2=XMP format, 3=signed unformatted)
|
|
486
486
|
# 3) 'N' or 'E' if sign is significant and N/S/E/W should be added
|
|
487
487
|
# Returns: DMS string
|
|
488
488
|
sub ToDMS($$;$$)
|
|
489
489
|
{
|
|
490
490
|
my ($et, $val, $doPrintConv, $ref) = @_;
|
|
491
|
-
my ($fmt, @fmt, $num, $sign, $rtnVal);
|
|
491
|
+
my ($fmt, @fmt, $num, $sign, $rtnVal, $neg);
|
|
492
492
|
|
|
493
493
|
unless (length $val) {
|
|
494
494
|
# don't convert an empty value
|
|
@@ -505,6 +505,10 @@ sub ToDMS($$;$$)
|
|
|
505
505
|
}
|
|
506
506
|
$ref = " $ref" unless $doPrintConv and $doPrintConv eq '2';
|
|
507
507
|
} else {
|
|
508
|
+
if ($doPrintConv and $doPrintConv eq '3') {
|
|
509
|
+
$neg = 1 if $val < 0;
|
|
510
|
+
$doPrintConv = 0;
|
|
511
|
+
}
|
|
508
512
|
$val = abs($val);
|
|
509
513
|
$ref = '';
|
|
510
514
|
}
|
|
@@ -554,6 +558,7 @@ sub ToDMS($$;$$)
|
|
|
554
558
|
# trim trailing zeros in XMP
|
|
555
559
|
$rtnVal =~ s/(\d)0+$ref$/$1$ref/ if $doPrintConv eq '2';
|
|
556
560
|
} else {
|
|
561
|
+
$neg and map { $_ *= -1 } @c;
|
|
557
562
|
$rtnVal = "@c$ref";
|
|
558
563
|
}
|
|
559
564
|
return $rtnVal;
|
|
@@ -59,7 +59,7 @@ my %jp2Map = (
|
|
|
59
59
|
# map of where information is written in a JXL image
|
|
60
60
|
my %jxlMap = (
|
|
61
61
|
IFD0 => 'Exif',
|
|
62
|
-
XMP => '
|
|
62
|
+
XMP => 'xml ',
|
|
63
63
|
'Exif' => 'JP2',
|
|
64
64
|
IFD1 => 'IFD0',
|
|
65
65
|
EXIF => 'IFD0', # to write EXIF as a block
|
|
@@ -827,8 +827,8 @@ sub CreateNewBoxes($$)
|
|
|
827
827
|
# add UUID boxes (and/or JXL Exif/XML boxes)
|
|
828
828
|
foreach $dirName (sort keys %$addDirs) {
|
|
829
829
|
# handle JPEG XL XMP and EXIF
|
|
830
|
-
if ($dirName eq '
|
|
831
|
-
my ($tag, $dir) = $dirName eq '
|
|
830
|
+
if ($dirName eq 'xml ' or $dirName eq 'Exif') {
|
|
831
|
+
my ($tag, $dir) = $dirName eq 'xml ' ? ('xml ', 'XMP') : ('Exif', 'EXIF');
|
|
832
832
|
my $tagInfo = $Image::ExifTool::Jpeg2000::Main{$tag};
|
|
833
833
|
$tagInfo = $$tagInfo[1] if ref $tagInfo eq 'ARRAY'; # (hack for stupid JXL XMP)
|
|
834
834
|
my $subdir = $$tagInfo{SubDirectory};
|
|
@@ -1123,8 +1123,8 @@ sub ProcessJpeg2000Box($$$)
|
|
|
1123
1123
|
my $subTable = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
|
|
1124
1124
|
if ($outfile) {
|
|
1125
1125
|
# remove this directory from our create list
|
|
1126
|
-
delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; # (eg. 'EXIF')
|
|
1127
|
-
delete $$et{AddJp2Dirs}{$boxID}; # (eg. 'Exif')
|
|
1126
|
+
delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; # (eg. 'EXIF' or 'XMP')
|
|
1127
|
+
delete $$et{AddJp2Dirs}{$boxID}; # (eg. 'Exif' or 'xml ')
|
|
1128
1128
|
my $newdir;
|
|
1129
1129
|
# only edit writable UUID, Exif and jp2h boxes
|
|
1130
1130
|
if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL}) or
|
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
14
14
|
use Image::ExifTool::Exif;
|
|
15
15
|
use Image::ExifTool::GPS;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.51';
|
|
18
18
|
|
|
19
19
|
sub ProcessMIE($$);
|
|
20
20
|
sub ProcessMIEGroup($$$);
|
|
@@ -391,7 +391,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
391
391
|
-30", "-40.5", "40 30 0.00 S"
|
|
392
392
|
},
|
|
393
393
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
|
394
|
-
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val,
|
|
394
|
+
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 3)',
|
|
395
395
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
|
396
396
|
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
|
|
397
397
|
},
|
|
@@ -404,7 +404,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
404
404
|
negative, but may be entered as positive numbers with a trailing 'W'
|
|
405
405
|
},
|
|
406
406
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
|
407
|
-
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val,
|
|
407
|
+
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 3)',
|
|
408
408
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
|
409
409
|
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
|
|
410
410
|
},
|