exiftool-vendored.exe 12.76.0 → 12.78.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.
Files changed (30) hide show
  1. package/bin/exiftool_files/Changes +46 -4
  2. package/bin/exiftool_files/README +3 -3
  3. package/bin/exiftool_files/config_files/example.config +10 -2
  4. package/bin/exiftool_files/exiftool.pl +50 -14
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +12 -9
  6. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +7 -1
  7. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +52 -4
  8. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +5 -3
  9. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  10. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.pm +237 -0
  11. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +2 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +5 -2
  14. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +9 -9
  15. package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -0
  16. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +19 -4
  17. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +2 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +3 -2
  19. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +3 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +5 -5
  21. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +1 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +183 -11
  23. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
  24. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +77 -3
  25. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +113 -4
  26. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +14 -1
  27. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +9 -8
  28. package/bin/exiftool_files/lib/Image/ExifTool.pm +163 -38
  29. package/bin/exiftool_files/lib/Image/ExifTool.pod +44 -25
  30. package/package.json +3 -3
@@ -7,6 +7,47 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.76. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Mar. 5, 2024 - Version 12.78 - "Geolocation"
11
+
12
+ - Added new Geolocation feature and write-only Geolocate tag
13
+ - Added new config file entry (@Image::ExifTool::UserDefined::Arguments) to
14
+ allow default command-line arguments to be specified
15
+ - Added print conversion for TIFF-EPStandardID
16
+ - Added ability to delete Nextbase information from MP4 videos
17
+ - Decode timed GPS from MP4 videos written by Nextbase software
18
+ - Decode a number of new tags from Nextbase MP4 videos
19
+ - Decode a few new tags from Garmin MP4 videos
20
+ - Extract PreviewJXL images from DNG 1.7 files
21
+ - Generate Validate, ImageDataHash and UserParam tags earlier to allow them to
22
+ be used in UserDefined Composite tags
23
+ - Enhanced the -c option so a minus sign in the format specification prints a
24
+ signed coordinate without a leading "+" for positive numbers
25
+ - Changed formatting of some Accelerometer tags for consistency
26
+ - Changed behaviour of -ee3 option to do a brute-force scan for freeGPS in the
27
+ media data even when referenced by 'gps ' atom
28
+ - Other internal changes to decoding of timed GPS from videos
29
+ - Fixed problem were ExifTool would give up on extracting some types of timed
30
+ GPS from videos after 100 void fixes
31
+ - Fixed bug that could cause runtime error when reading Ogg files
32
+ - Fixed issue where some tags from alternate files using the -fileNUM option
33
+ weren't generated as requested
34
+ - API Changes:
35
+ - Added Geolocation,
36
+ GeolocMaxDist and
37
+ GeolocMinPop API options
38
+
39
+ Feb. 16, 2024 - Version 12.77
40
+
41
+ - Added new Olympus CameraType and LensType value (thanks herb)
42
+ - Added a new Canon Irix LensType
43
+ - Added the ability to delete MacOS XAttrMDItemWhereFroms
44
+ - Decode a few new Canon DPP tags (thanks John Moyer)
45
+ - Decode timed GPS from Adzome GS65H MOV videos
46
+ - Improved handling of XML-unfriendly characters in JSON field names (fixes
47
+ issue where -X option could produce invalid XML when reading JSON with the
48
+ -struct option)
49
+ - Fixed decoding of ShutterCount for Canon G5X-ii CR3 files
50
+
10
51
  Jan. 31, 2024 - Version 12.76 (production release)
11
52
 
12
53
  - Properly implement patch of 12.45 to avoid duplicating raw data when writing
@@ -19,6 +60,7 @@ Jan. 30, 2024 - Version 12.75 (production release)
19
60
  - CORRUPTION WARNING: Fixed bug introduced in 12.45 which could result in
20
61
  corrupted Sony ARW images from some newer models when rewriting lossless
21
62
  compressed ARW images which were previously edited by 12.44 or earlier
63
+ (the corruption is repairable, but requires a special version of ExifTool)
22
64
  - Added ability to read C2PA JUMBF metadata from PDF and SVG files
23
65
  - Added ability to extract JUMBF metadata as a block
24
66
  - Added read support for C2PA (JUMBF-format) files
@@ -547,7 +589,7 @@ Oct. 13, 2022 - Version 12.48
547
589
  "Z" are actually in Zulu time -- a bit of a mess really)
548
590
  - Prevent dynamically-generated Unknown tags from being extracted when the
549
591
  -validate option is used without -u
550
- - Patched to better handle irregular timestamps in streaming GPS of NextBase
592
+ - Patched to better handle irregular timestamps in streaming GPS of Nextbase
551
593
  dashcam videos
552
594
  - Fixed incompatibility with Sigma Photo Pro which could result in Sigma Photo
553
595
  Pro corrupting an ExifTool-edited X3F image (the section length in the
@@ -1419,7 +1461,7 @@ Mar. 19, 2020 - Version 11.92
1419
1461
  - Added a new Nikon LensID (thanks Wolfgang Exler)
1420
1462
  - Decode a few new Leica tags (thanks Tim Gray)
1421
1463
  - Decode AccelerometerData from Samsung Gear 360 videos
1422
- - Fixed a couple of problems decoding timed GPS metadata from NextBase dashcam
1464
+ - Fixed a couple of problems decoding timed GPS metadata from Nextbase dashcam
1423
1465
  videos
1424
1466
  - Fixed problem where -X option could produce invalid XML when reading
1425
1467
  corrupted XMP
@@ -2308,7 +2350,7 @@ Oct. 16, 2018 - Version 11.14
2308
2350
 
2309
2351
  Oct. 9, 2018 - Version 11.13
2310
2352
 
2311
- - Decode GPS from NextBase 512G dashcam MOV videos (different than 512GW)
2353
+ - Decode GPS from Nextbase 512G dashcam MOV videos (different than 512GW)
2312
2354
  - Added a new Canon LensType (thanks LibRaw)
2313
2355
  - Minor improvements to verbose dump of streaming GPS metadata
2314
2356
  - Reverted change of version 10.71 which resulted in Windows not recognizing
@@ -2327,7 +2369,7 @@ Oct. 2, 2018 - Version 11.12
2327
2369
  - Added a new Sony/Minolta LensType (thanks LibRaw and Jos Roost)
2328
2370
  - Added a new Nikon LensID
2329
2371
  - Decode a few new Sony SRF2 tags (thanks LibRaw)
2330
- - Decode GPS from NextBase 512GW dashcam MOV videos
2372
+ - Decode GPS from Nextbase 512GW dashcam MOV videos
2331
2373
  - Validate MS-DOC FIB before extracting contained tags
2332
2374
  - Fixed bug extracting GPSSpeed for some dashcam models
2333
2375
 
@@ -20,7 +20,7 @@ supported by ExifTool (r = read, w = write, c = create):
20
20
  3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
21
21
  7Z r | DV r | JPEG r/w | OFR r | RWZ r
22
22
  A r | DVB r/w | JSON r | OGG r | RM r
23
- AA r | DVR-MS r | JXL r | OGV r | SEQ r
23
+ AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
24
24
  AAC r | DYLIB r | K25 r | ONP r | SKETCH r
25
25
  AAE r | EIP r | KDC r | OPUS r | SO r
26
26
  AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-12.76.tar.gz | tar -xf -
113
- cd Image-ExifTool-12.76
112
+ gzip -dc Image-ExifTool-12.78.tar.gz | tar -xf -
113
+ cd Image-ExifTool-12.78
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
@@ -6,7 +6,8 @@
6
6
  # Notes: This example file shows how to define your own shortcuts and
7
7
  # add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well
8
8
  # as how to specify preferred lenses for the LensID tag, and
9
- # define new file types and default ExifTool option values.
9
+ # define new file types and default ExifTool API options and
10
+ # command-line arguments.
10
11
  #
11
12
  # Note that unknown tags may be extracted even if they aren't
12
13
  # defined, but tags must be defined to be written. Also note
@@ -345,7 +346,7 @@ use Image::ExifTool::MIE;
345
346
  use Image::ExifTool::QuickTime;
346
347
  $Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
347
348
 
348
- # Specify default ExifTool option values
349
+ # Specify default ExifTool API options
349
350
  # (see the Options function documentation for available options)
350
351
  %Image::ExifTool::UserDefined::Options = (
351
352
  CoordFormat => '%.6f', # change default GPS coordinate format
@@ -354,5 +355,12 @@ $Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
354
355
  RequestAll => 3, # request additional tags not normally generated
355
356
  );
356
357
 
358
+ # Specify default exiftool command-line arguments
359
+ # - inserted before all other options except -config
360
+ # - applies to all -execute'd commands
361
+ @Image::ExifTool::UserDefined::Arguments = (
362
+ '-i', 'HIDDEN', # ignore hidden files by default (names beginning with ".")
363
+ );
364
+
357
365
  #------------------------------------------------------------------------------
358
366
  1; #end
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.76';
14
+ my $version = '12.78';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -158,6 +158,7 @@ my $filtered; # flag indicating file was filtered by name
158
158
  my $filterFlag; # file filter flag (0x01=deny extensions, 0x02=allow extensions, 0x04=add ext)
159
159
  my $fixLen; # flag to fix description lengths when writing alternate languages
160
160
  my $forcePrint; # string to use for missing tag values (undef to not print them)
161
+ my $geoOnly; # flag to extract Geolocation tags only
161
162
  my $helped; # flag to avoid printing help if no tags specified
162
163
  my $html; # flag for html-formatted output (2=html dump)
163
164
  my $interrupted; # flag set if CTRL-C is pressed during a critical process
@@ -503,6 +504,7 @@ undef $fileHeader;
503
504
  undef $filtered;
504
505
  undef $fixLen;
505
506
  undef $forcePrint;
507
+ undef $geoOnly;
506
508
  undef $ignoreHidden;
507
509
  undef $joinLists;
508
510
  undef $langOpt;
@@ -600,6 +602,11 @@ if (not $preserveTime and $^O eq 'MSWin32') {
600
602
  $preserveTime = 2 if eval { require Win32::API } and eval { require Win32API::File };
601
603
  }
602
604
 
605
+ # add user-defined command-line arguments
606
+ if (@Image::ExifTool::UserDefined::Arguments) {
607
+ unshift @ARGV, @Image::ExifTool::UserDefined::Arguments;
608
+ }
609
+
603
610
  # parse command-line options in 2 passes...
604
611
  # pass 1: set all of our ExifTool options
605
612
  # pass 2: print all of our help and informational output (-list, -ver, etc)
@@ -1427,6 +1434,13 @@ if ($useMWG and not defined $mt->Options('CharsetEXIF')) {
1427
1434
  $mt->Options(CharsetEXIF => 'UTF8');
1428
1435
  }
1429
1436
 
1437
+ # allow geolocation without input file if set to a position
1438
+ if (not @files and not $outOpt and not @newValues) {
1439
+ my $loc = $mt->Options('Geolocation');
1440
+ # use undocumented feature to input JSON file directly from command line
1441
+ $loc and $loc =~ /,/ and push(@files, qq(\@JSON:{})), $geoOnly = 1;
1442
+ }
1443
+
1430
1444
  # print help
1431
1445
  unless ((@tags and not $outOpt) or @files or @newValues) {
1432
1446
  if ($doGlob and $doGlob == 2) {
@@ -2110,6 +2124,11 @@ sub GetImageInfo($$)
2110
2124
  # can't make use of $info if verbose because we must reprocess
2111
2125
  # the file anyway to generate the verbose output
2112
2126
  undef $info if $verbose or defined $fastCondition;
2127
+ } elsif ($file =~ s/^(\@JSON:)(.*)/$1/) {
2128
+ # read JSON file from command line
2129
+ my $dat = $2;
2130
+ $info = $et->ImageInfo(\$dat, \@foundTags);
2131
+ if ($geoOnly) { /^Geolocation/ or delete $$info{$_} foreach keys %$info }
2113
2132
  }
2114
2133
  if (defined $deleteOrig) {
2115
2134
  Progress($vout, "======== $file") if defined $verbose;
@@ -2166,7 +2185,7 @@ sub GetImageInfo($$)
2166
2185
  }
2167
2186
 
2168
2187
  # extract information from this file
2169
- unless ($file eq '-' or $et->Exists($file)) {
2188
+ unless ($file eq '-' or $et->Exists($file) or $info) {
2170
2189
  Warn "Error: File not found - $file\n";
2171
2190
  FileNotFound($file);
2172
2191
  defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
@@ -2351,7 +2370,7 @@ sub GetImageInfo($$)
2351
2370
  # set delimiters for JSON or PHP output
2352
2371
  ($bra, $ket, $sep) = $json == 1 ? ('{','}',':') : ('Array(',')',' =>');
2353
2372
  print $fp ",\n" if $comma;
2354
- print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file));
2373
+ print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file),1);
2355
2374
  $comma = 1;
2356
2375
  $ind = (defined $showGroup and not $allGroup) ? ' ' : ' ';
2357
2376
  } elsif ($csv) {
@@ -3369,7 +3388,22 @@ sub FormatXML($$$)
3369
3388
  my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val;
3370
3389
  foreach (@keys) {
3371
3390
  # (some variable-namespace XML structure fields may have a different group)
3372
- my $tok = /:/ ? $_ : ($grp . ':' . $_);
3391
+ my ($ns, $tg) = ($grp, $_);
3392
+ if (/^(.*?):(.*)/) {
3393
+ if ($grp eq 'JSON') {
3394
+ $tg =~ tr/:/_/; # colons in JSON structure elements are not namespaces
3395
+ } else {
3396
+ ($ns, $tg) = ($1, $2);
3397
+ }
3398
+ }
3399
+ # validate XML attribute name
3400
+ my $name;
3401
+ foreach $name ($ns, $tg) {
3402
+ # make sure name is valid for XML
3403
+ $name =~ tr/-_A-Za-z0-9.//dc;
3404
+ $name = '_' . $name if $name !~ /^[_A-Za-z]/;
3405
+ }
3406
+ my $tok = $ns . ':' . $tg;
3373
3407
  $val2 .= "\n$ind <$tok" . FormatXML($$val{$_}, "$ind ", $grp) . "</$tok>";
3374
3408
  }
3375
3409
  $val = "$val2\n$ind";
@@ -3512,7 +3546,7 @@ sub PrintCSV()
3512
3546
  }
3513
3547
 
3514
3548
  #------------------------------------------------------------------------------
3515
- # Add tag groups from structure fields to a list
3549
+ # Add tag groups from structure fields to a list for xmlns
3516
3550
  # Inputs: 0) tag value, 1) parent group, 2) group hash ref, 3) group list ref
3517
3551
  sub AddGroups($$$$)
3518
3552
  {
@@ -3520,7 +3554,7 @@ sub AddGroups($$$$)
3520
3554
  my ($key, $val2);
3521
3555
  if (ref $val eq 'HASH') {
3522
3556
  foreach $key (sort keys %$val) {
3523
- if ($key =~ /(.*?):/ and not $$groupHash{$1}) {
3557
+ if ($key =~ /^(.*?):/ and not $$groupHash{$1} and $grp ne 'JSON') {
3524
3558
  $$groupHash{$1} = $grp;
3525
3559
  push @$groupList, $1;
3526
3560
  }
@@ -4663,7 +4697,7 @@ DESCRIPTION
4663
4697
  3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
4664
4698
  7Z r | DV r | JPEG r/w | OFR r | RWZ r
4665
4699
  A r | DVB r/w | JSON r | OGG r | RM r
4666
- AA r | DVR-MS r | JXL r | OGV r | SEQ r
4700
+ AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
4667
4701
  AAC r | DYLIB r | K25 r | ONP r | SKETCH r
4668
4702
  AAE r | EIP r | KDC r | OPUS r | SO r
4669
4703
  AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
@@ -4831,7 +4865,7 @@ OPTIONS
4831
4865
  -common_args Define common arguments
4832
4866
  -config CFGFILE Specify configuration file name
4833
4867
  -echo[NUM] TEXT Echo text to stdout or stderr
4834
- -efile[NUM][!] ERRFILE Save names of files with errors
4868
+ -efile[NUM][!] TXTFILE Save names of files with errors
4835
4869
  -execute[NUM] Execute multiple commands on one line
4836
4870
  -fileNUM ALTFILE Load tags from alternate file
4837
4871
  -list_dir List directories, not their contents
@@ -5229,8 +5263,10 @@ OPTIONS
5229
5263
  different when copying tags using the -tagsFromFile option.
5230
5264
 
5231
5265
  2) If the hemisphere is known, a reference direction (N, S, E or W)
5232
- is appended to each printed coordinate, but adding a "+" to the
5233
- format specifier (eg. "%+.6f") prints a signed coordinate instead.
5266
+ is appended to each printed coordinate, but adding a "+" or "-" to
5267
+ the format specifier (eg. "%+.6f" or "%-.6f") prints a signed
5268
+ coordinate instead. ("+" adds a leading "+" for positive
5269
+ coordinates, but "-" does not.)
5234
5270
 
5235
5271
  3) This print formatting may be disabled with the -n option to
5236
5272
  extract coordinates as signed decimal degrees.
@@ -5627,7 +5663,7 @@ OPTIONS
5627
5663
 
5628
5664
  produces output like this:
5629
5665
 
5630
- -- Generated by ExifTool 12.76 --
5666
+ -- Generated by ExifTool 12.78 --
5631
5667
  File: a.jpg - 2003:10:31 15:44:19
5632
5668
  (f/5.6, 1/60s, ISO 100)
5633
5669
  File: b.jpg - 2006:05:23 11:57:38
@@ -6601,14 +6637,14 @@ OPTIONS
6601
6637
  -echo4, "${status}" may be used in the *TEXT* string to represent
6602
6638
  the numerical exit status of the command (see "EXIT STATUS").
6603
6639
 
6604
- -efile[*NUM*][!] *ERRFILE*
6640
+ -efile[*NUM*][!] *TXTFILE*
6605
6641
  Save the names of files giving errors (*NUM* missing or 1), files
6606
6642
  that were unchanged (*NUM* is 2), files that fail the -if condition
6607
6643
  (*NUM* is 4), files that were updated (*NUM* is 8), files that were
6608
6644
  created (*NUM* is 16), or any combination thereof by summing *NUM*
6609
6645
  (eg. -efile3 is the same has having both -efile and -efile2 options
6610
- with the same *ERRFILE*). By default, file names are appended to
6611
- any existing *ERRFILE*, but *ERRFILE* is overwritten if an
6646
+ with the same *TXTFILE*). By default, file names are appended to
6647
+ any existing *TXTFILE*, but *TXTFILE* is overwritten if an
6612
6648
  exclamation point is added to the option (eg. -efile!). Saves the
6613
6649
  name of the file specified by the -srcfile option if applicable.
6614
6650
 
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.73';
91
+ $VERSION = '4.74';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -203,7 +203,8 @@ $VERSION = '4.73';
203
203
  52 => 'Canon EF-S 18-55mm f/3.5-5.6 IS II', #PH
204
204
  53 => 'Canon EF-S 18-55mm f/3.5-5.6 III', #Jon Charnas
205
205
  54 => 'Canon EF-S 55-250mm f/4-5.6 IS II', #47
206
- 60 => 'Irix 11mm f/4', #50
206
+ 60 => 'Irix 11mm f/4 or 15mm f/2.4', #50
207
+ 60.1 => 'Irix 15mm f/2.4', #forum15655
207
208
  63 => 'Irix 30mm F1.4 Dragonfly', #IB
208
209
  80 => 'Canon TS-E 50mm f/2.8L Macro', #42
209
210
  81 => 'Canon TS-E 90mm f/2.8L Macro', #42
@@ -4731,6 +4732,7 @@ my %ciMaxFocal = (
4731
4732
  NOTES => 'CameraInfo tags for the PowerShot G5 X Mark II.',
4732
4733
  0x0293 => {
4733
4734
  Name => 'ShutterCount',
4735
+ Condition => '$$self{FileType} eq "JPEG"',
4734
4736
  Format => 'int32u',
4735
4737
  Notes => 'includes electronic + mechanical shutter',
4736
4738
  # - advances by 1 for each photo file, regardless of mechanical or electronic shutter
@@ -4738,26 +4740,27 @@ my %ciMaxFocal = (
4738
4740
  # - advances for time lapse video files
4739
4741
  # - creating a new directory or resetting the counter from the menu doesn't affect this shutter count
4740
4742
  },
4743
+ 0x0a95 => {
4744
+ Name => 'ShutterCount',
4745
+ Condition => '$$self{FileType} eq "CR3"',
4746
+ Format => 'int32u',
4747
+ Notes => 'includes electronic + mechanical shutter',
4748
+ },
4741
4749
  0x0b21 => {
4742
4750
  Name => 'DirectoryIndex',
4751
+ Condition => '$$self{FileType} eq "JPEG"',
4743
4752
  Groups => { 2 => 'Image' },
4744
4753
  Format => 'int32u',
4745
4754
  },
4746
4755
  0x0b2d => {
4747
4756
  Name => 'FileIndex',
4757
+ Condition => '$$self{FileType} eq "JPEG"',
4748
4758
  Format => 'int32u',
4749
4759
  Groups => { 2 => 'Image' },
4750
4760
  Format => 'int32u',
4751
4761
  ValueConv => '$val + 1',
4752
4762
  ValueConvInv => '$val - 1',
4753
4763
  },
4754
- #0x0b39 => {
4755
- # Name => 'DirectoryIndex',
4756
- # Groups => { 2 => 'Image' },
4757
- # Format => 'int32u',
4758
- # ValueConv => '$val - 1',
4759
- # ValueConvInv => '$val + 1',
4760
- #},
4761
4764
  );
4762
4765
 
4763
4766
  # Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH)
@@ -23,7 +23,7 @@ use vars qw($VERSION);
23
23
  use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Canon;
25
25
 
26
- $VERSION = '1.37';
26
+ $VERSION = '1.38';
27
27
 
28
28
  sub ProcessCanonVRD($$;$);
29
29
  sub WriteCanonVRD($$;$);
@@ -51,6 +51,7 @@ my %vrdFormat = (
51
51
  8 => 'int32u',
52
52
  9 => 'int32s',
53
53
  13 => 'double',
54
+ 24 => 'int32s', # (rectangle coordinates)
54
55
  33 => 'int32u', # (array)
55
56
  38 => 'double', # (array)
56
57
  # 254 => 'undef', ?
@@ -1226,6 +1227,11 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
1226
1227
  # 0x20a08 - (unknown picture style settings)
1227
1228
  # 0x20a09 - Custom picture style settings
1228
1229
  # 0x20a20 - Fine Detail picture style settings
1230
+ 0x20b10 => 'DPRAWMicroadjustBackFront', #forum15660
1231
+ 0x20b12 => 'DPRAWMicroadjustStrength', #forum15660
1232
+ 0x20b20 => 'DPRAWBokehShift', #forum15660
1233
+ 0x20b21 => 'DPRAWBokehShiftArea', #PH
1234
+ 0x20b30 => 'DPRAWGhostingReductionArea', #forum15660
1229
1235
  0x30101 => {
1230
1236
  Name => 'CropAspectRatio',
1231
1237
  PrintConv => {
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.50';
60
+ $VERSION = '4.51';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -593,6 +593,14 @@ my %opcodeInfo = (
593
593
  OffsetPair => 0x117, # point to associated byte counts
594
594
  DataTag => 'OtherImage',
595
595
  },
596
+ {
597
+ Condition => '$$self{Compression} and $$self{Compression} eq "52546"', # DNG 1.7 Jpeg XL
598
+ Name => 'PreviewJXLStart',
599
+ IsOffset => 1,
600
+ IsImageData => 1,
601
+ OffsetPair => 0x117, # point to associated byte counts
602
+ DataTag => 'PreviewJXL',
603
+ },
596
604
  {
597
605
  # (APP1 IFD2 is for Leica JPEG preview)
598
606
  Condition => q[
@@ -687,6 +695,12 @@ my %opcodeInfo = (
687
695
  OffsetPair => 0x111, # point to associated offset
688
696
  DataTag => 'OtherImage',
689
697
  },
698
+ {
699
+ Condition => '$$self{Compression} and $$self{Compression} eq "52546"', # DNG 1.7 Jpeg XL
700
+ Name => 'PreviewJXLLength',
701
+ OffsetPair => 0x111, # point to associated offset
702
+ DataTag => 'PreviewJXL',
703
+ },
690
704
  {
691
705
  # (APP1 IFD2 is for Leica JPEG preview)
692
706
  Condition => q[
@@ -2421,7 +2435,7 @@ my %opcodeInfo = (
2421
2435
  Count => -1, # 2, 3 or 4 values
2422
2436
  },
2423
2437
  0x9215 => 'ExposureIndex', #12
2424
- 0x9216 => 'TIFF-EPStandardID', #12
2438
+ 0x9216 => { Name => 'TIFF-EPStandardID', PrintConv => '$val =~ tr/ /./; $val' }, #12
2425
2439
  0x9217 => { #12
2426
2440
  Name => 'SensingMethod',
2427
2441
  Groups => { 2 => 'Camera' },
@@ -2711,7 +2725,7 @@ my %opcodeInfo = (
2711
2725
  Count => 2,
2712
2726
  },
2713
2727
  0xa215 => { Name => 'ExposureIndex', Writable => 'rational64u' },
2714
- 0xa216 => 'TIFF-EPStandardID',
2728
+ 0xa216 => { Name => 'TIFF-EPStandardID', PrintConv => '$val =~ tr/ /./; $val' },
2715
2729
  0xa217 => {
2716
2730
  Name => 'SensingMethod',
2717
2731
  Groups => { 2 => 'Camera' },
@@ -4971,6 +4985,39 @@ my %subSecConv = (
4971
4985
  Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"OtherImage");
4972
4986
  },
4973
4987
  },
4988
+ PreviewJXL => {
4989
+ Groups => { 0 => 'EXIF', 1 => 'SubIFD', 2 => 'Preview' },
4990
+ Require => {
4991
+ 0 => 'PreviewJXLStart',
4992
+ 1 => 'PreviewJXLLength',
4993
+ },
4994
+ Desire => {
4995
+ 2 => 'PreviewJXLStart (1)',
4996
+ 3 => 'PreviewJXLLength (1)',
4997
+ },
4998
+ # retrieve all other JXL images
4999
+ RawConv => q{
5000
+ if ($val[2] and $val[3]) {
5001
+ my $i = 1;
5002
+ for (;;) {
5003
+ my %val = ( 0 => $$val{2}, 1 => $$val{3} );
5004
+ $self->FoundTag($tagInfo, \%val);
5005
+ ++$i;
5006
+ $$val{2} = "$$val{0} ($i)";
5007
+ last unless defined $$self{VALUE}{$$val{2}};
5008
+ $$val{3} = "$$val{1} ($i)";
5009
+ last unless defined $$self{VALUE}{$$val{3}};
5010
+ }
5011
+ }
5012
+ @grps = $self->GetGroup($$val{0});
5013
+ my $image = $self->ExtractBinary($val[0], $val[1], 'PreviewJXL');
5014
+ unless ($image =~ /^(Binary data|\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl )/s) {
5015
+ $self->Warn("$tag is not a valid JXL image",1);
5016
+ return undef;
5017
+ }
5018
+ return \$image;
5019
+ },
5020
+ },
4974
5021
  PreviewImageSize => {
4975
5022
  Require => {
4976
5023
  0 => 'PreviewImageWidth',
@@ -5096,7 +5143,8 @@ my %subSecConv = (
5096
5143
  GPSLongitudeRef => '(defined $val and $val =~ / (-?)/) ? ($1 ? "W" : "E") : undef',
5097
5144
  },
5098
5145
  PrintConvInv => q{
5099
- return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
5146
+ return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/ or
5147
+ $val =~ /^\s*(-?\d+(?:\.\d+)?)\s*(-?\d+(?:\.\d+)?)\s*$/;
5100
5148
  my ($lat, $lon) = ($1, $2);
5101
5149
  require Image::ExifTool::GPS;
5102
5150
  $lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat");
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool::Exif;
14
14
 
15
- $VERSION = '1.55';
15
+ $VERSION = '1.56';
16
16
 
17
17
  my %coordConv = (
18
18
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
@@ -491,7 +491,7 @@ sub PrintTimeStamp($)
491
491
  sub ToDMS($$;$$)
492
492
  {
493
493
  my ($et, $val, $doPrintConv, $ref) = @_;
494
- my ($fmt, @fmt, $num, $sign, $rtnVal, $neg);
494
+ my ($fmt, @fmt, $num, $sign, $minus, $rtnVal, $neg);
495
495
 
496
496
  unless (length $val) {
497
497
  # don't convert an empty value
@@ -503,8 +503,10 @@ sub ToDMS($$;$$)
503
503
  $val = -$val;
504
504
  $ref = {N => 'S', E => 'W'}->{$ref};
505
505
  $sign = '-';
506
+ $minus = '-';
506
507
  } else {
507
508
  $sign = '+';
509
+ $minus = '';
508
510
  }
509
511
  $ref = " $ref" unless $doPrintConv and $doPrintConv eq '2';
510
512
  } else {
@@ -522,7 +524,7 @@ sub ToDMS($$;$$)
522
524
  $fmt = q{%d deg %d' %.2f"} . $ref;
523
525
  } elsif ($ref) {
524
526
  # use signed value instead of reference direction if specified
525
- $fmt =~ s/%\+/$sign%/g or $fmt .= $ref;
527
+ $fmt =~ s/%\+/$sign%/g or $fmt =~ s/%-/$minus%/g or $fmt .= $ref;
526
528
  } else {
527
529
  $fmt =~ s/%\+/%/g; # don't know sign, so don't print it
528
530
  }