exiftool_vendored 12.59.0 → 12.61.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 +46 -6
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +83 -46
- data/bin/lib/Image/ExifTool/CanonRaw.pm +5 -1
- data/bin/lib/Image/ExifTool/Exif.pm +53 -14
- data/bin/lib/Image/ExifTool/FujiFilm.pm +6 -3
- data/bin/lib/Image/ExifTool/Geotag.pm +30 -7
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +31 -6
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -9
- data/bin/lib/Image/ExifTool/Nikon.pm +3 -3
- data/bin/lib/Image/ExifTool/PDF.pm +15 -6
- data/bin/lib/Image/ExifTool/PNG.pm +1 -6
- data/bin/lib/Image/ExifTool/QuickTime.pm +10 -0
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +51 -21
- data/bin/lib/Image/ExifTool/RIFF.pm +2 -9
- data/bin/lib/Image/ExifTool/Ricoh.pm +2 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +9 -3
- data/bin/lib/Image/ExifTool/Sony.pm +17 -10
- data/bin/lib/Image/ExifTool/TagLookup.pm +3 -2
- data/bin/lib/Image/ExifTool/TagNames.pod +5 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +2 -9
- data/bin/lib/Image/ExifTool/WritePDF.pl +7 -8
- data/bin/lib/Image/ExifTool/Writer.pl +40 -6
- data/bin/lib/Image/ExifTool/XMP.pm +13 -4
- data/bin/lib/Image/ExifTool.pm +102 -45
- 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: e42c8004f68374320f592b26a0d8ceaa0d44e09331c9be1f66986d2fe94ad7d0
|
4
|
+
data.tar.gz: eab311e1d2c27c522ed174ae054adc3d44e31c91992fdacbb6c6fb02e965da20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27e28a24360bd3651900c9db4b30ddff5517d777a8d6fa9723b80e758b71947697ca80e2149107be7ed6aac3c8b9ae37364d16126ddb2ee1a6c8aeaf8034e11a
|
7
|
+
data.tar.gz: 4845253fe922519e454c45d5e35e89b75a242ddf21183de8a6f5a32417d5cf814280161e46d2c722934175b4293f83ee1b0a2878bc6ea1c6fbd139cd105a6b25
|
data/bin/Changes
CHANGED
@@ -4,9 +4,50 @@ ExifTool Version History
|
|
4
4
|
|
5
5
|
RSS feed: https://exiftool.org/rss.xml
|
6
6
|
|
7
|
-
Note: The most recent production release is Version 12.
|
7
|
+
Note: The most recent production release is Version 12.60. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Apr. 24, 2023 - Version 12.61
|
11
|
+
|
12
|
+
- Added ImageDataMD5 support for J2C and JXL images
|
13
|
+
- Added support for PDF 2.0 (specification is finally freely available)
|
14
|
+
- Added ability to extract timed Accelerometer data from Azdome GS63H MP4
|
15
|
+
videos which don't contain GPS
|
16
|
+
- Added some new Sony lenses (thanks Jos Roost)
|
17
|
+
- Decode some new tags for the Sony ZV-E1 (thanks Jos Roost)
|
18
|
+
- Decode more tags for the Nikon Z30 (thanks Xavier)
|
19
|
+
- Enhanced -fileNUM option to allow tags from the main file to be used in the
|
20
|
+
file name string
|
21
|
+
- Validate sample offset and size when calculating ImageDataMD5 for MP4 videos
|
22
|
+
(note: may change ImageDataMD5 value for videos where audio data runs past
|
23
|
+
end of media data)
|
24
|
+
- Return error when attempting to write a fragmented JXL file
|
25
|
+
- Improved robustness for determining image size for corrupted JPEG
|
26
|
+
- Patched to allow Insta360 GPS records of unexpected length and tweaked
|
27
|
+
verification algorithm to determine validity of these records
|
28
|
+
- Fixed bug introduced in 12.57 where -progress:%f gave runtime warnings
|
29
|
+
- Fixed "--" option to ignore subsequent -common_args option
|
30
|
+
- Fixed incorrect ImageDataMD5 for Sony A100 ARW images
|
31
|
+
- Fixed problem reading new XMP-et:OriginalImageMD5 tag
|
32
|
+
|
33
|
+
Apr. 5, 2023 - Version 12.60 (production release)
|
34
|
+
|
35
|
+
- Added a new Sony FileFormat value
|
36
|
+
- Added Validate warning about duplicate EXIF
|
37
|
+
- Added ability to edit JPEG APP1 EXIF segment with incorrect header
|
38
|
+
- Decode a few new Sony ARW tags
|
39
|
+
- Improved -htmldump of non-EXIF-based maker notes
|
40
|
+
- Enhanced -geotag from CSV files support GPSSpeed (with variable units),
|
41
|
+
"bearing" for GPSTrack, and GPSDateTime in format "dd.mm.YYYY HH:MM:SS"
|
42
|
+
- Enhanced ImageDataMD5 to also support CRW, RAF, X3F and AVIF images
|
43
|
+
- Enhanced -efile option to also record updated and created file names
|
44
|
+
- Family 8 group names may now also be used in Composite Require/Desire tags
|
45
|
+
- Fixed handling of undefined tags in -if conditions to conform with
|
46
|
+
documentation and match -p and -tagsFromFile behaviour when -m or -f option
|
47
|
+
is used
|
48
|
+
- Fixed problem where setting the Geotime value didn't work when using an
|
49
|
+
advanced-formatting expression containing a greater-than symbol (>)
|
50
|
+
|
10
51
|
Mar. 28, 2023 - Version 12.59
|
11
52
|
|
12
53
|
- COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
|
@@ -20,14 +61,13 @@ Mar. 28, 2023 - Version 12.59
|
|
20
61
|
- Decode a new Olympus tag and improved decoding of another (thanks Herb)
|
21
62
|
- Decode a couple of new PanasonicRaw tags
|
22
63
|
- Decode image coordinates for a couple more VNT object types
|
23
|
-
- Enhanced ImageDataMD5 to also support MRW, CR3, PNG, MOV/MP4 and
|
24
|
-
files
|
64
|
+
- Enhanced ImageDataMD5 to also support MRW, CR3, IIQ, PNG, MOV/MP4 and some
|
65
|
+
RIFF-based files
|
25
66
|
- Improved verbose messages when deleting NikonApp trailer
|
26
67
|
- Patched to avoid structure warnings when copying tags from Nikon files
|
27
68
|
containing NKSC metadata
|
28
69
|
- Fixed %-C filename format code to work properly with the -fileOrder and
|
29
70
|
-progress options
|
30
|
-
- Fixed new ImageDataMD5 tag to work properly with PhaseOne IIQ files
|
31
71
|
- Fixed potential ValueConv warning when reading LIF files
|
32
72
|
- API Changes:
|
33
73
|
- Added SetAlternateFile method
|
@@ -196,6 +236,8 @@ Nov. 8, 2022 - Version 12.50 (production release)
|
|
196
236
|
- Fixed inconsistent year and time zone for Kenwood dashcam timed GPS in MP4
|
197
237
|
videos
|
198
238
|
|
239
|
+
History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
|
240
|
+
|
199
241
|
Oct. 19, 2022 - Version 12.49
|
200
242
|
|
201
243
|
- Added read support for Windows ICO and CUR files
|
@@ -363,8 +405,6 @@ June 1, 2022 - Version 12.42 (production release)
|
|
363
405
|
- Patched to allow PDF Encrypt object to be "null"
|
364
406
|
- Fixed bug reading ICC_Profile 'meta' tags
|
365
407
|
|
366
|
-
History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
|
367
|
-
|
368
408
|
Apr. 7, 2022 - Version 12.41
|
369
409
|
|
370
410
|
- Added support for "OM SYSTEM" maker notes
|
data/bin/MANIFEST
CHANGED
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.61.tar.gz | tar -xf -
|
111
|
+
cd Image-ExifTool-12.61
|
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.61';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
BEGIN {
|
@@ -365,13 +365,14 @@ sub Cleanup() {
|
|
365
365
|
|
366
366
|
# isolate arguments common to all commands
|
367
367
|
if (grep /^-common_args$/i, @ARGV) {
|
368
|
-
my (@newArgs, $common);
|
368
|
+
my (@newArgs, $common, $end);
|
369
369
|
foreach (@ARGV) {
|
370
|
-
if (/^-common_args$/i) {
|
370
|
+
if (/^-common_args$/i and not $end) {
|
371
371
|
$common = 1;
|
372
372
|
} elsif ($common) {
|
373
373
|
push @commonArgs, $_;
|
374
374
|
} else {
|
375
|
+
$end = 1 if $_ eq '--';
|
375
376
|
push @newArgs, $_;
|
376
377
|
}
|
377
378
|
}
|
@@ -922,12 +923,14 @@ for (;;) {
|
|
922
923
|
$mt->Options(Duplicates => 1);
|
923
924
|
next;
|
924
925
|
}
|
925
|
-
if (/^efile(\d)?(!)?$/i) {
|
926
|
+
if (/^efile(\d+)?(!)?$/i) {
|
926
927
|
my $arg = shift;
|
927
928
|
defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
|
928
|
-
$efile[0] = $arg if not $1 or $1 & 0x01
|
929
|
-
$efile[1] = $arg if $1 and $1 & 0x02;
|
930
|
-
$efile[2] = $arg if $1 and $1 & 0x04;
|
929
|
+
$efile[0] = $arg if not $1 or $1 & 0x01;# error
|
930
|
+
$efile[1] = $arg if $1 and $1 & 0x02; # unchanged
|
931
|
+
$efile[2] = $arg if $1 and $1 & 0x04; # failed -if condition
|
932
|
+
$efile[3] = $arg if $1 and $1 & 0x08; # updated
|
933
|
+
$efile[4] = $arg if $1 and $1 & 0x016; # created
|
931
934
|
unlink $arg if $2;
|
932
935
|
next;
|
933
936
|
}
|
@@ -1337,7 +1340,7 @@ for (;;) {
|
|
1337
1340
|
AddSetTagsFile($setTagsFile = '@') if not $setTagsFile and /(<|>)/;
|
1338
1341
|
if ($setTagsFile) {
|
1339
1342
|
push @{$setTags{$setTagsFile}}, $_;
|
1340
|
-
if (
|
1343
|
+
if ($1 eq '>') {
|
1341
1344
|
$useMWG = 1 if /^(.*>\s*)?mwg:/si;
|
1342
1345
|
if (/\b(filename|directory|testname)#?$/i) {
|
1343
1346
|
$doSetFileName = 1;
|
@@ -1949,23 +1952,31 @@ sub GetImageInfo($$)
|
|
1949
1952
|
my (@foundTags, $info, $file, $ind, $g8);
|
1950
1953
|
|
1951
1954
|
# set window title for this file if necessary
|
1952
|
-
if (defined $windowTitle
|
1953
|
-
|
1954
|
-
|
1955
|
-
|
1956
|
-
|
1957
|
-
|
1958
|
-
|
1959
|
-
|
1960
|
-
|
1961
|
-
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
1966
|
-
|
1967
|
-
|
1968
|
-
|
1955
|
+
if (defined $windowTitle) {
|
1956
|
+
if ($progressCount >= $progressNext) {
|
1957
|
+
my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
|
1958
|
+
my $title = $windowTitle;
|
1959
|
+
my ($num, $denom) = split '/', $prog;
|
1960
|
+
my $frac = $num / ($denom || 1);
|
1961
|
+
my $n = $title =~ s/%(\d+)b/%b/ ? $1 : 20; # length of bar
|
1962
|
+
my $bar = int($frac * $n + 0.5);
|
1963
|
+
my %lkup = (
|
1964
|
+
b => ('I' x $bar) . ('.' x ($n - $bar)),
|
1965
|
+
f => $orig,
|
1966
|
+
p => int(100 * $frac + 0.5),
|
1967
|
+
r => $prog,
|
1968
|
+
'%'=> '%',
|
1969
|
+
);
|
1970
|
+
$title =~ s/%([%bfpr])/$lkup{$1}/eg;
|
1971
|
+
SetWindowTitle($title);
|
1972
|
+
if (defined $progressMax) {
|
1973
|
+
undef $progressNext;
|
1974
|
+
} else {
|
1975
|
+
$progressNext += $progressIncr;
|
1976
|
+
}
|
1977
|
+
}
|
1978
|
+
# ($progressMax is not defined for "-progress:%f")
|
1979
|
+
++$progressCount unless defined $progressMax;
|
1969
1980
|
}
|
1970
1981
|
unless (length $orig or $outOpt) {
|
1971
1982
|
Warn qq(Error: Zero-length file name - ""\n);
|
@@ -1991,7 +2002,11 @@ sub GetImageInfo($$)
|
|
1991
2002
|
}
|
1992
2003
|
# set alternate file names
|
1993
2004
|
foreach $g8 (sort keys %altFile) {
|
1994
|
-
my $altName =
|
2005
|
+
my $altName = $orig;
|
2006
|
+
# must double any '$' symbols in the original file name because
|
2007
|
+
# they are used for tag names in a -fileNUM argument
|
2008
|
+
$altName =~ s/\$/\$\$/g;
|
2009
|
+
$altName = FilenameSPrintf($altFile{$g8}, $altName);
|
1995
2010
|
$et->SetAlternateFile($g8, $altName);
|
1996
2011
|
}
|
1997
2012
|
|
@@ -2083,6 +2098,7 @@ sub GetImageInfo($$)
|
|
2083
2098
|
push @delFiles, $original;
|
2084
2099
|
} elsif ($et->Rename($original, $file)) {
|
2085
2100
|
$verbose and print $vout "Restored from $original\n";
|
2101
|
+
EFile($file, 3);
|
2086
2102
|
++$countGoodWr;
|
2087
2103
|
} else {
|
2088
2104
|
Warn "Error renaming $original\n";
|
@@ -2533,6 +2549,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2533
2549
|
$xtra .= " et:table='${table}'";
|
2534
2550
|
$xtra .= " et:index='${index}'" if defined $index;
|
2535
2551
|
}
|
2552
|
+
# Note: New $xtra attributes must be added to %ignoreEtProp in XMP.pm!
|
2536
2553
|
my $lastVal = $val;
|
2537
2554
|
for ($valNum=0; $valNum<2; ++$valNum) {
|
2538
2555
|
$val = FormatXML($val, $ind, $group);
|
@@ -3042,6 +3059,7 @@ sub SetImageInfo($$$)
|
|
3042
3059
|
$r3 = $et->SetSystemTags($file);
|
3043
3060
|
}
|
3044
3061
|
if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
|
3062
|
+
EFile($infile, 3);
|
3045
3063
|
++$countGoodWr;
|
3046
3064
|
} elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
|
3047
3065
|
EFile($infile);
|
@@ -3156,6 +3174,7 @@ sub SetImageInfo($$$)
|
|
3156
3174
|
$preserveTime{$file} = [ $aTime, $mTime, $cTime ];
|
3157
3175
|
}
|
3158
3176
|
}
|
3177
|
+
EFile($infile, 3);
|
3159
3178
|
++$countGoodWr;
|
3160
3179
|
} else {
|
3161
3180
|
close(NEW_FILE);
|
@@ -3171,6 +3190,7 @@ sub SetImageInfo($$$)
|
|
3171
3190
|
# simply rename temporary file to replace original
|
3172
3191
|
# (if we didn't already rename it to add "_original")
|
3173
3192
|
} elsif ($et->Rename($tmpFile, $dstFile)) {
|
3193
|
+
EFile($infile, 3);
|
3174
3194
|
++$countGoodWr;
|
3175
3195
|
} else {
|
3176
3196
|
my $newFile = $tmpFile;
|
@@ -3188,21 +3208,26 @@ sub SetImageInfo($$$)
|
|
3188
3208
|
# (don't delete tmp file now because it is all we have left)
|
3189
3209
|
++$countBadWr;
|
3190
3210
|
} else {
|
3211
|
+
EFile($infile, 3);
|
3191
3212
|
++$countGoodWr;
|
3192
3213
|
}
|
3193
3214
|
}
|
3194
3215
|
} elsif ($overwriteOrig) {
|
3195
3216
|
# erase original file
|
3217
|
+
EFile($infile, 3);
|
3196
3218
|
$et->Unlink($file) or Warn "Error erasing original $file\n";
|
3197
3219
|
++$countGoodWr;
|
3198
3220
|
} else {
|
3221
|
+
EFile($infile, 4);
|
3199
3222
|
++$countGoodCr;
|
3200
3223
|
}
|
3201
3224
|
} else {
|
3202
3225
|
# this file was created from scratch, not edited
|
3226
|
+
EFile($infile, 4);
|
3203
3227
|
++$countGoodCr;
|
3204
3228
|
}
|
3205
3229
|
} else {
|
3230
|
+
EFile($infile, 3);
|
3206
3231
|
++$countGoodWr;
|
3207
3232
|
}
|
3208
3233
|
} elsif ($success) {
|
@@ -3689,7 +3714,7 @@ sub ProcessFiles($;$)
|
|
3689
3714
|
if (defined $progressMax) {
|
3690
3715
|
unless (defined $progressNext) {
|
3691
3716
|
$progressNext = $progressCount + $progressIncr;
|
3692
|
-
$progressNext -= $progressNext % $progressIncr;
|
3717
|
+
$progressNext -= $progressNext % $progressIncr; # (show even multiples)
|
3693
3718
|
$progressNext = $progressMax if $progressNext > $progressMax;
|
3694
3719
|
}
|
3695
3720
|
++$progressCount;
|
@@ -4439,7 +4464,7 @@ sub ReadStayOpen($)
|
|
4439
4464
|
|
4440
4465
|
#------------------------------------------------------------------------------
|
4441
4466
|
# Add new entry to -efile output file
|
4442
|
-
# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed)
|
4467
|
+
# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed, 3=updated, 4=created)
|
4443
4468
|
sub EFile($$)
|
4444
4469
|
{
|
4445
4470
|
my $entry = shift;
|
@@ -4468,7 +4493,7 @@ sub Progress($$)
|
|
4468
4493
|
my ($file, $msg) = @_;
|
4469
4494
|
if (defined $progStr) {
|
4470
4495
|
print $file $msg, $progStr, "\n";
|
4471
|
-
undef $progressNext;
|
4496
|
+
undef $progressNext if defined $progressMax;
|
4472
4497
|
}
|
4473
4498
|
}
|
4474
4499
|
|
@@ -4658,7 +4683,7 @@ L<Tag operations|/Tag operations>
|
|
4658
4683
|
-TAG or --TAG Extract or exclude specified tag
|
4659
4684
|
-TAG[+-^]=[VALUE] Write new value for tag
|
4660
4685
|
-TAG[+-]<=DATFILE Write tag value from contents of file
|
4661
|
-
-TAG[+-]<SRCTAG
|
4686
|
+
-[+]TAG[+-]<SRCTAG Copy tag value (see -tagsFromFile)
|
4662
4687
|
|
4663
4688
|
-tagsFromFile SRCFILE Copy tag values from file
|
4664
4689
|
-x TAG (-exclude) Exclude specified tag
|
@@ -5301,12 +5326,12 @@ escaped. The inverse conversion is applied when writing tags.
|
|
5301
5326
|
|
5302
5327
|
=item B<-f> (B<-forcePrint>)
|
5303
5328
|
|
5304
|
-
Force printing of tags even if
|
5305
|
-
|
5306
|
-
|
5307
|
-
|
5308
|
-
MissingTagValue option.
|
5309
|
-
B<-listx> output, or to allow tags to be deleted when writing with the
|
5329
|
+
Force printing of tags even if they don't exist. This option applies to
|
5330
|
+
tags specified on the command line, or with the B<-p>, B<-if> or
|
5331
|
+
B<-tagsFromFile> options. When B<-f> is used, the value of any missing tag
|
5332
|
+
is set to a dash (C<->) by default, but this may be configured via the API
|
5333
|
+
MissingTagValue option. B<-f> is also used to add a 'flags' attribute to
|
5334
|
+
the B<-listx> output, or to allow tags to be deleted when writing with the
|
5310
5335
|
B<-csv>=I<CSVFILE> feature.
|
5311
5336
|
|
5312
5337
|
=item B<-g>[I<NUM>][:I<NUM>...] (B<-groupHeadings>)
|
@@ -5530,7 +5555,7 @@ with this command:
|
|
5530
5555
|
|
5531
5556
|
produces output like this:
|
5532
5557
|
|
5533
|
-
-- Generated by ExifTool 12.
|
5558
|
+
-- Generated by ExifTool 12.61 --
|
5534
5559
|
File: a.jpg - 2003:10:31 15:44:19
|
5535
5560
|
(f/5.6, 1/60s, ISO 100)
|
5536
5561
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6512,10 +6537,11 @@ exit status of the command (see L</EXIT STATUS>).
|
|
6512
6537
|
|
6513
6538
|
Save the names of files giving errors (I<NUM> missing or 1), files that were
|
6514
6539
|
unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
|
6515
|
-
|
6516
|
-
|
6517
|
-
|
6518
|
-
I<ERRFILE>
|
6540
|
+
files that were updated (I<NUM> is 8), files that were created (I<NUM> is
|
6541
|
+
16), or any combination thereof by summing I<NUM> (eg. B<-efile3> is the
|
6542
|
+
same has having both B<-efile> and B<-efile2> options with the same
|
6543
|
+
I<ERRFILE>). By default, file names are appended to any existing I<ERRFILE>,
|
6544
|
+
but I<ERRFILE> is overwritten if an exclamation point is added to the option
|
6519
6545
|
(eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
|
6520
6546
|
option if applicable.
|
6521
6547
|
|
@@ -6532,11 +6558,22 @@ option no longer suppresses the output "{readyNUM}" message.
|
|
6532
6558
|
|
6533
6559
|
=item B<-file>I<NUM> I<ALTFILE>
|
6534
6560
|
|
6535
|
-
Read tags from an alternate source file.
|
6536
|
-
|
6537
|
-
|
6538
|
-
|
6539
|
-
B<-
|
6561
|
+
Read tags from an alternate source file. Among other things, this allows
|
6562
|
+
tags from different files to be compared and combined using the B<-if> and
|
6563
|
+
B<-p> options. Tags from alternate files are accessed via the corresponding
|
6564
|
+
family 8 group name (eg. C<File1:TAG> for the B<-file1> option, C<File2:TAG>
|
6565
|
+
for B<-file2>, etc). I<ALTFILE> may contain filename formatting codes like
|
6566
|
+
the B<-w> option (%d, %f, etc) , and/or tag names with a leading C<$> symbol
|
6567
|
+
in the same way as the B<-p> option (so any other dollar symbol in the file
|
6568
|
+
name must be doubled, eg. C<money$$.jpg>). For example, assuming that the
|
6569
|
+
OriginalFileName tag has been set in the edited file, a command to copy
|
6570
|
+
Rights from the original file could look like this:
|
6571
|
+
|
6572
|
+
exiftool -file1 '$originalfilename' '-rights<file1:rights' edited.jpg
|
6573
|
+
|
6574
|
+
Tag names in a B<-fileNUM> argument may access any tag from the original
|
6575
|
+
file except for Composite tags, and any tag from earlier (alphabetically
|
6576
|
+
sorted) B<-fileNUM> options (including Composite tags).
|
6540
6577
|
|
6541
6578
|
=item B<-list_dir>
|
6542
6579
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::Exif;
|
22
22
|
use Image::ExifTool::Canon;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.60';
|
25
25
|
|
26
26
|
sub WriteCRW($$);
|
27
27
|
sub ProcessCanonRaw($$$);
|
@@ -698,6 +698,10 @@ sub ProcessCanonRaw($$$)
|
|
698
698
|
$format ne 'string' and not $subdir;
|
699
699
|
} else {
|
700
700
|
$valueDataPos = $ptr;
|
701
|
+
# do MD5 of image data if requested
|
702
|
+
if ($$et{ImageDataMD5} and $tagID == 0x2005) {
|
703
|
+
$raf->Seek($ptr, 0) and $et->ImageDataMD5($raf, $size, 'raw');
|
704
|
+
}
|
701
705
|
if ($size <= 512 or ($verbose > 2 and $size <= 65536)
|
702
706
|
or ($tagInfo and ($$tagInfo{SubDirectory}
|
703
707
|
or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) )))
|
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
57
57
|
use Image::ExifTool::MakerNotes;
|
58
58
|
|
59
|
-
$VERSION = '4.
|
59
|
+
$VERSION = '4.44';
|
60
60
|
|
61
61
|
sub ProcessExif($$$);
|
62
62
|
sub WriteExif($$$);
|
@@ -1511,9 +1511,10 @@ my %opcodeInfo = (
|
|
1511
1511
|
0x7031 => {
|
1512
1512
|
Name => 'VignettingCorrection',
|
1513
1513
|
Notes => 'found in Sony ARW images',
|
1514
|
-
Protected => 1,
|
1515
1514
|
Writable => 'int16s',
|
1516
1515
|
WriteGroup => 'SubIFD',
|
1516
|
+
Permanent => 1,
|
1517
|
+
Protected => 1,
|
1517
1518
|
PrintConv => {
|
1518
1519
|
256 => 'Off',
|
1519
1520
|
257 => 'Auto',
|
@@ -1524,17 +1525,19 @@ my %opcodeInfo = (
|
|
1524
1525
|
0x7032 => {
|
1525
1526
|
Name => 'VignettingCorrParams', #forum7640
|
1526
1527
|
Notes => 'found in Sony ARW images',
|
1527
|
-
Protected => 1,
|
1528
1528
|
Writable => 'int16s',
|
1529
1529
|
WriteGroup => 'SubIFD',
|
1530
1530
|
Count => 17,
|
1531
|
+
Permanent => 1,
|
1532
|
+
Protected => 1,
|
1531
1533
|
},
|
1532
1534
|
0x7034 => {
|
1533
1535
|
Name => 'ChromaticAberrationCorrection',
|
1534
1536
|
Notes => 'found in Sony ARW images',
|
1535
|
-
Protected => 1,
|
1536
1537
|
Writable => 'int16s',
|
1537
1538
|
WriteGroup => 'SubIFD',
|
1539
|
+
Permanent => 1,
|
1540
|
+
Protected => 1,
|
1538
1541
|
PrintConv => {
|
1539
1542
|
0 => 'Off',
|
1540
1543
|
1 => 'Auto',
|
@@ -1544,17 +1547,19 @@ my %opcodeInfo = (
|
|
1544
1547
|
0x7035 => {
|
1545
1548
|
Name => 'ChromaticAberrationCorrParams', #forum6509
|
1546
1549
|
Notes => 'found in Sony ARW images',
|
1547
|
-
Protected => 1,
|
1548
1550
|
Writable => 'int16s',
|
1549
1551
|
WriteGroup => 'SubIFD',
|
1550
1552
|
Count => 33,
|
1553
|
+
Permanent => 1,
|
1554
|
+
Protected => 1,
|
1551
1555
|
},
|
1552
1556
|
0x7036 => {
|
1553
1557
|
Name => 'DistortionCorrection',
|
1554
1558
|
Notes => 'found in Sony ARW images',
|
1555
|
-
Protected => 1,
|
1556
1559
|
Writable => 'int16s',
|
1557
1560
|
WriteGroup => 'SubIFD',
|
1561
|
+
Permanent => 1,
|
1562
|
+
Protected => 1,
|
1558
1563
|
PrintConv => {
|
1559
1564
|
0 => 'Off',
|
1560
1565
|
1 => 'Auto',
|
@@ -1565,10 +1570,38 @@ my %opcodeInfo = (
|
|
1565
1570
|
0x7037 => {
|
1566
1571
|
Name => 'DistortionCorrParams', #forum6509
|
1567
1572
|
Notes => 'found in Sony ARW images',
|
1568
|
-
Protected => 1,
|
1569
1573
|
Writable => 'int16s',
|
1570
1574
|
WriteGroup => 'SubIFD',
|
1571
1575
|
Count => 17,
|
1576
|
+
Permanent => 1,
|
1577
|
+
Protected => 1,
|
1578
|
+
},
|
1579
|
+
0x7038 => { #github#195 (Sony ARW)
|
1580
|
+
Name => 'SonyRawImageSize',
|
1581
|
+
Notes => 'size of actual image in Sony ARW files',
|
1582
|
+
Writable => 'int32u',
|
1583
|
+
WriteGroup => 'SubIFD',
|
1584
|
+
Count => 2,
|
1585
|
+
Permanent => 1,
|
1586
|
+
Protected => 1,
|
1587
|
+
},
|
1588
|
+
0x7310 => { #github#195 (Sony ARW)
|
1589
|
+
Name => 'BlackLevel',
|
1590
|
+
Notes => 'found in Sony ARW images',
|
1591
|
+
Writable => 'int16u',
|
1592
|
+
WriteGroup => 'SubIFD',
|
1593
|
+
Count => 4,
|
1594
|
+
Permanent => 1,
|
1595
|
+
Protected => 1,
|
1596
|
+
},
|
1597
|
+
0x7313 => { #github#195 (Sony ARW)
|
1598
|
+
Name => 'WB_RGGBLevels',
|
1599
|
+
Notes => 'found in Sony ARW images',
|
1600
|
+
Writable => 'int16s',
|
1601
|
+
WriteGroup => 'SubIFD',
|
1602
|
+
Count => 4,
|
1603
|
+
Permanent => 1,
|
1604
|
+
Protected => 1,
|
1572
1605
|
},
|
1573
1606
|
0x74c7 => { #IB (in ARW images from some Sony cameras)
|
1574
1607
|
Name => 'SonyCropTopLeft',
|
@@ -5893,9 +5926,7 @@ sub ProcessExif($$$)
|
|
5893
5926
|
my $base = $$dirInfo{Base} || 0;
|
5894
5927
|
my $firstBase = $base;
|
5895
5928
|
my $raf = $$dirInfo{RAF};
|
5896
|
-
my $verbose =
|
5897
|
-
my $validate = $et->Options('Validate');
|
5898
|
-
my $saveFormat = $et->Options('SaveFormat');
|
5929
|
+
my ($verbose,$validate,$saveFormat) = @{$$et{OPTIONS}}{qw(Verbose Validate SaveFormat)};
|
5899
5930
|
my $htmlDump = $$et{HTML_DUMP};
|
5900
5931
|
my $success = 1;
|
5901
5932
|
my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName, $doMD5);
|
@@ -5914,7 +5945,12 @@ sub ProcessExif($$$)
|
|
5914
5945
|
$isExif and $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
|
5915
5946
|
{
|
5916
5947
|
my $path = $et->MetadataPath();
|
5917
|
-
|
5948
|
+
if ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) {
|
5949
|
+
unless ($$et{DOC_NUM}) {
|
5950
|
+
$et->Warn("Duplicate EXIF at $path") if $$et{HasExif};
|
5951
|
+
$$et{HasExif} = 1;
|
5952
|
+
}
|
5953
|
+
} else {
|
5918
5954
|
if ($Image::ExifTool::MWG::strict) {
|
5919
5955
|
$et->Warn("Ignored non-standard EXIF at $path");
|
5920
5956
|
return 0;
|
@@ -6378,10 +6414,10 @@ sub ProcessExif($$$)
|
|
6378
6414
|
$tval .= " ($rational)" if defined $rational;
|
6379
6415
|
if ($htmlDump) {
|
6380
6416
|
my ($tagName, $colName);
|
6381
|
-
if ($
|
6382
|
-
$tagName = 'MakerNotes';
|
6383
|
-
} elsif ($tagInfo) {
|
6417
|
+
if ($tagInfo) {
|
6384
6418
|
$tagName = $$tagInfo{Name};
|
6419
|
+
} elsif ($tagID == 0x927c and $dirName eq 'ExifIFD') {
|
6420
|
+
$tagName = 'MakerNotes';
|
6385
6421
|
} else {
|
6386
6422
|
$tagName = sprintf("Tag 0x%.4x",$tagID);
|
6387
6423
|
}
|
@@ -6456,6 +6492,9 @@ sub ProcessExif($$$)
|
|
6456
6492
|
}
|
6457
6493
|
# add value data block (underlining maker notes data)
|
6458
6494
|
$et->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag, $sid);
|
6495
|
+
if ($subdir and $$tagInfo{MakerNotes} and $$tagInfo{NotIFD}) {
|
6496
|
+
$et->HDump($exifDumpPos,$size,"$tagName value",undef,undef,$$dirInfo{OffsetName});
|
6497
|
+
}
|
6459
6498
|
}
|
6460
6499
|
} else {
|
6461
6500
|
if ($tagID <= $lastID and not $inMakerNotes) {
|
@@ -1671,11 +1671,11 @@ sub ProcessRAF($$)
|
|
1671
1671
|
my ($rafNum, $ifdNum) = ('','');
|
1672
1672
|
foreach $offset (0x5c, 0x64, 0x78, 0x80) {
|
1673
1673
|
last if $offset >= $jpos;
|
1674
|
-
unless ($raf->Seek($offset, 0) and $raf->Read($buff,
|
1674
|
+
unless ($raf->Seek($offset, 0) and $raf->Read($buff, 8)) {
|
1675
1675
|
$warn = 1;
|
1676
1676
|
last;
|
1677
1677
|
}
|
1678
|
-
my $start = unpack('
|
1678
|
+
my ($start, $len) = unpack('N2',$buff);
|
1679
1679
|
next unless $start;
|
1680
1680
|
if ($offset == 0x64 or $offset == 0x80) {
|
1681
1681
|
# parse FujiIFD directory
|
@@ -1686,7 +1686,10 @@ sub ProcessRAF($$)
|
|
1686
1686
|
$$et{SET_GROUP1} = "FujiIFD$ifdNum";
|
1687
1687
|
my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD');
|
1688
1688
|
# this is TIFF-format data only for some models, so no warning if it fails
|
1689
|
-
$et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF)
|
1689
|
+
unless ($et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF)) {
|
1690
|
+
# do MD5 of image data if necessary
|
1691
|
+
$et->ImageDataMD5($raf, $len, 'raw') if $$et{ImageDataMD5} and $raf->Seek($start,0);
|
1692
|
+
}
|
1690
1693
|
delete $$et{SET_GROUP1};
|
1691
1694
|
$ifdNum = ($ifdNum || 1) + 1;
|
1692
1695
|
} else {
|