exiftool_vendored 12.33.0 → 12.37.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 +66 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +65 -37
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -2
- data/bin/lib/Image/ExifTool/Canon.pm +156 -10
- data/bin/lib/Image/ExifTool/Charset.pm +2 -0
- data/bin/lib/Image/ExifTool/DarwinCore.pm +2 -2
- data/bin/lib/Image/ExifTool/Exif.pm +13 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +33 -8
- data/bin/lib/Image/ExifTool/GIF.pm +5 -1
- data/bin/lib/Image/ExifTool/GPS.pm +14 -10
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +96 -4
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +108 -11
- data/bin/lib/Image/ExifTool/Nikon.pm +992 -18
- data/bin/lib/Image/ExifTool/NikonCustom.pm +5 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +135 -71
- data/bin/lib/Image/ExifTool/PDF.pm +5 -3
- data/bin/lib/Image/ExifTool/PNG.pm +1 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +17 -3
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +26 -1
- data/bin/lib/Image/ExifTool/README +4 -0
- data/bin/lib/Image/ExifTool/Sony.pm +29 -11
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +9 -4
- data/bin/lib/Image/ExifTool/TagLookup.pm +6437 -5843
- data/bin/lib/Image/ExifTool/TagNames.pod +1292 -46
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +10 -0
- data/bin/lib/Image/ExifTool/WriteXMP.pl +10 -11
- data/bin/lib/Image/ExifTool/Writer.pl +50 -5
- data/bin/lib/Image/ExifTool/XMP.pm +119 -30
- data/bin/lib/Image/ExifTool/XMP2.pl +3 -2
- data/bin/lib/Image/ExifTool.pm +71 -8
- data/bin/lib/Image/ExifTool.pod +9 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -11,6 +11,7 @@
|
|
11
11
|
# 4) http://www.color.org/privatetag2007-01.pdf
|
12
12
|
# 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
|
13
13
|
# 6) Eef Vreeland private communication
|
14
|
+
# 7) https://color.org/specification/ICC.2-2019.pdf
|
14
15
|
#
|
15
16
|
# Notes: The ICC profile information is different: the format of each
|
16
17
|
# tag is embedded in the information instead of in the directory
|
@@ -24,7 +25,7 @@ use strict;
|
|
24
25
|
use vars qw($VERSION);
|
25
26
|
use Image::ExifTool qw(:DataAccess :Utils);
|
26
27
|
|
27
|
-
$VERSION = '1.
|
28
|
+
$VERSION = '1.38';
|
28
29
|
|
29
30
|
sub ProcessICC($$);
|
30
31
|
sub ProcessICC_Profile($$$);
|
@@ -52,6 +53,11 @@ my %profileClass = (
|
|
52
53
|
abst => 'Abstract Profile',
|
53
54
|
nmcl => 'NamedColor Profile',
|
54
55
|
nkpf => 'Nikon Input Device Profile (NON-STANDARD!)', # (written by Nikon utilities)
|
56
|
+
# additions in v5 (ref 7)
|
57
|
+
cenc => 'ColorEncodingSpace Profile',
|
58
|
+
'mid '=> 'MultiplexIdentification Profile',
|
59
|
+
mlnk => 'MultiplexLink Profile',
|
60
|
+
mvis => 'MultiplexVisualization Profile',
|
55
61
|
);
|
56
62
|
my %manuSig = ( #6
|
57
63
|
'NONE' => 'none',
|
@@ -539,6 +545,90 @@ my %manuSig = ( #6
|
|
539
545
|
Binary => 1, # (NC)
|
540
546
|
},
|
541
547
|
|
548
|
+
# new tags in v5 (ref 7)
|
549
|
+
A2B3 => 'AToB3',
|
550
|
+
A2M0 => 'AToM0',
|
551
|
+
B2A3 => 'BToA3',
|
552
|
+
bcp0 => 'BRDFColorimetricParam0',
|
553
|
+
bcp1 => 'BRDFColorimetricParam1',
|
554
|
+
bcp2 => 'BRDFColorimetricParam2',
|
555
|
+
bcp3 => 'BRDFColorimetricParam3',
|
556
|
+
bsp0 => 'BRDFSpectralParam0',
|
557
|
+
bsp1 => 'BRDFSpectralParam1',
|
558
|
+
bsp2 => 'BRDFSpectralParam2',
|
559
|
+
bsp3 => 'BRDFSpectralParam3',
|
560
|
+
bAB0 => 'BRDFAToB0',
|
561
|
+
bAB1 => 'BRDFAToB1',
|
562
|
+
bAB2 => 'BRDFAToB2',
|
563
|
+
bAB3 => 'BRDFAToB3',
|
564
|
+
bBA0 => 'BRDFBToA0',
|
565
|
+
bBA1 => 'BRDFBToA1',
|
566
|
+
bBA2 => 'BRDFBToA2',
|
567
|
+
bBA3 => 'BRDFBToA3',
|
568
|
+
bBD0 => 'BRDFBToD0',
|
569
|
+
bBD1 => 'BRDFBToD1',
|
570
|
+
bBD2 => 'BRDFBToD2',
|
571
|
+
bBD3 => 'BRDFBToD3',
|
572
|
+
bDB0 => 'BRDFDToB0',
|
573
|
+
bDB1 => 'BRDFDToB1',
|
574
|
+
bDB2 => 'BRDFDToB2',
|
575
|
+
bDB3 => 'BRDFDToB3',
|
576
|
+
bMB0 => 'BRDFMToB0',
|
577
|
+
bMB1 => 'BRDFMToB1',
|
578
|
+
bMB2 => 'BRDFMToB2',
|
579
|
+
bMB3 => 'BRDFMToB3',
|
580
|
+
bMS0 => 'BRDFMToS0',
|
581
|
+
bMS1 => 'BRDFMToS1',
|
582
|
+
bMS2 => 'BRDFMToS2',
|
583
|
+
bMS3 => 'BRDFMToS3',
|
584
|
+
dAB0 => 'DirectionalAToB0',
|
585
|
+
dAB1 => 'DirectionalAToB1',
|
586
|
+
dAB2 => 'DirectionalAToB2',
|
587
|
+
dAB3 => 'DirectionalAToB3',
|
588
|
+
dBA0 => 'DirectionalBToA0',
|
589
|
+
dBA1 => 'DirectionalBToA1',
|
590
|
+
dBA2 => 'DirectionalBToA2',
|
591
|
+
dBA3 => 'DirectionalBToA3',
|
592
|
+
dBD0 => 'DirectionalBToD0',
|
593
|
+
dBD1 => 'DirectionalBToD1',
|
594
|
+
dBD2 => 'DirectionalBToD2',
|
595
|
+
dBD3 => 'DirectionalBToD3',
|
596
|
+
dDB0 => 'DirectionalDToB0',
|
597
|
+
dDB1 => 'DirectionalDToB1',
|
598
|
+
dDB2 => 'DirectionalDToB2',
|
599
|
+
dDB3 => 'DirectionalDToB3',
|
600
|
+
gdb0 => 'GamutBoundaryDescription0',
|
601
|
+
gdb1 => 'GamutBoundaryDescription1',
|
602
|
+
gdb2 => 'GamutBoundaryDescription2',
|
603
|
+
gdb3 => 'GamutBoundaryDescription3',
|
604
|
+
'mdv '=> 'MultiplexDefaultValues',
|
605
|
+
mcta => 'MultiplexTypeArray',
|
606
|
+
minf => 'MeasurementInfo',
|
607
|
+
miin => 'MeasurementInputInfo',
|
608
|
+
M2A0 => 'MToA0',
|
609
|
+
M2B0 => 'MToB0',
|
610
|
+
M2B1 => 'MToB1',
|
611
|
+
M2B2 => 'MToB2',
|
612
|
+
M2B3 => 'MToB3',
|
613
|
+
M2S0 => 'MToS0',
|
614
|
+
M2S1 => 'MToS1',
|
615
|
+
M2S2 => 'MToS2',
|
616
|
+
M2S3 => 'MToS3',
|
617
|
+
cept => 'ColorEncodingParams',
|
618
|
+
csnm => 'ColorSpaceName',
|
619
|
+
cloo => 'ColorantOrderOut',
|
620
|
+
clio => 'ColorantInfoOut',
|
621
|
+
c2sp => 'CustomToStandardPcc',
|
622
|
+
'CxF '=> 'CXF',
|
623
|
+
nmcl => 'NamedColor',
|
624
|
+
psin => 'ProfileSequenceInfo',
|
625
|
+
rfnm => 'ReferenceName',
|
626
|
+
svcn => 'SpectralViewingConditions',
|
627
|
+
swpt => 'SpectralWhitePoint',
|
628
|
+
s2cp => 'StandardToCustomPcc',
|
629
|
+
smap => 'SurfaceMap',
|
630
|
+
# smwp ? (seen in some v5 samples)
|
631
|
+
|
542
632
|
# the following entry represents the ICC profile header, and doesn't
|
543
633
|
# exist as a tag in the directory. It is only in this table to provide
|
544
634
|
# a link so ExifTool can locate the header tags
|
@@ -850,7 +940,7 @@ sub FormatICCTag($$$)
|
|
850
940
|
# dataType
|
851
941
|
if ($type eq 'data' and $size >= 12) {
|
852
942
|
my $form = Get32u($dataPt, $offset+8);
|
853
|
-
# format 0 is
|
943
|
+
# format 0 is UTF-8 data
|
854
944
|
$form == 0 and return substr($$dataPt, $offset+12, $size-12);
|
855
945
|
# binary data and other data types treat as binary (ie. don't format)
|
856
946
|
}
|
@@ -1022,7 +1112,7 @@ sub ValidateICC($)
|
|
1022
1112
|
$profileClass{substr($$valPtr, 12, 4)} or $err = 'profile class';
|
1023
1113
|
my $col = substr($$valPtr, 16, 4); # ColorSpaceData
|
1024
1114
|
my $con = substr($$valPtr, 20, 4); # ConnectionSpace
|
1025
|
-
my $match = '(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR)';
|
1115
|
+
my $match = '(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR|nc..|\0{4})';
|
1026
1116
|
$col =~ /$match/ or $err = 'color space';
|
1027
1117
|
$con =~ /$match/ or $err = 'connection space';
|
1028
1118
|
return $err ? "Invalid ICC profile (bad $err)" : undef;
|
@@ -1134,7 +1224,7 @@ sub ProcessICC_Profile($$$)
|
|
1134
1224
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
|
1135
1225
|
# unknown tags aren't generated automatically by GetTagInfo()
|
1136
1226
|
# if the tagID's aren't numeric, so we must do this manually:
|
1137
|
-
if (not $tagInfo and $$et{OPTIONS}{Unknown}) {
|
1227
|
+
if (not $tagInfo and ($$et{OPTIONS}{Unknown} or $verbose)) {
|
1138
1228
|
$tagInfo = { Unknown => 1 };
|
1139
1229
|
AddTagToTable($tagTablePtr, $tagID, $tagInfo);
|
1140
1230
|
}
|
@@ -1277,6 +1367,8 @@ under the same terms as Perl itself.
|
|
1277
1367
|
|
1278
1368
|
=item L<http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/ColorSync_Manager.pdf>
|
1279
1369
|
|
1370
|
+
=item L<https://color.org/specification/ICC.2-2019.pdf>
|
1371
|
+
|
1280
1372
|
=back
|
1281
1373
|
|
1282
1374
|
=head1 SEE ALSO
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.32';
|
20
20
|
|
21
21
|
sub ProcessJpeg2000Box($$$);
|
22
22
|
sub ProcessJUMD($$$);
|
@@ -42,8 +42,9 @@ my %jp2Map = (
|
|
42
42
|
'UUID-IPTC' => 'JP2',
|
43
43
|
'UUID-EXIF' => 'JP2',
|
44
44
|
'UUID-XMP' => 'JP2',
|
45
|
-
|
46
|
-
|
45
|
+
jp2h => 'JP2',
|
46
|
+
colr => 'jp2h',
|
47
|
+
ICC_Profile => 'colr',
|
47
48
|
IFD1 => 'IFD0',
|
48
49
|
EXIF => 'IFD0', # to write EXIF as a block
|
49
50
|
ExifIFD => 'IFD0',
|
@@ -560,11 +561,34 @@ my %j2cMarker = (
|
|
560
561
|
|
561
562
|
%Image::ExifTool::Jpeg2000::ColorSpec = (
|
562
563
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
564
|
+
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this)
|
563
565
|
GROUPS => { 2 => 'Image' },
|
564
566
|
FORMAT => 'int8s',
|
567
|
+
WRITABLE => 1,
|
568
|
+
# (Note: 'colr' is not a real group, but is used as a hack to write the
|
569
|
+
# necessary colr box. This hack necessitated another hack in TagInfoXML.pm
|
570
|
+
# to avoid reporting this fake group in the XML output)
|
571
|
+
WRITE_GROUP => 'colr',
|
572
|
+
DATAMEMBER => [ 0 ],
|
573
|
+
IS_SUBDIR => [ 3 ],
|
574
|
+
NOTES => q{
|
575
|
+
The table below contains tags in the color specification (colr) box. This
|
576
|
+
box may be rewritten by writing either ICC_Profile, ColorSpace or
|
577
|
+
ColorSpecData. When writing, any existing colr boxes are replaced with the
|
578
|
+
newly created colr box.
|
579
|
+
|
580
|
+
B<NOTE>: Care must be taken when writing this color specification because
|
581
|
+
writing a specification that is incompatible with the image data may make
|
582
|
+
the image undisplayable.
|
583
|
+
},
|
565
584
|
0 => {
|
566
585
|
Name => 'ColorSpecMethod',
|
567
586
|
RawConv => '$$self{ColorSpecMethod} = $val',
|
587
|
+
Protected => 1,
|
588
|
+
Notes => q{
|
589
|
+
default for writing is 2 when writing ICC_Profile, 1 when writing
|
590
|
+
ColorSpace, or 4 when writing ColorSpecData
|
591
|
+
},
|
568
592
|
PrintConv => {
|
569
593
|
1 => 'Enumerated',
|
570
594
|
2 => 'Restricted ICC',
|
@@ -572,9 +596,15 @@ my %j2cMarker = (
|
|
572
596
|
4 => 'Vendor Color',
|
573
597
|
},
|
574
598
|
},
|
575
|
-
1 =>
|
599
|
+
1 => {
|
600
|
+
Name => 'ColorSpecPrecedence',
|
601
|
+
Notes => 'default for writing is 0',
|
602
|
+
Protected => 1,
|
603
|
+
},
|
576
604
|
2 => {
|
577
605
|
Name => 'ColorSpecApproximation',
|
606
|
+
Notes => 'default for writing is 0',
|
607
|
+
Protected => 1,
|
578
608
|
PrintConv => {
|
579
609
|
0 => 'Not Specified',
|
580
610
|
1 => 'Accurate',
|
@@ -599,6 +629,7 @@ my %j2cMarker = (
|
|
599
629
|
Name => 'ColorSpace',
|
600
630
|
Condition => '$$self{ColorSpecMethod} == 1',
|
601
631
|
Format => 'int32u',
|
632
|
+
Protected => 1,
|
602
633
|
PrintConv => { # ref 15444-2 2002-05-15
|
603
634
|
0 => 'Bi-level',
|
604
635
|
1 => 'YCbCr(1)',
|
@@ -628,6 +659,8 @@ my %j2cMarker = (
|
|
628
659
|
{
|
629
660
|
Name => 'ColorSpecData',
|
630
661
|
Format => 'undef[$size-3]',
|
662
|
+
Writable => 'undef',
|
663
|
+
Protected => 1,
|
631
664
|
Binary => 1,
|
632
665
|
},
|
633
666
|
],
|
@@ -817,6 +850,48 @@ sub CreateNewBoxes($$)
|
|
817
850
|
return 1;
|
818
851
|
}
|
819
852
|
|
853
|
+
#------------------------------------------------------------------------------
|
854
|
+
# Create Color Specification Box
|
855
|
+
# Inputs: 0) ExifTool object ref, 1) Output file or scalar ref
|
856
|
+
# Returns: 1 on success
|
857
|
+
sub CreateColorSpec($$)
|
858
|
+
{
|
859
|
+
my ($et, $outfile) = @_;
|
860
|
+
my $meth = $et->GetNewValue('Jpeg2000:ColorSpecMethod');
|
861
|
+
my $prec = $et->GetNewValue('Jpeg2000:ColorSpecPrecedence') || 0;
|
862
|
+
my $approx = $et->GetNewValue('Jpeg2000:ColorSpecApproximation') || 0;
|
863
|
+
my $icc = $et->GetNewValue('ICC_Profile');
|
864
|
+
my $space = $et->GetNewValue('Jpeg2000:ColorSpace');
|
865
|
+
my $cdata = $et->GetNewValue('Jpeg2000:ColorSpecData');
|
866
|
+
unless ($meth) {
|
867
|
+
if ($icc) {
|
868
|
+
$meth = 2;
|
869
|
+
} elsif (defined $space) {
|
870
|
+
$meth = 1;
|
871
|
+
} elsif (defined $cdata) {
|
872
|
+
$meth = 4;
|
873
|
+
} else {
|
874
|
+
$et->Warn('Color space not defined'), return 0;
|
875
|
+
}
|
876
|
+
}
|
877
|
+
if ($meth eq '1') {
|
878
|
+
defined $space or $et->Warn('Must specify ColorSpace'), return 0;
|
879
|
+
$cdata = pack('N', $space);
|
880
|
+
} elsif ($meth eq '2' or $meth eq '3') {
|
881
|
+
defined $icc or $et->Warn('Must specify ICC_Profile'), return 0;
|
882
|
+
$cdata = $icc;
|
883
|
+
} elsif ($meth eq '4') {
|
884
|
+
defined $cdata or $et->Warn('Must specify ColorSpecData'), return 0;
|
885
|
+
} else {
|
886
|
+
$et->Warn('Unknown ColorSpecMethod'), return 0;
|
887
|
+
}
|
888
|
+
my $boxhdr = pack('N', length($cdata) + 11) . 'colr';
|
889
|
+
Write($outfile, $boxhdr, pack('CCC',$meth,$prec,$approx), $cdata) or return 0;
|
890
|
+
++$$et{CHANGED};
|
891
|
+
$et->VPrint(1, " + Jpeg2000:ColorSpec\n");
|
892
|
+
return 1;
|
893
|
+
}
|
894
|
+
|
820
895
|
#------------------------------------------------------------------------------
|
821
896
|
# Process JPEG 2000 box
|
822
897
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) Pointer to tag table
|
@@ -834,7 +909,7 @@ sub ProcessJpeg2000Box($$$)
|
|
834
909
|
my $raf = $$dirInfo{RAF};
|
835
910
|
my $outfile = $$dirInfo{OutFile};
|
836
911
|
my $dirEnd = $dirStart + $dirLen;
|
837
|
-
my ($err, $outBuff, $verbose);
|
912
|
+
my ($err, $outBuff, $verbose, $doColour);
|
838
913
|
|
839
914
|
if ($outfile) {
|
840
915
|
unless ($raf) {
|
@@ -842,13 +917,19 @@ sub ProcessJpeg2000Box($$$)
|
|
842
917
|
$outBuff = '';
|
843
918
|
$outfile = \$outBuff;
|
844
919
|
}
|
920
|
+
# determine if we will be writing colr box
|
921
|
+
if ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'JP2Header') {
|
922
|
+
$doColour = 2 if defined $et->GetNewValue('ColorSpecMethod') or $et->GetNewValue('ICC_Profile') or
|
923
|
+
defined $et->GetNewValue('ColorSpecPrecedence') or defined $et->GetNewValue('ColorSpace') or
|
924
|
+
defined $et->GetNewValue('ColorSpecApproximation') or defined $et->GetNewValue('ColorSpecData');
|
925
|
+
}
|
845
926
|
} else {
|
846
927
|
# (must not set verbose flag when writing!)
|
847
928
|
$verbose = $$et{OPTIONS}{Verbose};
|
848
929
|
$et->VerboseDir($$dirInfo{DirName}) if $verbose;
|
849
930
|
}
|
850
931
|
# loop through all contained boxes
|
851
|
-
my ($pos, $boxLen);
|
932
|
+
my ($pos, $boxLen, $lastBox);
|
852
933
|
for ($pos=$dirStart; ; $pos+=$boxLen) {
|
853
934
|
my ($boxID, $buff, $valuePtr);
|
854
935
|
my $hdrLen = 8; # the box header length
|
@@ -857,9 +938,7 @@ sub ProcessJpeg2000Box($$$)
|
|
857
938
|
my $n = $raf->Read($buff,$hdrLen);
|
858
939
|
unless ($n == $hdrLen) {
|
859
940
|
$n and $err = '', last;
|
860
|
-
|
861
|
-
CreateNewBoxes($et, $outfile) or $err = 1;
|
862
|
-
}
|
941
|
+
CreateNewBoxes($et, $outfile) or $err = 1 if $outfile;
|
863
942
|
last;
|
864
943
|
}
|
865
944
|
$dataPt = \$buff;
|
@@ -871,6 +950,17 @@ sub ProcessJpeg2000Box($$$)
|
|
871
950
|
}
|
872
951
|
$boxLen = unpack("x$pos N",$$dataPt); # (length includes header and data)
|
873
952
|
$boxID = substr($$dataPt, $pos+4, 4);
|
953
|
+
# remove old colr boxes if necessary
|
954
|
+
if ($doColour and $boxID eq 'colr') {
|
955
|
+
if ($doColour == 1) { # did we successfully write the new colr box?
|
956
|
+
$et->VPrint(1," - Jpeg2000:ColorSpec\n");
|
957
|
+
++$$et{CHANGED};
|
958
|
+
next;
|
959
|
+
}
|
960
|
+
$et->Warn('Out-of-order colr box encountered');
|
961
|
+
undef $doColour;
|
962
|
+
}
|
963
|
+
$lastBox = $boxID;
|
874
964
|
$pos += $hdrLen; # move to end of box header
|
875
965
|
if ($boxLen == 1) {
|
876
966
|
# box header contains an additional 8-byte integer for length
|
@@ -1009,8 +1099,10 @@ sub ProcessJpeg2000Box($$$)
|
|
1009
1099
|
# remove this directory from our create list
|
1010
1100
|
delete $$et{AddJp2Dirs}{$$tagInfo{Name}};
|
1011
1101
|
my $newdir;
|
1012
|
-
# only edit writable UUID and
|
1013
|
-
if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL})
|
1102
|
+
# only edit writable UUID, Exif and jp2h boxes
|
1103
|
+
if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL}) or
|
1104
|
+
($boxID eq 'jp2h' and $$et{EDIT_DIRS}{jp2h}))
|
1105
|
+
{
|
1014
1106
|
$newdir = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
|
1015
1107
|
next if defined $newdir and not length $newdir; # next if deleting the box
|
1016
1108
|
} elsif (defined $uuid) {
|
@@ -1022,6 +1114,11 @@ sub ProcessJpeg2000Box($$$)
|
|
1022
1114
|
my $boxhdr = pack('N', length($newdir) + 8 + $prefixLen) . $boxID;
|
1023
1115
|
$boxhdr .= substr($$dataPt, $valuePtr, $prefixLen) if $prefixLen;
|
1024
1116
|
Write($outfile, $boxhdr, $newdir) or $err = 1;
|
1117
|
+
# write new colr box immediately after ihdr
|
1118
|
+
if ($doColour and $boxID eq 'ihdr') {
|
1119
|
+
# (shouldn't be multiple ihdr boxes, but just in case, write only 1)
|
1120
|
+
$doColour = $doColour==2 ? CreateColorSpec($et, $outfile) : 0;
|
1121
|
+
}
|
1025
1122
|
} else {
|
1026
1123
|
# extract as a block if specified
|
1027
1124
|
$subdirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract};
|