exiftool_vendored 12.56.0 → 12.57.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 868b41884f8ad70975ed61e8b20a68ed6528884fddb24c3cac299e10efdb7eb5
4
- data.tar.gz: 62539abf29b08ec70f5846bd3e290fd475fc98a043f80a5515520fbcecd2bbb1
3
+ metadata.gz: 1c02a2a1efe1fc3f63f7527ed968432fc73d7e1ebeda7cfbf424413b8907bd0c
4
+ data.tar.gz: 5140c2587870d324d63d4d35beb70d1cbbecb92a78fb6ea55d9885cf9f320c1b
5
5
  SHA512:
6
- metadata.gz: cc4ed320dc2e6455b3b71a5b41080f0d7d97e5f67ed3a7ee7acc61528c18d6f4daa353724a41a2c26eec0bc9a137a2f5221f7adb536d12d813187264f7cb2ec1
7
- data.tar.gz: 21594ef130d424275c02a3cc27f87064df0b6fa49245e6469a7c767fbf67821436ee22d44a5db2bbaff6909e976cc8a69498892f6a4b77e58a40c29bbe78e5c1
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) files
13
- - Added read support for InfiRay APP2 metadata (thanks Marcos Del Sol Vives)
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
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.56"
50
+ "version" : "12.57"
51
51
  }
data/bin/META.yml CHANGED
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.56
31
+ version: 12.57
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.56.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.56
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.56';
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
- if ($1) {
1124
- $windowTitle = substr $1, 1;
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
- $textOut = shift || Warn("Expecting output extension for -$_ option\n");
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 (defined $textOut) {
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
- $verbose and print $vout "-------- $file (failed condition)$progStr\n";
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
- print $vout "======== $file$progStr\n" if defined $verbose;
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
- print $vout "======== $file$progStr\n" if defined $verbose;
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 and print $o "======== $file$progStr\n";
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
- $progStr = " [$progressCount/$progressMax]" if $progress;
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
- $verbose and print $vout "-------- $file (wrong extension)$progStr\n";
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]] Show file progress count
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. If no
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.56 --
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 "##" (20 characters if
6128
- "##" is omitted), and %% is a % character. May be combined with the normal
6129
- B<-progress> option to also show the progress count in console messages.
6130
- (Note: For this feature to function correctly on Mac/Linux, stderr must go
6131
- to the console.)
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.50';
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 => 'XML',
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 'XML' or $dirName eq 'Exif') {
831
- my ($tag, $dir) = $dirName eq 'XML' ? ('xml ', 'XMP') : ('Exif', 'EXIF');
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.50';
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, 0)',
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, 0)',
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
  },