exiftool-vendored.exe 12.67.0 → 12.70.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.
- package/bin/exiftool_files/Changes +79 -10
- package/bin/exiftool_files/README +7 -7
- package/bin/exiftool_files/exiftool.pl +37 -31
- package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +18 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +87 -16
- package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +25 -2
- package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +54 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +175 -14
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +158 -20
- package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +16 -11
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +70 -7
- package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +30 -15
- package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +82 -22
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +7 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +22 -9
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +6 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +92 -55
- package/bin/exiftool_files/lib/Image/ExifTool/README +14 -5
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +60 -10
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +152 -46
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6955 -6713
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +878 -334
- package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +4 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +23 -20
- package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +14 -4
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +3 -0
- package/bin/exiftool_files/lib/Image/ExifTool/WriteRIFF.pl +31 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +40 -14
- package/bin/exiftool_files/lib/Image/ExifTool/XISF.pm +185 -0
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +67 -2
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +35 -0
- package/bin/exiftool_files/lib/Image/ExifTool.pm +92 -45
- package/bin/exiftool_files/lib/Image/ExifTool.pod +14 -8
- package/package.json +3 -3
|
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
|
|
|
50
50
|
use Image::ExifTool::GPS;
|
|
51
51
|
require Exporter;
|
|
52
52
|
|
|
53
|
-
$VERSION = '3.
|
|
53
|
+
$VERSION = '3.61';
|
|
54
54
|
@ISA = qw(Exporter);
|
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
|
56
56
|
|
|
@@ -201,6 +201,8 @@ my %xmpNS = (
|
|
|
201
201
|
nine => 'http://ns.nikon.com/nine/1.0/',
|
|
202
202
|
hdr_metadata => 'http://ns.adobe.com/hdr-metadata/1.0/',
|
|
203
203
|
hdrgm => 'http://ns.adobe.com/hdr-gain-map/1.0/',
|
|
204
|
+
# Note: Not included due to namespace prefix conflict with Device:Container
|
|
205
|
+
# Container => 'http://ns.google.com/photos/1.0/container/',
|
|
204
206
|
);
|
|
205
207
|
|
|
206
208
|
# build reverse namespace lookup
|
|
@@ -479,7 +481,7 @@ my %sCorrRangeMask = (
|
|
|
479
481
|
LuminanceDepthSampleInfo => { },
|
|
480
482
|
);
|
|
481
483
|
# new LR2 crs structures (PH)
|
|
482
|
-
my %sCorrectionMask;
|
|
484
|
+
my %sCorrectionMask; # (must define this before assigning because it is self-referential)
|
|
483
485
|
%sCorrectionMask = (
|
|
484
486
|
STRUCT_NAME => 'CorrectionMask',
|
|
485
487
|
NAMESPACE => 'crs',
|
|
@@ -919,6 +921,11 @@ my %sRangeMask = (
|
|
|
919
921
|
Name => 'hdrgm',
|
|
920
922
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::hdrgm' },
|
|
921
923
|
},
|
|
924
|
+
# Note: Note included due to namespace prefix conflict with Device:Container
|
|
925
|
+
# Container => {
|
|
926
|
+
# Name => 'Container',
|
|
927
|
+
# SubDirectory => { TagTable => 'Image::ExifTool::XMP::Container' },
|
|
928
|
+
# },
|
|
922
929
|
);
|
|
923
930
|
|
|
924
931
|
# hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
|
|
@@ -1699,6 +1706,8 @@ my %sPantryItem = (
|
|
|
1699
1706
|
ToneCurvePV2012Red => { List => 'Seq' },
|
|
1700
1707
|
ToneCurvePV2012Green => { List => 'Seq' },
|
|
1701
1708
|
ToneCurvePV2012Blue => { List => 'Seq' },
|
|
1709
|
+
Highlights2012 => { },
|
|
1710
|
+
Shadows2012 => { },
|
|
1702
1711
|
},
|
|
1703
1712
|
},
|
|
1704
1713
|
}
|
|
@@ -1760,6 +1769,62 @@ my %sPantryItem = (
|
|
|
1760
1769
|
SDRShadows => { Writable => 'real' },
|
|
1761
1770
|
SDRWhites => { Writable => 'real' },
|
|
1762
1771
|
SDRBlend => { Writable => 'real' },
|
|
1772
|
+
# new for ACR 16 (ref forum15305)
|
|
1773
|
+
LensBlur => {
|
|
1774
|
+
Struct => {
|
|
1775
|
+
STRUCT_NAME => 'LensBlur',
|
|
1776
|
+
NAMESPACE => 'crs',
|
|
1777
|
+
# (Note: all the following 'real' values could be limited to 'integer')
|
|
1778
|
+
Active => { Writable => 'boolean' },
|
|
1779
|
+
BlurAmount => { FlatName => 'Amount', Writable => 'real' },
|
|
1780
|
+
BokehAspect => { Writable => 'real' },
|
|
1781
|
+
BokehRotation => { Writable => 'real' },
|
|
1782
|
+
BokehShape => { Writable => 'real' },
|
|
1783
|
+
BokehShapeDetail => { Writable => 'real' },
|
|
1784
|
+
CatEyeAmount => { Writable => 'real' },
|
|
1785
|
+
CatEyeScale => { Writable => 'real' },
|
|
1786
|
+
FocalRange => { }, # (eg. "-48 32 64 144")
|
|
1787
|
+
FocalRangeSource => { Writable => 'real' },
|
|
1788
|
+
HighlightsBoost => { Writable => 'real' },
|
|
1789
|
+
HighlightsThreshold => { Writable => 'real' },
|
|
1790
|
+
SampledArea => { }, # (eg. "0.500000 0.500000 0.500000 0.500000")
|
|
1791
|
+
SampledRange => { }, # (eg. "0 0")
|
|
1792
|
+
SphericalAberration => { Writable => 'real' },
|
|
1793
|
+
SubjectRange => { }, # (eg. "0 57");
|
|
1794
|
+
Version => { },
|
|
1795
|
+
},
|
|
1796
|
+
},
|
|
1797
|
+
DepthMapInfo => {
|
|
1798
|
+
Struct => {
|
|
1799
|
+
STRUCT_NAME => 'DepthMapInfo',
|
|
1800
|
+
NAMESPACE => 'crs',
|
|
1801
|
+
BaseHighlightGuideInputDigest => { },
|
|
1802
|
+
BaseHighlightGuideTable => { },
|
|
1803
|
+
BaseHighlightGuideVersion => { },
|
|
1804
|
+
BaseLayeredDepthInputDigest => { },
|
|
1805
|
+
BaseLayeredDepthTable => { },
|
|
1806
|
+
BaseLayeredDepthVersion => { },
|
|
1807
|
+
BaseRawDepthInputDigest => { },
|
|
1808
|
+
BaseRawDepthTable => { },
|
|
1809
|
+
BaseRawDepthVersion => { },
|
|
1810
|
+
DepthSource => { },
|
|
1811
|
+
},
|
|
1812
|
+
},
|
|
1813
|
+
DepthBasedCorrections => {
|
|
1814
|
+
List => 'Seq',
|
|
1815
|
+
FlatName => 'DepthBasedCorr',
|
|
1816
|
+
Struct => {
|
|
1817
|
+
STRUCT_NAME => 'DepthBasedCorr',
|
|
1818
|
+
NAMESPACE => 'crs',
|
|
1819
|
+
CorrectionActive => { Writable => 'boolean' },
|
|
1820
|
+
CorrectionAmount => { Writable => 'real' },
|
|
1821
|
+
CorrectionMasks => { FlatName => 'Mask', List => 'Seq', Struct => \%sCorrectionMask },
|
|
1822
|
+
CorrectionSyncID => { },
|
|
1823
|
+
LocalCorrectedDepth => { Writable => 'real' },
|
|
1824
|
+
LocalCurveRefineSaturation => { Writable => 'real' },
|
|
1825
|
+
What => { },
|
|
1826
|
+
},
|
|
1827
|
+
},
|
|
1763
1828
|
);
|
|
1764
1829
|
|
|
1765
1830
|
# Tiff namespace properties (tiff)
|
|
@@ -1873,6 +1873,10 @@ my %sSubVersion = (
|
|
|
1873
1873
|
ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
|
1874
1874
|
ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
|
|
1875
1875
|
},
|
|
1876
|
+
HdrPlusMakernote => {
|
|
1877
|
+
ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
|
1878
|
+
ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
|
|
1879
|
+
},
|
|
1876
1880
|
);
|
|
1877
1881
|
|
|
1878
1882
|
# Google creations namespace (ref PH)
|
|
@@ -2037,6 +2041,37 @@ my %sSubVersion = (
|
|
|
2037
2041
|
},
|
|
2038
2042
|
);
|
|
2039
2043
|
|
|
2044
|
+
# Google container tags (ref https://developer.android.com/guide/topics/media/platform/hdr-image-format)
|
|
2045
|
+
# NOTE: Not included because these namespace prefixes conflict with Google's depth-map Device tags!
|
|
2046
|
+
# (see ../pics/GooglePixel8Pro.jpg sample image)
|
|
2047
|
+
# %Image::ExifTool::XMP::Container = (
|
|
2048
|
+
# %xmpTableDefaults,
|
|
2049
|
+
# GROUPS => { 1 => 'XMP-Container', 2 => 'Image' },
|
|
2050
|
+
# NAMESPACE => 'Container',
|
|
2051
|
+
# NOTES => 'Google Container namespace.',
|
|
2052
|
+
# Directory => {
|
|
2053
|
+
# Name => 'ContainerDirectory',
|
|
2054
|
+
# FlatName => 'Directory',
|
|
2055
|
+
# List => 'Seq',
|
|
2056
|
+
# Struct => {
|
|
2057
|
+
# STRUCT_NAME => 'Directory',
|
|
2058
|
+
# Item => {
|
|
2059
|
+
# Namespace => 'Container',
|
|
2060
|
+
# Struct => {
|
|
2061
|
+
# STRUCT_NAME => 'Item',
|
|
2062
|
+
# NAMESPACE => { Item => 'http://ns.google.com/photos/1.0/container/item/'},
|
|
2063
|
+
# Mime => { },
|
|
2064
|
+
# Semantic => { },
|
|
2065
|
+
# Length => { Writable => 'integer' },
|
|
2066
|
+
# Label => { },
|
|
2067
|
+
# Padding => { Writable => 'integer' },
|
|
2068
|
+
# URI => { },
|
|
2069
|
+
# },
|
|
2070
|
+
# },
|
|
2071
|
+
# },
|
|
2072
|
+
# },
|
|
2073
|
+
# );
|
|
2074
|
+
|
|
2040
2075
|
# Getty Images namespace (ref PH)
|
|
2041
2076
|
%Image::ExifTool::XMP::GettyImages = (
|
|
2042
2077
|
%xmpTableDefaults,
|
|
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
|
30
30
|
%static_vars);
|
|
31
31
|
|
|
32
|
-
$VERSION = '12.
|
|
32
|
+
$VERSION = '12.70';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -132,7 +132,7 @@ sub Rename($$$);
|
|
|
132
132
|
sub Unlink($@);
|
|
133
133
|
sub SetFileTime($$;$$$$);
|
|
134
134
|
sub DoEscape($$);
|
|
135
|
-
sub ConvertFileSize(
|
|
135
|
+
sub ConvertFileSize($;$);
|
|
136
136
|
sub ParseArguments($;@); #(defined in attempt to avoid mod_perl problem)
|
|
137
137
|
sub ReadValue($$$;$$$);
|
|
138
138
|
|
|
@@ -145,16 +145,16 @@ sub ReadValue($$$;$$$);
|
|
|
145
145
|
WPG ICO PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF
|
|
146
146
|
PCX PGF PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header
|
|
147
147
|
Photoshop::Layers Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD
|
|
148
|
-
Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3
|
|
149
|
-
FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC
|
|
150
|
-
MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile
|
|
151
|
-
QuickTime::Tags360Fly Matroska Matroska::StdTag MOI MXF DV
|
|
152
|
-
Real::Media Real::Audio Real::Metafile Red RIFF AIFF ASF
|
|
153
|
-
JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH
|
|
154
|
-
EXE
|
|
155
|
-
Text VCard::VCalendar VCard::VNote RSRC
|
|
156
|
-
ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF
|
|
157
|
-
FlashPix::DocTable
|
|
148
|
+
FujiFilm::MRAW Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3
|
|
149
|
+
ID3::Lyrics3 FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC
|
|
150
|
+
MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile
|
|
151
|
+
QuickTime::Stream QuickTime::Tags360Fly Matroska Matroska::StdTag MOI MXF DV
|
|
152
|
+
Flash Flash::FLV Real::Media Real::Audio Real::Metafile Red RIFF AIFF ASF
|
|
153
|
+
WTV DICOM FITS XISF MIE JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH
|
|
154
|
+
Torrent EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF EXE::ELF
|
|
155
|
+
EXE::AR EXE::CHM LNK Font VCard Text VCard::VCalendar VCard::VNote RSRC
|
|
156
|
+
Rawzor ZIP ZIP::GZIP ZIP::RAR ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF
|
|
157
|
+
FLIR::FPF MacOS MacOS::MDItem FlashPix::DocTable
|
|
158
158
|
);
|
|
159
159
|
|
|
160
160
|
# alphabetical list of current Lang modules
|
|
@@ -193,10 +193,11 @@ $defaultLang = 'en'; # default language
|
|
|
193
193
|
@fileTypes = qw(JPEG EXV CRW DR4 TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF
|
|
194
194
|
PSD XMP BMP WPG BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV
|
|
195
195
|
OGG FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF
|
|
196
|
-
LFP HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST
|
|
197
|
-
7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font
|
|
198
|
-
M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI
|
|
199
|
-
PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO
|
|
196
|
+
LFP HTML VRD RTF FITS XISF XCF DSS QTIF FPX PICT ZIP GZIP PLIST
|
|
197
|
+
RAR 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font
|
|
198
|
+
RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI
|
|
199
|
+
R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO
|
|
200
|
+
TXT);
|
|
200
201
|
|
|
201
202
|
# file types that we can write (edit)
|
|
202
203
|
my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
|
|
@@ -364,6 +365,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
|
364
365
|
JPC => 'J2C',
|
|
365
366
|
JPE => 'JPEG',
|
|
366
367
|
JPEG => ['JPEG', 'Joint Photographic Experts Group'],
|
|
368
|
+
JPH => ['JP2', 'High-throughput JPEG 2000'],
|
|
367
369
|
JPF => 'JP2',
|
|
368
370
|
JPG => 'JPEG',
|
|
369
371
|
JPM => ['JP2', 'JPEG 2000 compound image'],
|
|
@@ -545,6 +547,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
|
545
547
|
X3F => ['X3F', 'Sigma RAW format'],
|
|
546
548
|
XCF => ['XCF', 'GIMP native image format'],
|
|
547
549
|
XHTML=> ['HTML', 'Extensible HyperText Markup Language'],
|
|
550
|
+
XISF => ['XISF', 'Extensible Image Serialization Format'],
|
|
548
551
|
XLA => ['FPX', 'Microsoft Excel Add-in'],
|
|
549
552
|
XLAM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Add-in Macro-enabled'],
|
|
550
553
|
XLS => ['FPX', 'Microsoft Excel Spreadsheet'],
|
|
@@ -675,6 +678,7 @@ my %fileDescription = (
|
|
|
675
678
|
JNG => 'image/jng',
|
|
676
679
|
JP2 => 'image/jp2',
|
|
677
680
|
JPEG => 'image/jpeg',
|
|
681
|
+
JPH => 'image/jph',
|
|
678
682
|
JPM => 'image/jpm',
|
|
679
683
|
JPS => 'image/x-jps',
|
|
680
684
|
JPX => 'image/jpx',
|
|
@@ -798,6 +802,7 @@ my %fileDescription = (
|
|
|
798
802
|
WTV => 'video/x-ms-wtv',
|
|
799
803
|
X3F => 'image/x-sigma-x3f',
|
|
800
804
|
XCF => 'image/x-xcf',
|
|
805
|
+
XISF => 'image/x-xisf',
|
|
801
806
|
XLA => 'application/vnd.ms-excel',
|
|
802
807
|
XLAM => 'application/vnd.ms-excel.addin.macroEnabled.12',
|
|
803
808
|
XLS => 'application/vnd.ms-excel',
|
|
@@ -994,6 +999,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
|
|
|
994
999
|
WTV => '\xb7\xd8\x00\x20\x37\x49\xda\x11\xa6\x4e\x00\x07\xe9\x5e\xad\x8d',
|
|
995
1000
|
X3F => 'FOVb',
|
|
996
1001
|
XCF => 'gimp xcf ',
|
|
1002
|
+
XISF => 'XISF0100',
|
|
997
1003
|
XMP => '\0{0,3}(\xfe\xff|\xff\xfe|\xef\xbb\xbf)?\0{0,3}\s*<',
|
|
998
1004
|
ZIP => 'PK\x03\x04',
|
|
999
1005
|
);
|
|
@@ -1062,6 +1068,7 @@ my %xmpShorthandOpt = ( 0 => 'None', 1 => 'Shorthand', 2 => ['Shorthand','OneDes
|
|
|
1062
1068
|
my @availableOptions = (
|
|
1063
1069
|
[ 'Binary', undef, 'flag to extract binary values even if tag not specified' ],
|
|
1064
1070
|
[ 'ByteOrder', undef, 'default byte order when creating EXIF information' ],
|
|
1071
|
+
[ 'ByteUnit', 'SI', 'units for byte conversions (SI or Binary)'],
|
|
1065
1072
|
[ 'Charset', 'UTF8', 'character set for converting Unicode characters' ],
|
|
1066
1073
|
[ 'CharsetEXIF', undef, 'internal EXIF "ASCII" string encoding' ],
|
|
1067
1074
|
[ 'CharsetFileName', undef, 'external encoding for file names' ],
|
|
@@ -1303,8 +1310,9 @@ my %systemTagsNotes = (
|
|
|
1303
1310
|
FileSize => {
|
|
1304
1311
|
Groups => { 1 => 'System', 2 => 'Other' },
|
|
1305
1312
|
Notes => q{
|
|
1306
|
-
note that the print conversion for this tag uses
|
|
1307
|
-
|
|
1313
|
+
note that the print conversion for this tag uses SI prefixes by default: 1
|
|
1314
|
+
kB = 1000 bytes, etc. Set the API ByteUnit option to "Binary" to use binary
|
|
1315
|
+
prefixes instead: 1 KiB = 1024 bytes, etc.
|
|
1308
1316
|
},
|
|
1309
1317
|
PrintConv => \&ConvertFileSize,
|
|
1310
1318
|
},
|
|
@@ -1581,6 +1589,7 @@ my %systemTagsNotes = (
|
|
|
1581
1589
|
ImageHeight => { Notes => 'the height of the image in number of pixels' },
|
|
1582
1590
|
XResolution => { Notes => 'the horizontal pixel resolution' },
|
|
1583
1591
|
YResolution => { Notes => 'the vertical pixel resolution' },
|
|
1592
|
+
NumPlanes => { Notes => 'number of color planes' },
|
|
1584
1593
|
MaxVal => { Notes => 'maximum pixel value in PPM or PGM image' },
|
|
1585
1594
|
EXIF => {
|
|
1586
1595
|
Notes => q{
|
|
@@ -1844,7 +1853,7 @@ my %systemTagsNotes = (
|
|
|
1844
1853
|
Geotime => {
|
|
1845
1854
|
Writable => 1,
|
|
1846
1855
|
WriteOnly => 1,
|
|
1847
|
-
AllowGroup => '(exif|gps|xmp|xmp-exif)',
|
|
1856
|
+
AllowGroup => '(exif|gps|xmp|xmp-exif|quicktime|keys|itemlist|userdata)',
|
|
1848
1857
|
Notes => q{
|
|
1849
1858
|
this write-only tag is used to define a date/time for interpolating a
|
|
1850
1859
|
position in the GPS track specified by the Geotag tag. Writing this tag
|
|
@@ -2408,17 +2417,28 @@ sub Options($$;@)
|
|
|
2408
2417
|
}
|
|
2409
2418
|
$$options{$param} = $newVal;
|
|
2410
2419
|
} elsif ($param eq 'ImageHashType') {
|
|
2411
|
-
if (defined $newVal
|
|
2420
|
+
if (not defined $newVal) {
|
|
2421
|
+
warn("Can't set $param to undef\n");
|
|
2422
|
+
} elsif ($newVal =~ /^(MD5|SHA256|SHA512)$/i) {
|
|
2412
2423
|
$$options{$param} = uc($newVal);
|
|
2413
2424
|
} else {
|
|
2414
|
-
warn("Invalid $param setting '${newVal}'\n")
|
|
2425
|
+
warn("Invalid $param setting '${newVal}'\n");
|
|
2415
2426
|
}
|
|
2416
2427
|
} elsif ($param eq 'StructFormat') {
|
|
2417
2428
|
if (defined $newVal) {
|
|
2418
|
-
$newVal =~ /^(JSON|JSONQ)$/i or warn("Invalid $param setting '${newVal}'\n"),
|
|
2429
|
+
$newVal =~ /^(JSON|JSONQ)$/i or warn("Invalid $param setting '${newVal}'\n"), next;
|
|
2419
2430
|
$newVal = uc($newVal);
|
|
2420
2431
|
}
|
|
2421
2432
|
$$options{$param} = $newVal;
|
|
2433
|
+
} elsif ($param eq 'ByteUnit') {
|
|
2434
|
+
if (defined $newVal) {
|
|
2435
|
+
# (allow "Metric" or "SI" for SI, and "IT" or "Binary" for Binary)
|
|
2436
|
+
my $goodVal = ($newVal =~ /^S|M/i ? 'SI' : ($newVal =~ /^I|B/i ? 'Binary' : undef));
|
|
2437
|
+
$goodVal or warn("Invalid $param setting '${newVal}'\n"), next;
|
|
2438
|
+
$$options{$param} = $goodVal;
|
|
2439
|
+
} else {
|
|
2440
|
+
warn("Can't set $param to undef\n");
|
|
2441
|
+
}
|
|
2422
2442
|
} else {
|
|
2423
2443
|
if ($param eq 'Escape') {
|
|
2424
2444
|
# set ESCAPE_PROC
|
|
@@ -2543,7 +2563,7 @@ sub ExtractInfo($;@)
|
|
|
2543
2563
|
$self->WarnOnce('Install Time::HiRes to generate ProcessingTime');
|
|
2544
2564
|
}
|
|
2545
2565
|
}
|
|
2546
|
-
|
|
2566
|
+
|
|
2547
2567
|
# create Hash object if ImageDataHash is requested
|
|
2548
2568
|
if ($$req{imagedatahash} and not $$self{ImageDataHash}) {
|
|
2549
2569
|
my $imageHashType = $self->Options('ImageHashType');
|
|
@@ -3451,9 +3471,10 @@ sub GetValue($$;$)
|
|
|
3451
3471
|
} elsif (wantarray) {
|
|
3452
3472
|
# return array if requested
|
|
3453
3473
|
return @$value;
|
|
3454
|
-
} elsif ($type eq 'PrintConv' and not $$self{OPTIONS}{List}
|
|
3455
|
-
# join PrintConv values in
|
|
3474
|
+
} elsif ($type eq 'PrintConv' and not $$self{OPTIONS}{List}) {
|
|
3475
|
+
# join PrintConv values in delimited string if List option not used
|
|
3456
3476
|
# and list contains simple scalars (otherwise return ARRAY ref)
|
|
3477
|
+
ref and return $value foreach @$value;
|
|
3457
3478
|
$value = join $$self{OPTIONS}{ListSep}, @$value;
|
|
3458
3479
|
}
|
|
3459
3480
|
}
|
|
@@ -6018,7 +6039,7 @@ sub ConvertDateTime($$)
|
|
|
6018
6039
|
++$a[5];
|
|
6019
6040
|
last; # (this was a goto)
|
|
6020
6041
|
}
|
|
6021
|
-
}
|
|
6042
|
+
}
|
|
6022
6043
|
}
|
|
6023
6044
|
$neg and $frac =~ s/^\.//;
|
|
6024
6045
|
$fmt =~ s/(^|[^%])((%%)*)%-?\.?\d*f/$1$2$frac/g;
|
|
@@ -6198,16 +6219,26 @@ sub GetUnixTime($;$)
|
|
|
6198
6219
|
# Print conversion for file size
|
|
6199
6220
|
# Inputs: 0) file size in bytes
|
|
6200
6221
|
# Returns: converted file size
|
|
6201
|
-
sub ConvertFileSize(
|
|
6202
|
-
{
|
|
6203
|
-
my $val =
|
|
6204
|
-
$
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6209
|
-
|
|
6210
|
-
|
|
6222
|
+
sub ConvertFileSize($;$)
|
|
6223
|
+
{
|
|
6224
|
+
my ($val, $et) = @_;
|
|
6225
|
+
if ($et and $$et{OPTIONS}{ByteUnit} eq 'Binary') {
|
|
6226
|
+
$val < 2048 and return "$val bytes";
|
|
6227
|
+
$val < 10240 and return sprintf('%.1f KiB', $val / 1024);
|
|
6228
|
+
$val < 2097152 and return sprintf('%.0f KiB', $val / 1024);
|
|
6229
|
+
$val < 10485760 and return sprintf('%.1f MiB', $val / 1048576);
|
|
6230
|
+
$val < 2147483648 and return sprintf('%.0f MiB', $val / 1048576);
|
|
6231
|
+
$val < 10737418240 and return sprintf('%.1f GiB', $val / 1073741824);
|
|
6232
|
+
return sprintf('%.0f GiB', $val / 1073741824);
|
|
6233
|
+
} else {
|
|
6234
|
+
$val < 2000 and return "$val bytes";
|
|
6235
|
+
$val < 10000 and return sprintf('%.1f kB', $val / 1000);
|
|
6236
|
+
$val < 2000000 and return sprintf('%.0f kB', $val / 1000);
|
|
6237
|
+
$val < 10000000 and return sprintf('%.1f MB', $val / 1000000);
|
|
6238
|
+
$val < 2000000000 and return sprintf('%.0f MB', $val / 1000000);
|
|
6239
|
+
$val < 10000000000 and return sprintf('%.1f GB', $val / 1000000000);
|
|
6240
|
+
return sprintf('%.0f GB', $val / 1000000000);
|
|
6241
|
+
}
|
|
6211
6242
|
}
|
|
6212
6243
|
|
|
6213
6244
|
#------------------------------------------------------------------------------
|
|
@@ -7475,7 +7506,8 @@ sub ProcessJPEG($$)
|
|
|
7475
7506
|
my $hdr = $1;
|
|
7476
7507
|
$dumpType = 'JUMBF';
|
|
7477
7508
|
SetByteOrder('MM');
|
|
7478
|
-
|
|
7509
|
+
# (sequence should start from 1, but some software incorrectly writes 0)
|
|
7510
|
+
my $seq = Get32u($segDataPt, 4);
|
|
7479
7511
|
my $len = Get32u($segDataPt, 8);
|
|
7480
7512
|
my $type = substr($$segDataPt, 12, 4);
|
|
7481
7513
|
my $hdrLen;
|
|
@@ -7485,14 +7517,13 @@ sub ProcessJPEG($$)
|
|
|
7485
7517
|
} else {
|
|
7486
7518
|
$hdrLen = 8;
|
|
7487
7519
|
}
|
|
7488
|
-
$jumbfChunk{$type} or $jumbfChunk{$type} = [ ];
|
|
7520
|
+
$jumbfChunk{$type} or $jumbfChunk{$type} = [ '' ];
|
|
7489
7521
|
if ($len < $hdrLen) {
|
|
7490
7522
|
$self->Warn('Invalid JUMBF segment');
|
|
7491
|
-
} elsif ($seq
|
|
7492
|
-
$self->Warn('Invalid JUMBF sequence number');
|
|
7493
|
-
} elsif (defined $jumbfChunk{$type}[$seq]) {
|
|
7523
|
+
} elsif (defined $jumbfChunk{$type}[$seq] and length $jumbfChunk{$type}[$seq]) {
|
|
7494
7524
|
$self->Warn('Duplicate JUMBF sequence number');
|
|
7495
7525
|
} else {
|
|
7526
|
+
$seq or $self->Warn('Incorrect JUMBF sequence numbering (should start from 0, not 1)');
|
|
7496
7527
|
# add to list of JUMBF chunks
|
|
7497
7528
|
$jumbfChunk{$type}[$seq] = substr($$segDataPt, 8 + $hdrLen);
|
|
7498
7529
|
# check to see if we have a complete JUMBF box
|
|
@@ -7716,6 +7747,19 @@ sub ProcessTIFF($$;$)
|
|
|
7716
7747
|
return $rtnVal;
|
|
7717
7748
|
}
|
|
7718
7749
|
|
|
7750
|
+
#------------------------------------------------------------------------------
|
|
7751
|
+
# Process TIFF as a sub-document
|
|
7752
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
|
|
7753
|
+
# Returns: 1 if this looked like a valid EXIF block, 0 otherwise, or -1 on write error
|
|
7754
|
+
sub ProcessSubTIFF($$;$)
|
|
7755
|
+
{
|
|
7756
|
+
my ($self, $dirInfo, $tagTablePtr) = @_;
|
|
7757
|
+
$$self{DOC_NUM} = ++$$self{DOC_COUNT};
|
|
7758
|
+
my $rtnVal = $self->ProcessTIFF($dirInfo, $tagTablePtr);
|
|
7759
|
+
delete $$self{DOC_NUM};
|
|
7760
|
+
return $rtnVal;
|
|
7761
|
+
}
|
|
7762
|
+
|
|
7719
7763
|
#------------------------------------------------------------------------------
|
|
7720
7764
|
# Process TIFF data
|
|
7721
7765
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
|
|
@@ -7731,8 +7775,8 @@ sub DoProcessTIFF($$;$)
|
|
|
7731
7775
|
my ($err, $sig, $canonSig, $otherSig);
|
|
7732
7776
|
|
|
7733
7777
|
# attempt to read TIFF header
|
|
7734
|
-
$$self{EXIF_DATA} = '';
|
|
7735
7778
|
if ($raf) {
|
|
7779
|
+
$$self{EXIF_DATA} = '';
|
|
7736
7780
|
if ($outfile) {
|
|
7737
7781
|
$raf->Seek(0, 0) or return 0;
|
|
7738
7782
|
if ($base) {
|
|
@@ -7940,6 +7984,9 @@ sub DoProcessTIFF($$;$)
|
|
|
7940
7984
|
}
|
|
7941
7985
|
if ($$self{TIFF_TYPE} eq 'TIFF') {
|
|
7942
7986
|
$self->FoundTag(PageCount => $$self{PageCount}) if $$self{MultiPage};
|
|
7987
|
+
} elsif ($$self{TIFF_TYPE} eq 'NRW' and $$self{VALUE}{NEFLinearizationTable}) {
|
|
7988
|
+
# fix NEF type if misidentified as NRW
|
|
7989
|
+
$self->OverrideFileType($$self{TIFF_TYPE} = 'NEF');
|
|
7943
7990
|
}
|
|
7944
7991
|
if ($$self{ImageDataHash} and $$self{A100DataOffset} and $raf->Seek($$self{A100DataOffset},0)) {
|
|
7945
7992
|
$self->ImageDataHash($raf, undef, 'A100');
|
|
@@ -8081,8 +8128,8 @@ sub DoProcessTIFF($$;$)
|
|
|
8081
8128
|
# check DNG version
|
|
8082
8129
|
if ($$self{DNGVersion}) {
|
|
8083
8130
|
my $ver = $$self{DNGVersion};
|
|
8084
|
-
# currently support up to DNG version 1.
|
|
8085
|
-
unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.
|
|
8131
|
+
# currently support up to DNG version 1.7
|
|
8132
|
+
unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.7) {
|
|
8086
8133
|
$ver =~ tr/ /./;
|
|
8087
8134
|
$self->Error("DNG Version $ver not yet tested", 1);
|
|
8088
8135
|
}
|
|
@@ -8351,7 +8398,7 @@ sub GetTagInfo($$$;$$$)
|
|
|
8351
8398
|
}
|
|
8352
8399
|
}
|
|
8353
8400
|
# don't return Unknown tags unless that option is set (also see forum13716)
|
|
8354
|
-
if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not
|
|
8401
|
+
if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not
|
|
8355
8402
|
($$self{OPTIONS}{Verbose} or $$self{HTML_DUMP} or
|
|
8356
8403
|
($$self{OPTIONS}{Validate} and not $$tagInfo{AddedUnknown})))
|
|
8357
8404
|
{
|
|
@@ -102,11 +102,11 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
102
102
|
DCP r/w | ICO r | MPG r | PSB r/w | WV r
|
|
103
103
|
DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
|
|
104
104
|
DFONT r | IDML r | MQV r/w | PSP r | XCF r
|
|
105
|
-
DIVX r | IIQ r/w | MRC r | QTIF r/w |
|
|
106
|
-
DJVU r | IND r/w | MRW r/w | R3D r |
|
|
107
|
-
DLL r | INSP r/w | MXF r | RA r |
|
|
108
|
-
DNG r/w | INSV r | NEF r/w | RAF r/w |
|
|
109
|
-
DOC r | INX r | NKSC r/w | RAM r |
|
|
105
|
+
DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
|
|
106
|
+
DJVU r | IND r/w | MRW r/w | R3D r | XLS r
|
|
107
|
+
DLL r | INSP r/w | MXF r | RA r | XLSX r
|
|
108
|
+
DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
|
|
109
|
+
DOC r | INX r | NKSC r/w | RAM r | ZIP r
|
|
110
110
|
DOCX r | ISO r | NRW r/w | RAR r |
|
|
111
111
|
|
|
112
112
|
Meta Information
|
|
@@ -467,6 +467,12 @@ big-endian ('MM') order is assumed. This can also be set via the
|
|
|
467
467
|
L<ExifByteOrder tag|Image::ExifTool::TagNames/Extra Tags>, but the ByteOrder
|
|
468
468
|
option takes precedence if both are set.
|
|
469
469
|
|
|
470
|
+
=item ByteUnit
|
|
471
|
+
|
|
472
|
+
Units for print conversion of FileSize and other byte values. Either 'SI'
|
|
473
|
+
(eg. kB for 1000 bytes) or 'Binary' (eg. KiB for 1024 bytes). Default is
|
|
474
|
+
'SI'.
|
|
475
|
+
|
|
470
476
|
=item Charset
|
|
471
477
|
|
|
472
478
|
Character set for encoding character tag values passed to/from ExifTool with
|
|
@@ -554,12 +560,12 @@ without recoding. Default is 0.
|
|
|
554
560
|
Comma-delimited list of settings for writing compact XMP. Below is a list
|
|
555
561
|
of available settings. Note that 'NoPadding' effects only embedded XMP
|
|
556
562
|
since padding is never written for stand-alone XMP files. Also note that
|
|
557
|
-
'OneDesc' is not recommended when writing XMP larger than 64
|
|
563
|
+
'OneDesc' is not recommended when writing XMP larger than 64 KiB to a JPG
|
|
558
564
|
file because it interferes with ExifTool's technique of splitting off large
|
|
559
565
|
rdf:Description elements into the extended XMP. Case is not significant for
|
|
560
566
|
any of these options. Aliases are given in brackets. Default is undef.
|
|
561
567
|
|
|
562
|
-
NoPadding - Avoid 2
|
|
568
|
+
NoPadding - Avoid 2 KiB of recommended padding at end of XMP (NoPad)
|
|
563
569
|
NoIndent - No spaces to indent lines (NoSpace, NoSpaces)
|
|
564
570
|
NoNewline - Avoid unnecessary newlines (NoNewlines)
|
|
565
571
|
Shorthand - Use XMP Shorthand format
|
|
@@ -2440,7 +2446,7 @@ ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1,
|
|
|
2440
2446
|
IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList, JFIF, JFXX,
|
|
2441
2447
|
JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys, Kodak,
|
|
2442
2448
|
KodakBordersIFD, KodakEffectsIFD, KodakIFD, KyoceraRaw, LNK, Leaf,
|
|
2443
|
-
LeafSubIFD, Leica, Lyrics3, Lytro, M2TS, MAC, MIE-Audio, MIE-Camera,
|
|
2449
|
+
LeafSubIFD, Leica, Lyrics3, Lytro, M-RAW, M2TS, MAC, MIE-Audio, MIE-Camera,
|
|
2444
2450
|
MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo, MIE-Image,
|
|
2445
2451
|
MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview,
|
|
2446
2452
|
MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB, MNG, MOBI, MOI,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "exiftool-vendored.exe",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.70.0",
|
|
4
4
|
"description": "Vendored win32 ExifTool for Node.js",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"homepage": "https://github.com/mceachen/exiftool-vendored.exe#readme",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"mocha": "^10.2.0",
|
|
45
|
-
"prettier": "^3.0
|
|
46
|
-
"release-it": "^
|
|
45
|
+
"prettier": "^3.1.0",
|
|
46
|
+
"release-it": "^17.0.0"
|
|
47
47
|
}
|
|
48
48
|
}
|