exiftool_vendored 9.45.0 → 9.46.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.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +8 -8
- data/bin/Image-ExifTool-9.46/Changes +6444 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/MANIFEST +0 -0
- data/bin/Image-ExifTool-9.46/META.yml +27 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/Makefile.PL +0 -0
- data/bin/Image-ExifTool-9.46/README +228 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/exif2iptc.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/exif2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/gps2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/iptc2exif.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/iptc2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/iptcCore.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/pdf2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/xmp2exif.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/xmp2gps.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/xmp2iptc.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/arg_files/xmp2pdf.args +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/config_files/ExifTool_config +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/config_files/convert_regions.config +0 -0
- data/bin/Image-ExifTool-9.46/exiftool +5767 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/fmt_files/gpx.fmt +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/fmt_files/gpx_wpt.fmt +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/fmt_files/kml.fmt +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/ExifTool.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/MIE1.1-20070121.pdf +0 -0
- data/bin/Image-ExifTool-9.46/html/Shift.html +173 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/AFCP.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/AIFF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/APE.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/APP12.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/ASF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Apple.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/BMP.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Canon.html +8322 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/CanonCustom.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/CanonRaw.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/CanonVRD.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Casio.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Composite.html +673 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/DICOM.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/DNG.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/DPX.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/DV.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/DarwinCore.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/DjVu.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/EXE.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/EXIF.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Extra.html +309 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/FLAC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/FLIR.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Flash.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/FlashPix.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Font.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/FotoStation.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/FujiFilm.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/GE.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/GIF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/GIMP.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/GPS.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/GeoTiff.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/H264.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/HP.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/HTML.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/ICC_Profile.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/ID3.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/IPTC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/ITC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/JFIF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/JPEG.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/JVC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Jpeg2000.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Kodak.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/KyoceraRaw.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/LNK.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Leaf.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/M2TS.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MIE.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MIFF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MNG.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MPC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MPEG.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MPF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MWG.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MXF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Matroska.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Microsoft.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Minolta.html +2568 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/MinoltaRaw.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Nikon.html +4498 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/NikonCapture.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/NikonCustom.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/OOXML.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Ogg.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Olympus.html +3401 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/OpenEXR.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PDF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PGF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PICT.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PLIST.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PNG.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PSP.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Panasonic.html +1599 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PanasonicRaw.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Pentax.html +4528 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PhaseOne.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PhotoCD.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PhotoMechanic.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Photoshop.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PostScript.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/PrintIM.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Qualcomm.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/QuickTime.html +3438 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/RIFF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/RSRC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/RTF.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Radiance.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Rawzor.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Real.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Reconyx.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Ricoh.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Samsung.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Sanyo.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Scalado.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Shortcuts.html +240 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Sigma.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/SigmaRaw.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/Sony.html +5721 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/SonyIDC.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Stim.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Theora.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Torrent.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Unknown.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/Vorbis.html +0 -0
- data/bin/Image-ExifTool-9.46/html/TagNames/XMP.html +7939 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/ZIP.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/iWork.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/index.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/TagNames/style.css +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/ancient_history.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/canon_raw.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/commentary.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/config.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/data_members.html +0 -0
- data/bin/Image-ExifTool-9.46/html/exiftool_pod.html +2370 -0
- data/bin/Image-ExifTool-9.46/html/faq.html +1435 -0
- data/bin/Image-ExifTool-9.46/html/filename.html +294 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/geotag.html +0 -0
- data/bin/Image-ExifTool-9.46/html/history.html +377 -0
- data/bin/Image-ExifTool-9.46/html/htmldump.html +733 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/idiosyncracies.html +0 -0
- data/bin/Image-ExifTool-9.46/html/index.html +1283 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/install.html +0 -0
- data/bin/Image-ExifTool-9.46/html/metafiles.html +274 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/overview.png +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/standards.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/struct.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/style.css +0 -0
- data/bin/Image-ExifTool-9.46/html/under.html +126 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/verbose.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/html/writing.html +0 -0
- data/bin/Image-ExifTool-9.46/lib/File/RandomAccess.pm +378 -0
- data/bin/Image-ExifTool-9.46/lib/File/RandomAccess.pod +231 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool.pm +6916 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool.pod +2406 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/AES.pm +501 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/AFCP.pm +284 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/AIFF.pm +271 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/APE.pm +262 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/APP12.pm +322 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/ASF.pm +884 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Apple.pm +113 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/BMP.pm +179 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/BZZ.pm +472 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/BigTIFF.pm +282 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/BuildTagLookup.pm +2425 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Canon.pm +7983 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/CanonCustom.pm +2523 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/CanonRaw.pm +931 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/CanonVRD.pm +1481 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/CaptureOne.pm +235 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Casio.pm +2013 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Charset.pm +396 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/DICOM.pm +3874 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/DNG.pm +835 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/DPX.pm +151 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/DV.pm +319 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/DarwinCore.pm +317 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/DjVu.pm +376 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/EXE.pm +1228 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Exif.pm +4596 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/FLAC.pm +296 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/FLIR.pm +1232 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Fixup.pm +354 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Flash.pm +755 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/FlashPix.pm +1882 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Font.pm +643 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/FotoStation.pm +259 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/FujiFilm.pm +1088 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/GE.pm +80 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/GIF.pm +542 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/GIMP.pm +258 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/GPS.pm +514 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/GeoTiff.pm +2187 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Geotag.pm +1176 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/H264.pm +1102 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/HP.pm +262 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/HTML.pm +576 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/HtmlDump.pm +895 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/ICC_Profile.pm +999 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/ID3.pm +1532 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/IPTC.pm +1244 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/ITC.pm +215 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Import.pm +308 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/InDesign.pm +277 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/JPEG.pm +522 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/JVC.pm +130 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Jpeg2000.pm +873 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Kodak.pm +2014 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/LNK.pm +723 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/cs.pm +1586 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/de.pm +7356 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/es.pm +4017 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/fi.pm +2856 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/fr.pm +4738 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/it.pm +7918 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/ja.pm +5815 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/ko.pm +2332 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/nl.pm +3220 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/pl.pm +1140 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/ru.pm +769 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/sv.pm +639 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/tr.pm +544 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Leaf.pm +515 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/M2TS.pm +725 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MIE.pm +2561 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MIEUnits.pod +377 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MIFF.pm +279 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MNG.pm +684 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MPC.pm +156 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MPEG.pm +736 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MPF.pm +289 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MWG.pm +748 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MXF.pm +3032 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MakerNotes.pm +1598 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Matroska.pm +891 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Microsoft.pm +879 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Minolta.pm +2861 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Nikon.pm +6145 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/NikonCapture.pm +911 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/NikonCustom.pm +4405 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/OOXML.pm +409 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Ogg.pm +237 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Olympus.pm +3630 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/OpenEXR.pm +324 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PDF.pm +2327 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PGF.pm +143 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PICT.pm +1260 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PLIST.pm +453 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PNG.pm +1161 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PPM.pm +169 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PSP.pm +305 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Panasonic.pm +2205 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Pentax.pm +5792 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PhaseOne.pm +557 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PhotoCD.pm +507 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Photoshop.pm +629 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PostScript.pm +693 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/PrintIM.pm +125 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Qualcomm.pm +1344 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/QuickTime.pm +3910 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/lib/Image/ExifTool/README +0 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/RIFF.pm +1332 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/RSRC.pm +241 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/RTF.pm +383 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Radiance.pm +144 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Rawzor.pm +190 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Real.pm +736 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Reconyx.pm +190 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Ricoh.pm +1039 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Samsung.pm +846 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Sanyo.pm +439 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Scalado.pm +141 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Shift.pl +594 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Shortcuts.pm +298 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Sigma.pm +574 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/SigmaRaw.pm +649 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Sony.pm +7072 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/SonyIDC.pm +330 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Stim.pm +196 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/TagInfoXML.pm +794 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/TagLookup.pm +8365 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/TagNames.pod +26883 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Theora.pm +145 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Torrent.pm +317 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Unknown.pm +66 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Vorbis.pm +237 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WriteExif.pl +3685 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WriteIPTC.pl +702 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WritePDF.pl +765 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WritePNG.pl +376 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WritePostScript.pl +777 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WriteQuickTime.pl +344 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/WriteXMP.pl +1318 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/Writer.pl +5851 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/XMP.pm +3755 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/XMP2.pl +1303 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/XMPStruct.pl +814 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/ZIP.pm +623 -0
- data/bin/Image-ExifTool-9.46/lib/Image/ExifTool/iWork.pm +223 -0
- data/bin/Image-ExifTool-9.46/perl-Image-ExifTool.spec +105 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/AFCP.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/AFCP_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/AFCP_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/AIFF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/AIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/APE.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/APE_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/APE_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ASF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ASF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/BMP.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/BMP_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/BigTIFF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/BigTIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Canon.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonRaw.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonRaw_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonRaw_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonRaw_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonRaw_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonRaw_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_11.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_12.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/CanonVRD_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Canon_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Canon_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Casio.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Casio_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Casio_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Casio_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Casio_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Casio_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DICOM.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DICOM_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DNG.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DNG_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DNG_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DPX.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DPX_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DV.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DV_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DjVu.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/DjVu_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/EXE.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/EXE_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/EXE_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/EXE_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_16.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_17.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_20.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_21.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_22.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_23.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_24.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_25.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_26.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ExifTool_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FLAC.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FLAC_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FLAC_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FLIR.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FLIR_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FLIR_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Flash.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FlashPix.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FlashPix_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Flash_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Flash_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Font_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FotoStation.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FotoStation_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FotoStation_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FujiFilm.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FujiFilm_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FujiFilm_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FujiFilm_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/FujiFilm_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GE.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GE_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GE_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GIF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GIF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GIF_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GIF_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GIMP.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GIMP_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GPS.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GPS_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GPS_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GeoTiff.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GeoTiff_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/GeoTiff_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Geotag_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/HTML.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/HTML_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/IPTC_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ITC.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ITC_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/InDesign.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/InDesign_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/InDesign_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/InDesign_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/JVC.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/JVC_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/JVC_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Jpeg2000.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Jpeg2000_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Jpeg2000_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Jpeg2000_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Kodak.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Kodak_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Kodak_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/KyoceraRaw.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/KyoceraRaw_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/LNK.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/LNK_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_1.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_10.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_11.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_12.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_13.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_14.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_15.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_16.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_17.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_18.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Lang_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/M2TS.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/M2TS_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIE.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIE_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIE_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIE_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIE_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIFF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MP3.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MP3_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MWG.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MWG_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MWG_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MWG_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MWG_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MWG_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MXF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/MXF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Matroska.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Matroska_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Minolta.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Minolta_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Minolta_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Minolta_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Nikon_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Olympus_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/OpenEXR.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/OpenEXR_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_10.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_11.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_12.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_14.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_15.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_16.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_17.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_18.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_19.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_20.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_22.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PDF_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PGF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PGF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PICT.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PICT_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PLIST.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PLIST_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PLIST_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PNG.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PNG_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PNG_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PNG_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PNG_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PPM.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PPM_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PPM_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PSP.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PSP_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Panasonic.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Panasonic_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Panasonic_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Panasonic_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Panasonic_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Pentax.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Pentax_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Pentax_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Pentax_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PhotoCD.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PhotoCD_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PhotoMechanic.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PhotoMechanic_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PhotoMechanic_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Photoshop.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Photoshop_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Photoshop_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PostScript.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PostScript_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/PostScript_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/QuickTime.t +0 -0
- data/bin/Image-ExifTool-9.46/t/QuickTime_2.out +131 -0
- data/bin/Image-ExifTool-9.46/t/QuickTime_3.out +72 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/QuickTime_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/QuickTime_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/RIFF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/RIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/RIFF_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/RIFF_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/RTF.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/RTF_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Radiance.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Radiance_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Real.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Real_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Real_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Real_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Ricoh.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Ricoh_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Ricoh_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Ricoh_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sanyo.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sanyo_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sanyo_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sigma.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sigma_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sigma_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sigma_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sigma_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sony.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sony_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sony_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Sony_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/TestLib.pm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Torrent.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Torrent_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Unknown.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Unknown_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Unknown_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Vorbis.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Vorbis_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_10.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_11.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_13.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_14.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_15.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_16.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_17.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_18.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_19.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_22.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_24.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_25.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_26.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_27.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_28.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_29.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_30.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_31.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_32.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_33.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_34.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_35.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_36.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_37.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_38.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_39.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_40.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_41.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_42.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_43.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_44.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_45.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_46.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_47.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_48.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_50.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_51.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_52.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_53.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_54.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/Writer_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_10.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_11.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_12.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_13.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_14.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_15.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_16.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_17.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_18.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_19.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_20.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_21.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_22.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_23.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_24.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_25.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_26.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_27.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_28.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_29.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_30.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_31.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_32.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_34.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_36.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_37.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_39.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_40.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_41.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_8.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/XMP_9.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP.t +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP_2.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP_3.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP_4.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP_5.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP_6.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/ZIP_7.out +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/AFCP.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/AIFF.aif +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/APE.ape +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/APE.mpc +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ASF.wmv +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/BMP.bmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/BigTIFF.btf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Canon.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Canon1DmkIII.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/CanonRaw.cr2 +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/CanonRaw.crw +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/CanonVRD.vrd +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/CaptureOne.eip +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Casio.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Casio2.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/CasioQVCI.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/DICOM.dcm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/DNG.dng +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/DPX.dpx +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/DV.dv +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/DjVu.djvu +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/EXE.elf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/EXE.exe +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/EXE.macho +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ExifTool.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ExifTool.tif +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ExtendedXMP.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FLAC.flac +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FLAC.ogg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FLIR.fpf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FLIR.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Flash.flv +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Flash.swf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FlashPix.ppt +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Font.afm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Font.dfont +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Font.pfa +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Font.pfb +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Font.pfm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Font.ttf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FotoStation.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FujiFilm.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/FujiFilm.raf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/GE.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/GIF.gif +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/GIMP.xcf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/GPS.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/GeoTiff.tif +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Geotag.gpx +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Geotag.igc +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Geotag.kml +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Geotag.log +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Geotag.xml +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Geotag2.log +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/HTML.html +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/IPTC.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ITC.itc +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/InDesign.indd +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/JVC.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/JVC2.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Jpeg2000.j2c +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Jpeg2000.jp2 +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Kodak.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/KyoceraRaw.raw +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/LNK.lnk +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/M2TS.mts +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/MIE.mie +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/MIFF.miff +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/MP3.mp3 +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/MWG.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/MXF.mxf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Matroska.mkv +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Minolta.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Minolta.mrw +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Nikon.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Nikon.nef +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/NikonD2Hs.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/NikonD70.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/OOXML.docx +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Olympus.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Olympus2.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/OlympusE1.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/OpenDoc.ods +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/OpenEXR.exr +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PDF.pdf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PDF2.pdf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PGF.pgf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PICT.pict +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PLIST-bin.plist +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PLIST-xml.plist +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PNG.png +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PPM.ppm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PSP.psp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Panasonic.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Panasonic.rw2 +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Pentax.avi +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Pentax.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PhotoCD.pcd +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PhotoMechanic.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Photoshop.psd +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/PostScript.eps +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/QuickTime.m4a +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/QuickTime.mov +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/RIFF.avi +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/RIFF.wav +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/RIFF.webp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/RTF.rtf +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Radiance.hdr +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Real.ra +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Real.ram +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Real.rm +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Ricoh.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Ricoh2.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Sanyo.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Sigma.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Sigma.x3f +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/SigmaDP2.x3f +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Sony.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Sony.pmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Torrent.torrent +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Unknown.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Vorbis.ogg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/Writer.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP.inx +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP.jpg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP.svg +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP.xml +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP.xmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP2.xmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP3.xmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP4.xmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/XMP5.xmp +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ZIP.gz +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/ZIP.zip +0 -0
- data/bin/{Image-ExifTool-9.45 → Image-ExifTool-9.46}/t/images/iWork.numbers +0 -0
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +886 -886
- data/bin/Image-ExifTool-9.45/Changes +0 -6430
- data/bin/Image-ExifTool-9.45/META.yml +0 -27
- data/bin/Image-ExifTool-9.45/README +0 -228
- data/bin/Image-ExifTool-9.45/exiftool +0 -5767
- data/bin/Image-ExifTool-9.45/html/Shift.html +0 -173
- data/bin/Image-ExifTool-9.45/html/TagNames/Canon.html +0 -8302
- data/bin/Image-ExifTool-9.45/html/TagNames/Composite.html +0 -672
- data/bin/Image-ExifTool-9.45/html/TagNames/Extra.html +0 -308
- data/bin/Image-ExifTool-9.45/html/TagNames/Minolta.html +0 -2568
- data/bin/Image-ExifTool-9.45/html/TagNames/Nikon.html +0 -4495
- data/bin/Image-ExifTool-9.45/html/TagNames/Olympus.html +0 -3400
- data/bin/Image-ExifTool-9.45/html/TagNames/Panasonic.html +0 -1585
- data/bin/Image-ExifTool-9.45/html/TagNames/Pentax.html +0 -4527
- data/bin/Image-ExifTool-9.45/html/TagNames/QuickTime.html +0 -3397
- data/bin/Image-ExifTool-9.45/html/TagNames/Shortcuts.html +0 -239
- data/bin/Image-ExifTool-9.45/html/TagNames/Sony.html +0 -5721
- data/bin/Image-ExifTool-9.45/html/TagNames/XMP.html +0 -7927
- data/bin/Image-ExifTool-9.45/html/exiftool_pod.html +0 -2370
- data/bin/Image-ExifTool-9.45/html/faq.html +0 -1434
- data/bin/Image-ExifTool-9.45/html/filename.html +0 -282
- data/bin/Image-ExifTool-9.45/html/history.html +0 -362
- data/bin/Image-ExifTool-9.45/html/htmldump.html +0 -732
- data/bin/Image-ExifTool-9.45/html/index.html +0 -1283
- data/bin/Image-ExifTool-9.45/html/metafiles.html +0 -266
- data/bin/Image-ExifTool-9.45/html/under.html +0 -124
- data/bin/Image-ExifTool-9.45/lib/File/RandomAccess.pm +0 -378
- data/bin/Image-ExifTool-9.45/lib/File/RandomAccess.pod +0 -231
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool.pm +0 -6894
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool.pod +0 -2406
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/AES.pm +0 -501
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/AFCP.pm +0 -284
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/AIFF.pm +0 -271
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/APE.pm +0 -262
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/APP12.pm +0 -322
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/ASF.pm +0 -884
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Apple.pm +0 -113
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/BMP.pm +0 -179
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/BZZ.pm +0 -472
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/BigTIFF.pm +0 -282
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/BuildTagLookup.pm +0 -2421
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Canon.pm +0 -7985
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/CanonCustom.pm +0 -2523
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/CanonRaw.pm +0 -931
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/CanonVRD.pm +0 -1481
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/CaptureOne.pm +0 -235
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Casio.pm +0 -2013
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Charset.pm +0 -396
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/DICOM.pm +0 -3874
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/DNG.pm +0 -835
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/DPX.pm +0 -151
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/DV.pm +0 -319
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/DarwinCore.pm +0 -317
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/DjVu.pm +0 -376
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/EXE.pm +0 -1228
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Exif.pm +0 -4596
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/FLAC.pm +0 -296
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/FLIR.pm +0 -1232
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Fixup.pm +0 -354
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Flash.pm +0 -755
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/FlashPix.pm +0 -1882
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Font.pm +0 -643
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/FotoStation.pm +0 -259
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/FujiFilm.pm +0 -1088
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/GE.pm +0 -80
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/GIF.pm +0 -542
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/GIMP.pm +0 -258
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/GPS.pm +0 -514
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/GeoTiff.pm +0 -2187
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Geotag.pm +0 -1176
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/H264.pm +0 -1102
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/HP.pm +0 -262
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/HTML.pm +0 -576
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/HtmlDump.pm +0 -895
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/ICC_Profile.pm +0 -999
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/ID3.pm +0 -1532
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/IPTC.pm +0 -1244
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/ITC.pm +0 -215
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Import.pm +0 -308
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/InDesign.pm +0 -277
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/JPEG.pm +0 -522
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/JPEGDigest.pm +0 -2511
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/JVC.pm +0 -130
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Jpeg2000.pm +0 -873
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Kodak.pm +0 -2014
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/KyoceraRaw.pm +0 -173
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/LNK.pm +0 -723
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/cs.pm +0 -1586
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/de.pm +0 -7356
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/en_ca.pm +0 -557
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/en_gb.pm +0 -572
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/es.pm +0 -4017
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/fi.pm +0 -2856
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/fr.pm +0 -4720
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/it.pm +0 -7918
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/ja.pm +0 -5815
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/ko.pm +0 -2332
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/nl.pm +0 -3220
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/pl.pm +0 -1140
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/ru.pm +0 -769
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/sv.pm +0 -639
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/tr.pm +0 -544
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1329
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Lang/zh_tw.pm +0 -802
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Leaf.pm +0 -515
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/M2TS.pm +0 -725
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MIE.pm +0 -2561
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MIEUnits.pod +0 -377
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MIFF.pm +0 -279
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MNG.pm +0 -684
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MPC.pm +0 -156
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MPEG.pm +0 -736
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MPF.pm +0 -289
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MWG.pm +0 -748
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MXF.pm +0 -3032
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MakerNotes.pm +0 -1598
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Matroska.pm +0 -891
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Microsoft.pm +0 -879
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Minolta.pm +0 -2859
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/MinoltaRaw.pm +0 -534
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Nikon.pm +0 -6141
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/NikonCapture.pm +0 -911
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/NikonCustom.pm +0 -4405
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/OOXML.pm +0 -409
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Ogg.pm +0 -237
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Olympus.pm +0 -3628
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/OpenEXR.pm +0 -324
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PDF.pm +0 -2327
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PGF.pm +0 -143
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PICT.pm +0 -1260
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PLIST.pm +0 -453
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PNG.pm +0 -1161
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PPM.pm +0 -169
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PSP.pm +0 -305
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Panasonic.pm +0 -2180
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PanasonicRaw.pm +0 -535
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Pentax.pm +0 -5788
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PhaseOne.pm +0 -557
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PhotoCD.pm +0 -507
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PhotoMechanic.pm +0 -256
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Photoshop.pm +0 -629
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PostScript.pm +0 -693
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/PrintIM.pm +0 -125
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Qualcomm.pm +0 -1344
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/QuickTime.pm +0 -3849
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/RIFF.pm +0 -1332
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/RSRC.pm +0 -241
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/RTF.pm +0 -383
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Radiance.pm +0 -144
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Rawzor.pm +0 -190
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Real.pm +0 -736
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Reconyx.pm +0 -190
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Ricoh.pm +0 -1039
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Samsung.pm +0 -846
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Sanyo.pm +0 -439
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Scalado.pm +0 -141
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Shift.pl +0 -594
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Shortcuts.pm +0 -293
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Sigma.pm +0 -574
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/SigmaRaw.pm +0 -649
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Sony.pm +0 -7072
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/SonyIDC.pm +0 -330
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Stim.pm +0 -196
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/TagInfoXML.pm +0 -794
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/TagLookup.pm +0 -8351
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/TagNames.pod +0 -26867
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Theora.pm +0 -145
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Torrent.pm +0 -317
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Unknown.pm +0 -66
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Vorbis.pm +0 -237
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WriteCanonRaw.pl +0 -637
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WriteExif.pl +0 -3685
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WriteIPTC.pl +0 -702
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WritePDF.pl +0 -765
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WritePNG.pl +0 -376
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WritePhotoshop.pl +0 -266
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WritePostScript.pl +0 -777
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WriteQuickTime.pl +0 -344
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/WriteXMP.pl +0 -1318
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/Writer.pl +0 -5851
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/XMP.pm +0 -3755
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/XMP2.pl +0 -1299
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/XMPStruct.pl +0 -814
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/ZIP.pm +0 -623
- data/bin/Image-ExifTool-9.45/lib/Image/ExifTool/iWork.pm +0 -223
- data/bin/Image-ExifTool-9.45/perl-Image-ExifTool.spec +0 -105
- data/bin/Image-ExifTool-9.45/t/QuickTime_2.out +0 -130
- data/bin/Image-ExifTool-9.45/t/QuickTime_3.out +0 -71
@@ -0,0 +1,4596 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# File: Exif.pm
|
3
|
+
#
|
4
|
+
# Description: Read EXIF/TIFF meta information
|
5
|
+
#
|
6
|
+
# Revisions: 11/25/2003 - P. Harvey Created
|
7
|
+
# 02/06/2004 - P. Harvey Moved processing functions from ExifTool
|
8
|
+
# 03/19/2004 - P. Harvey Check PreviewImage for validity
|
9
|
+
# 11/11/2004 - P. Harvey Split off maker notes into MakerNotes.pm
|
10
|
+
# 12/13/2004 - P. Harvey Added AUTOLOAD to load write routines
|
11
|
+
#
|
12
|
+
# References: 0) http://www.exif.org/Exif2-2.PDF
|
13
|
+
# 1) http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf
|
14
|
+
# 2) http://www.adobe.com/products/dng/pdfs/dng_spec_1_3_0_0.pdf
|
15
|
+
# 3) http://www.awaresystems.be/imaging/tiff/tifftags.html
|
16
|
+
# 4) http://www.remotesensing.org/libtiff/TIFFTechNote2.html
|
17
|
+
# 5) http://www.exif.org/dcf.PDF
|
18
|
+
# 6) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
|
19
|
+
# 7) http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf
|
20
|
+
# 8) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
|
21
|
+
# 9) http://hul.harvard.edu/jhove/tiff-tags.html
|
22
|
+
# 10) http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf
|
23
|
+
# 11) Robert Mucke private communication
|
24
|
+
# 12) http://www.broomscloset.com/closet/photo/exif/TAG2000-22_DIS12234-2.PDF
|
25
|
+
# 13) http://www.microsoft.com/whdc/xps/wmphoto.mspx
|
26
|
+
# 14) http://www.asmail.be/msg0054681802.html
|
27
|
+
# 15) http://crousseau.free.fr/imgfmt_raw.htm
|
28
|
+
# 16) http://www.cybercom.net/~dcoffin/dcraw/
|
29
|
+
# 17) http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml
|
30
|
+
# 18) http://www.asmail.be/msg0055568584.html
|
31
|
+
# 19) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf
|
32
|
+
# 20) http://tiki-lounge.com/~raf/tiff/fields.html
|
33
|
+
# 21) http://community.roxen.com/developers/idocs/rfc/rfc3949.html
|
34
|
+
# 22) http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01
|
35
|
+
# 23) MetaMorph Stack (STK) Image File Format:
|
36
|
+
# --> ftp://ftp.meta.moleculardevices.com/support/stack/STK.doc
|
37
|
+
# 24) http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf (Exif 2.3)
|
38
|
+
# 25) Vesa Kivisto private communication (7D)
|
39
|
+
# 26) Jeremy Brown private communication
|
40
|
+
# 27) Gregg Lee private communication
|
41
|
+
# 28) http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf
|
42
|
+
# JD) Jens Duttke private communication
|
43
|
+
#------------------------------------------------------------------------------
|
44
|
+
|
45
|
+
package Image::ExifTool::Exif;
|
46
|
+
|
47
|
+
use strict;
|
48
|
+
use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
49
|
+
%lightSource %flash %compression %photometricInterpretation %orientation
|
50
|
+
%subfileType);
|
51
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
52
|
+
use Image::ExifTool::MakerNotes;
|
53
|
+
|
54
|
+
$VERSION = '3.60';
|
55
|
+
|
56
|
+
sub ProcessExif($$$);
|
57
|
+
sub WriteExif($$$);
|
58
|
+
sub CheckExif($$$);
|
59
|
+
sub RebuildMakerNotes($$$);
|
60
|
+
sub EncodeExifText($$);
|
61
|
+
sub ValidateIFD($;$);
|
62
|
+
sub ProcessTiffIFD($$$);
|
63
|
+
sub PrintParameter($$$);
|
64
|
+
sub GetOffList($$$$$);
|
65
|
+
sub PrintLensInfo($);
|
66
|
+
sub ConvertLensInfo($);
|
67
|
+
|
68
|
+
# size limit for loading binary data block into memory
|
69
|
+
sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
|
70
|
+
|
71
|
+
# byte sizes for the various EXIF format types below
|
72
|
+
@formatSize = (undef,1,1,2,4,8,1,1,2,4,8,4,8,4,2,8,8,8,8);
|
73
|
+
|
74
|
+
@formatName = (
|
75
|
+
undef, 'int8u', 'string', 'int16u',
|
76
|
+
'int32u', 'rational64u','int8s', 'undef',
|
77
|
+
'int16s', 'int32s', 'rational64s','float',
|
78
|
+
'double', 'ifd', 'unicode', 'complex',
|
79
|
+
'int64u', 'int64s', 'ifd64', # (new BigTIFF formats)
|
80
|
+
);
|
81
|
+
|
82
|
+
# hash to look up EXIF format numbers by name
|
83
|
+
# (format types are all lower case)
|
84
|
+
%formatNumber = (
|
85
|
+
'int8u' => 1, # BYTE
|
86
|
+
'string' => 2, # ASCII
|
87
|
+
'int16u' => 3, # SHORT
|
88
|
+
'int32u' => 4, # LONG
|
89
|
+
'rational64u' => 5, # RATIONAL
|
90
|
+
'int8s' => 6, # SBYTE
|
91
|
+
'undef' => 7, # UNDEFINED
|
92
|
+
'binary' => 7, # (treat binary data as undef)
|
93
|
+
'int16s' => 8, # SSHORT
|
94
|
+
'int32s' => 9, # SLONG
|
95
|
+
'rational64s' => 10, # SRATIONAL
|
96
|
+
'float' => 11, # FLOAT
|
97
|
+
'double' => 12, # DOUBLE
|
98
|
+
'ifd' => 13, # IFD (with int32u format)
|
99
|
+
'unicode' => 14, # UNICODE [see Note below]
|
100
|
+
'complex' => 15, # COMPLEX [see Note below]
|
101
|
+
'int64u' => 16, # LONG8 [BigTIFF]
|
102
|
+
'int64s' => 17, # SLONG8 [BigTIFF]
|
103
|
+
'ifd64' => 18, # IFD8 (with int64u format) [BigTIFF]
|
104
|
+
# Note: unicode and complex types are not yet properly supported by ExifTool.
|
105
|
+
# These are types which have been observed in the Adobe DNG SDK code, but
|
106
|
+
# aren't fully supported there either. We know the sizes, but that's about it.
|
107
|
+
# We don't know if the unicode is null terminated, or the format for complex
|
108
|
+
# (although I suspect it would be two 4-byte floats, real and imaginary).
|
109
|
+
);
|
110
|
+
|
111
|
+
# lookup for integer format strings
|
112
|
+
%intFormat = (
|
113
|
+
'int8u' => 1,
|
114
|
+
'int16u' => 3,
|
115
|
+
'int32u' => 4,
|
116
|
+
'int8s' => 6,
|
117
|
+
'int16s' => 8,
|
118
|
+
'int32s' => 9,
|
119
|
+
'ifd' => 13,
|
120
|
+
'int64u' => 16,
|
121
|
+
'int64s' => 17,
|
122
|
+
'ifd64' => 18,
|
123
|
+
);
|
124
|
+
|
125
|
+
# EXIF LightSource PrintConv values
|
126
|
+
%lightSource = (
|
127
|
+
0 => 'Unknown',
|
128
|
+
1 => 'Daylight',
|
129
|
+
2 => 'Fluorescent',
|
130
|
+
3 => 'Tungsten (Incandescent)',
|
131
|
+
4 => 'Flash',
|
132
|
+
9 => 'Fine Weather',
|
133
|
+
10 => 'Cloudy',
|
134
|
+
11 => 'Shade',
|
135
|
+
12 => 'Daylight Fluorescent', # (D 5700 - 7100K)
|
136
|
+
13 => 'Day White Fluorescent', # (N 4600 - 5500K)
|
137
|
+
14 => 'Cool White Fluorescent', # (W 3800 - 4500K)
|
138
|
+
15 => 'White Fluorescent', # (WW 3250 - 3800K)
|
139
|
+
16 => 'Warm White Fluorescent', # (L 2600 - 3250K)
|
140
|
+
17 => 'Standard Light A',
|
141
|
+
18 => 'Standard Light B',
|
142
|
+
19 => 'Standard Light C',
|
143
|
+
20 => 'D55',
|
144
|
+
21 => 'D65',
|
145
|
+
22 => 'D75',
|
146
|
+
23 => 'D50',
|
147
|
+
24 => 'ISO Studio Tungsten',
|
148
|
+
255 => 'Other',
|
149
|
+
);
|
150
|
+
|
151
|
+
# EXIF Flash values
|
152
|
+
%flash = (
|
153
|
+
OTHER => sub {
|
154
|
+
# translate "Off" and "On" when writing
|
155
|
+
my ($val, $inv) = @_;
|
156
|
+
return undef unless $inv and $val =~ /^(off|on)$/i;
|
157
|
+
return lc $val eq 'off' ? 0x00 : 0x01;
|
158
|
+
},
|
159
|
+
0x00 => 'No Flash',
|
160
|
+
0x01 => 'Fired',
|
161
|
+
0x05 => 'Fired, Return not detected',
|
162
|
+
0x07 => 'Fired, Return detected',
|
163
|
+
0x08 => 'On, Did not fire', # not charged up?
|
164
|
+
0x09 => 'On, Fired',
|
165
|
+
0x0d => 'On, Return not detected',
|
166
|
+
0x0f => 'On, Return detected',
|
167
|
+
0x10 => 'Off, Did not fire',
|
168
|
+
0x14 => 'Off, Did not fire, Return not detected',
|
169
|
+
0x18 => 'Auto, Did not fire',
|
170
|
+
0x19 => 'Auto, Fired',
|
171
|
+
0x1d => 'Auto, Fired, Return not detected',
|
172
|
+
0x1f => 'Auto, Fired, Return detected',
|
173
|
+
0x20 => 'No flash function',
|
174
|
+
0x30 => 'Off, No flash function',
|
175
|
+
0x41 => 'Fired, Red-eye reduction',
|
176
|
+
0x45 => 'Fired, Red-eye reduction, Return not detected',
|
177
|
+
0x47 => 'Fired, Red-eye reduction, Return detected',
|
178
|
+
0x49 => 'On, Red-eye reduction',
|
179
|
+
0x4d => 'On, Red-eye reduction, Return not detected',
|
180
|
+
0x4f => 'On, Red-eye reduction, Return detected',
|
181
|
+
0x50 => 'Off, Red-eye reduction',
|
182
|
+
0x58 => 'Auto, Did not fire, Red-eye reduction',
|
183
|
+
0x59 => 'Auto, Fired, Red-eye reduction',
|
184
|
+
0x5d => 'Auto, Fired, Red-eye reduction, Return not detected',
|
185
|
+
0x5f => 'Auto, Fired, Red-eye reduction, Return detected',
|
186
|
+
);
|
187
|
+
|
188
|
+
# TIFF Compression values
|
189
|
+
# (values with format "Xxxxx XXX Compressed" are used to identify RAW file types)
|
190
|
+
%compression = (
|
191
|
+
1 => 'Uncompressed',
|
192
|
+
2 => 'CCITT 1D',
|
193
|
+
3 => 'T4/Group 3 Fax',
|
194
|
+
4 => 'T6/Group 4 Fax',
|
195
|
+
5 => 'LZW',
|
196
|
+
6 => 'JPEG (old-style)', #3
|
197
|
+
7 => 'JPEG', #4
|
198
|
+
8 => 'Adobe Deflate', #3
|
199
|
+
9 => 'JBIG B&W', #3
|
200
|
+
10 => 'JBIG Color', #3
|
201
|
+
99 => 'JPEG', #16
|
202
|
+
262 => 'Kodak 262', #16
|
203
|
+
32766 => 'Next', #3
|
204
|
+
32767 => 'Sony ARW Compressed', #16
|
205
|
+
32769 => 'Packed RAW', #PH (used by Epson, Nikon, Samsung)
|
206
|
+
32770 => 'Samsung SRW Compressed', #PH
|
207
|
+
32771 => 'CCIRLEW', #3
|
208
|
+
32773 => 'PackBits',
|
209
|
+
32809 => 'Thunderscan', #3
|
210
|
+
32867 => 'Kodak KDC Compressed', #PH
|
211
|
+
32895 => 'IT8CTPAD', #3
|
212
|
+
32896 => 'IT8LW', #3
|
213
|
+
32897 => 'IT8MP', #3
|
214
|
+
32898 => 'IT8BL', #3
|
215
|
+
32908 => 'PixarFilm', #3
|
216
|
+
32909 => 'PixarLog', #3
|
217
|
+
32946 => 'Deflate', #3
|
218
|
+
32947 => 'DCS', #3
|
219
|
+
34661 => 'JBIG', #3
|
220
|
+
34676 => 'SGILog', #3
|
221
|
+
34677 => 'SGILog24', #3
|
222
|
+
34712 => 'JPEG 2000', #3
|
223
|
+
34713 => 'Nikon NEF Compressed', #PH
|
224
|
+
34715 => 'JBIG2 TIFF FX', #20
|
225
|
+
34718 => 'Microsoft Document Imaging (MDI) Binary Level Codec', #18
|
226
|
+
34719 => 'Microsoft Document Imaging (MDI) Progressive Transform Codec', #18
|
227
|
+
34720 => 'Microsoft Document Imaging (MDI) Vector', #18
|
228
|
+
34892 => 'Lossy JPEG', # (DNG 1.4)
|
229
|
+
65000 => 'Kodak DCR Compressed', #PH
|
230
|
+
65535 => 'Pentax PEF Compressed', #Jens
|
231
|
+
);
|
232
|
+
|
233
|
+
%photometricInterpretation = (
|
234
|
+
0 => 'WhiteIsZero',
|
235
|
+
1 => 'BlackIsZero',
|
236
|
+
2 => 'RGB',
|
237
|
+
3 => 'RGB Palette',
|
238
|
+
4 => 'Transparency Mask',
|
239
|
+
5 => 'CMYK',
|
240
|
+
6 => 'YCbCr',
|
241
|
+
8 => 'CIELab',
|
242
|
+
9 => 'ICCLab', #3
|
243
|
+
10 => 'ITULab', #3
|
244
|
+
32803 => 'Color Filter Array', #2
|
245
|
+
32844 => 'Pixar LogL', #3
|
246
|
+
32845 => 'Pixar LogLuv', #3
|
247
|
+
34892 => 'Linear Raw', #2
|
248
|
+
);
|
249
|
+
|
250
|
+
%orientation = (
|
251
|
+
1 => 'Horizontal (normal)',
|
252
|
+
2 => 'Mirror horizontal',
|
253
|
+
3 => 'Rotate 180',
|
254
|
+
4 => 'Mirror vertical',
|
255
|
+
5 => 'Mirror horizontal and rotate 270 CW',
|
256
|
+
6 => 'Rotate 90 CW',
|
257
|
+
7 => 'Mirror horizontal and rotate 90 CW',
|
258
|
+
8 => 'Rotate 270 CW',
|
259
|
+
);
|
260
|
+
|
261
|
+
%subfileType = (
|
262
|
+
0 => 'Full-resolution Image',
|
263
|
+
1 => 'Reduced-resolution image',
|
264
|
+
2 => 'Single page of multi-page image',
|
265
|
+
3 => 'Single page of multi-page reduced-resolution image',
|
266
|
+
4 => 'Transparency mask',
|
267
|
+
5 => 'Transparency mask of reduced-resolution image',
|
268
|
+
6 => 'Transparency mask of multi-page image',
|
269
|
+
7 => 'Transparency mask of reduced-resolution multi-page image',
|
270
|
+
0x10001 => 'Alternate reduced-resolution image', # (DNG 1.2)
|
271
|
+
0xffffffff => 'invalid', #(found in E5700 NEF's)
|
272
|
+
BITMASK => {
|
273
|
+
0 => 'Reduced resolution',
|
274
|
+
1 => 'Single page',
|
275
|
+
2 => 'Transparency mask',
|
276
|
+
3 => 'TIFF/IT final page', #20
|
277
|
+
4 => 'TIFF-FX mixed raster content', #20
|
278
|
+
},
|
279
|
+
);
|
280
|
+
|
281
|
+
# PrintConv for parameter tags
|
282
|
+
%Image::ExifTool::Exif::printParameter = (
|
283
|
+
PrintConv => {
|
284
|
+
0 => 'Normal',
|
285
|
+
OTHER => \&Image::ExifTool::Exif::PrintParameter,
|
286
|
+
},
|
287
|
+
);
|
288
|
+
|
289
|
+
# ValueConv that makes long values binary type
|
290
|
+
my %longBin = (
|
291
|
+
ValueConv => 'length($val) > 64 ? \$val : $val',
|
292
|
+
ValueConvInv => '$val',
|
293
|
+
);
|
294
|
+
|
295
|
+
# PrintConv for SampleFormat (0x153)
|
296
|
+
my %sampleFormat = (
|
297
|
+
1 => 'Unsigned', # unsigned integer
|
298
|
+
2 => 'Signed', # two's complement signed integer
|
299
|
+
3 => 'Float', # IEEE floating point
|
300
|
+
4 => 'Undefined',
|
301
|
+
5 => 'Complex int', # complex integer (ref 3)
|
302
|
+
6 => 'Complex float', # complex IEEE floating point (ref 3)
|
303
|
+
);
|
304
|
+
|
305
|
+
# main EXIF tag table
|
306
|
+
%Image::ExifTool::Exif::Main = (
|
307
|
+
GROUPS => { 0 => 'EXIF', 1 => 'IFD0', 2 => 'Image'},
|
308
|
+
WRITE_PROC => \&WriteExif,
|
309
|
+
WRITE_GROUP => 'ExifIFD', # default write group
|
310
|
+
SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
|
311
|
+
0x1 => {
|
312
|
+
Name => 'InteropIndex',
|
313
|
+
Description => 'Interoperability Index',
|
314
|
+
PrintConv => {
|
315
|
+
R98 => 'R98 - DCF basic file (sRGB)',
|
316
|
+
R03 => 'R03 - DCF option file (Adobe RGB)',
|
317
|
+
THM => 'THM - DCF thumbnail file',
|
318
|
+
},
|
319
|
+
},
|
320
|
+
0x2 => { #5
|
321
|
+
Name => 'InteropVersion',
|
322
|
+
Description => 'Interoperability Version',
|
323
|
+
RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
|
324
|
+
},
|
325
|
+
0x0b => { #PH
|
326
|
+
Name => 'ProcessingSoftware',
|
327
|
+
Notes => 'used by ACD Systems Digital Imaging',
|
328
|
+
},
|
329
|
+
0xfe => {
|
330
|
+
Name => 'SubfileType',
|
331
|
+
# set priority directory if this is the full resolution image
|
332
|
+
DataMember => 'SubfileType',
|
333
|
+
RawConv => '$self->SetPriorityDir() if $val eq "0"; $$self{SubfileType} = $val',
|
334
|
+
PrintConv => \%subfileType,
|
335
|
+
},
|
336
|
+
0xff => {
|
337
|
+
Name => 'OldSubfileType',
|
338
|
+
# set priority directory if this is the full resolution image
|
339
|
+
RawConv => '$self->SetPriorityDir() if $val eq "1"; $val',
|
340
|
+
PrintConv => {
|
341
|
+
1 => 'Full-resolution image',
|
342
|
+
2 => 'Reduced-resolution image',
|
343
|
+
3 => 'Single page of multi-page image',
|
344
|
+
},
|
345
|
+
},
|
346
|
+
0x100 => {
|
347
|
+
Name => 'ImageWidth',
|
348
|
+
# even though Group 1 is set dynamically we need to register IFD1 once
|
349
|
+
# so it will show up in the group lists
|
350
|
+
Groups => { 1 => 'IFD1' },
|
351
|
+
# Note: priority 0 tags automatically have their priority increased for the
|
352
|
+
# priority direcory (the directory with a SubfileType of "Full-resolution image")
|
353
|
+
Priority => 0,
|
354
|
+
},
|
355
|
+
0x101 => {
|
356
|
+
Name => 'ImageHeight',
|
357
|
+
Notes => 'called ImageLength by the EXIF spec.',
|
358
|
+
Priority => 0,
|
359
|
+
},
|
360
|
+
0x102 => {
|
361
|
+
Name => 'BitsPerSample',
|
362
|
+
Priority => 0,
|
363
|
+
},
|
364
|
+
0x103 => {
|
365
|
+
Name => 'Compression',
|
366
|
+
DataMember => 'Compression',
|
367
|
+
SeparateTable => 'Compression',
|
368
|
+
RawConv => q{
|
369
|
+
Image::ExifTool::Exif::IdentifyRawFile($self, $val);
|
370
|
+
return $$self{Compression} = $val;
|
371
|
+
},
|
372
|
+
PrintConv => \%compression,
|
373
|
+
Priority => 0,
|
374
|
+
},
|
375
|
+
0x106 => {
|
376
|
+
Name => 'PhotometricInterpretation',
|
377
|
+
PrintConv => \%photometricInterpretation,
|
378
|
+
Priority => 0,
|
379
|
+
},
|
380
|
+
0x107 => {
|
381
|
+
Name => 'Thresholding',
|
382
|
+
PrintConv => {
|
383
|
+
1 => 'No dithering or halftoning',
|
384
|
+
2 => 'Ordered dither or halftone',
|
385
|
+
3 => 'Randomized dither',
|
386
|
+
},
|
387
|
+
},
|
388
|
+
0x108 => 'CellWidth',
|
389
|
+
0x109 => 'CellLength',
|
390
|
+
0x10a => {
|
391
|
+
Name => 'FillOrder',
|
392
|
+
PrintConv => {
|
393
|
+
1 => 'Normal',
|
394
|
+
2 => 'Reversed',
|
395
|
+
},
|
396
|
+
},
|
397
|
+
0x10d => 'DocumentName',
|
398
|
+
0x10e => {
|
399
|
+
Name => 'ImageDescription',
|
400
|
+
Priority => 0,
|
401
|
+
},
|
402
|
+
0x10f => {
|
403
|
+
Name => 'Make',
|
404
|
+
Groups => { 2 => 'Camera' },
|
405
|
+
DataMember => 'Make',
|
406
|
+
# remove trailing blanks and save as an ExifTool member variable
|
407
|
+
RawConv => '$val =~ s/\s+$//; $$self{Make} = $val',
|
408
|
+
# NOTE: trailing "blanks" (spaces) are removed from all EXIF tags which
|
409
|
+
# may be "unknown" (filled with spaces) according to the EXIF spec.
|
410
|
+
# This allows conditional replacement with "exiftool -TAG-= -TAG=VALUE".
|
411
|
+
# - also removed are any other trailing whitespace characters
|
412
|
+
},
|
413
|
+
0x110 => {
|
414
|
+
Name => 'Model',
|
415
|
+
Description => 'Camera Model Name',
|
416
|
+
Groups => { 2 => 'Camera' },
|
417
|
+
DataMember => 'Model',
|
418
|
+
# remove trailing blanks and save as an ExifTool member variable
|
419
|
+
RawConv => '$val =~ s/\s+$//; $$self{Model} = $val',
|
420
|
+
},
|
421
|
+
0x111 => [
|
422
|
+
{
|
423
|
+
Condition => q[
|
424
|
+
$$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and
|
425
|
+
$$self{Model} =~ /^DiMAGE A200/
|
426
|
+
],
|
427
|
+
Name => 'StripOffsets',
|
428
|
+
IsOffset => 1,
|
429
|
+
OffsetPair => 0x117, # point to associated byte counts
|
430
|
+
# A200 stores this information in the wrong byte order!!
|
431
|
+
ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
|
432
|
+
ByteOrder => 'LittleEndian',
|
433
|
+
},
|
434
|
+
{
|
435
|
+
Condition => q[
|
436
|
+
($$self{TIFF_TYPE} ne 'CR2' or $$self{DIR_NAME} ne 'IFD0') and
|
437
|
+
($$self{TIFF_TYPE} ne 'DNG' or $$self{DIR_NAME} !~ /^SubIFD[12]$/)
|
438
|
+
],
|
439
|
+
Name => 'StripOffsets',
|
440
|
+
IsOffset => 1,
|
441
|
+
OffsetPair => 0x117, # point to associated byte counts
|
442
|
+
ValueConv => 'length($val) > 32 ? \$val : $val',
|
443
|
+
},
|
444
|
+
{
|
445
|
+
Condition => '$$self{DIR_NAME} eq "IFD0"',
|
446
|
+
Name => 'PreviewImageStart',
|
447
|
+
IsOffset => 1,
|
448
|
+
OffsetPair => 0x117,
|
449
|
+
Notes => q{
|
450
|
+
PreviewImageStart in IFD0 of CR2 images and SubIFD1 of DNG images, and
|
451
|
+
JpgFromRawStart in SubIFD2 of DNG images
|
452
|
+
},
|
453
|
+
DataTag => 'PreviewImage',
|
454
|
+
Writable => 'int32u',
|
455
|
+
WriteGroup => 'IFD0',
|
456
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "CR2"',
|
457
|
+
Protected => 2,
|
458
|
+
},
|
459
|
+
{
|
460
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD1"',
|
461
|
+
Name => 'PreviewImageStart',
|
462
|
+
IsOffset => 1,
|
463
|
+
OffsetPair => 0x117,
|
464
|
+
DataTag => 'PreviewImage',
|
465
|
+
Writable => 'int32u',
|
466
|
+
WriteGroup => 'SubIFD1',
|
467
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
|
468
|
+
Protected => 2,
|
469
|
+
},
|
470
|
+
{
|
471
|
+
Name => 'JpgFromRawStart',
|
472
|
+
IsOffset => 1,
|
473
|
+
OffsetPair => 0x117,
|
474
|
+
DataTag => 'JpgFromRaw',
|
475
|
+
Writable => 'int32u',
|
476
|
+
WriteGroup => 'SubIFD2',
|
477
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
|
478
|
+
Protected => 2,
|
479
|
+
},
|
480
|
+
],
|
481
|
+
0x112 => {
|
482
|
+
Name => 'Orientation',
|
483
|
+
PrintConv => \%orientation,
|
484
|
+
Priority => 0, # so PRIORITY_DIR takes precedence
|
485
|
+
},
|
486
|
+
0x115 => {
|
487
|
+
Name => 'SamplesPerPixel',
|
488
|
+
Priority => 0,
|
489
|
+
},
|
490
|
+
0x116 => {
|
491
|
+
Name => 'RowsPerStrip',
|
492
|
+
Priority => 0,
|
493
|
+
},
|
494
|
+
0x117 => [
|
495
|
+
{
|
496
|
+
Condition => q[
|
497
|
+
$$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and
|
498
|
+
$$self{Model} =~ /^DiMAGE A200/
|
499
|
+
],
|
500
|
+
Name => 'StripByteCounts',
|
501
|
+
OffsetPair => 0x111, # point to associated offset
|
502
|
+
# A200 stores this information in the wrong byte order!!
|
503
|
+
ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
|
504
|
+
ByteOrder => 'LittleEndian',
|
505
|
+
},
|
506
|
+
{
|
507
|
+
Condition => q[
|
508
|
+
($$self{TIFF_TYPE} ne 'CR2' or $$self{DIR_NAME} ne 'IFD0') and
|
509
|
+
($$self{TIFF_TYPE} ne 'DNG' or $$self{DIR_NAME} !~ /^SubIFD[12]$/)
|
510
|
+
],
|
511
|
+
Name => 'StripByteCounts',
|
512
|
+
OffsetPair => 0x111, # point to associated offset
|
513
|
+
ValueConv => 'length($val) > 32 ? \$val : $val',
|
514
|
+
},
|
515
|
+
{
|
516
|
+
Condition => '$$self{DIR_NAME} eq "IFD0"',
|
517
|
+
Name => 'PreviewImageLength',
|
518
|
+
OffsetPair => 0x111,
|
519
|
+
Notes => q{
|
520
|
+
PreviewImageLength in IFD0 of CR2 images and SubIFD1 of DNG images, and
|
521
|
+
JpgFromRawLength in SubIFD2 of DNG images
|
522
|
+
},
|
523
|
+
DataTag => 'PreviewImage',
|
524
|
+
Writable => 'int32u',
|
525
|
+
WriteGroup => 'IFD0',
|
526
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "CR2"',
|
527
|
+
Protected => 2,
|
528
|
+
},
|
529
|
+
{
|
530
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD1"',
|
531
|
+
Name => 'PreviewImageLength',
|
532
|
+
OffsetPair => 0x111,
|
533
|
+
DataTag => 'PreviewImage',
|
534
|
+
Writable => 'int32u',
|
535
|
+
WriteGroup => 'SubIFD1',
|
536
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
|
537
|
+
Protected => 2,
|
538
|
+
},
|
539
|
+
{
|
540
|
+
Name => 'JpgFromRawLength',
|
541
|
+
OffsetPair => 0x111,
|
542
|
+
DataTag => 'JpgFromRaw',
|
543
|
+
Writable => 'int32u',
|
544
|
+
WriteGroup => 'SubIFD2',
|
545
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
|
546
|
+
Protected => 2,
|
547
|
+
},
|
548
|
+
],
|
549
|
+
0x118 => 'MinSampleValue',
|
550
|
+
0x119 => 'MaxSampleValue',
|
551
|
+
0x11a => {
|
552
|
+
Name => 'XResolution',
|
553
|
+
Priority => 0, # so PRIORITY_DIR takes precedence
|
554
|
+
},
|
555
|
+
0x11b => {
|
556
|
+
Name => 'YResolution',
|
557
|
+
Priority => 0,
|
558
|
+
},
|
559
|
+
0x11c => {
|
560
|
+
Name => 'PlanarConfiguration',
|
561
|
+
PrintConv => {
|
562
|
+
1 => 'Chunky',
|
563
|
+
2 => 'Planar',
|
564
|
+
},
|
565
|
+
Priority => 0,
|
566
|
+
},
|
567
|
+
0x11d => 'PageName',
|
568
|
+
0x11e => 'XPosition',
|
569
|
+
0x11f => 'YPosition',
|
570
|
+
0x120 => {
|
571
|
+
Name => 'FreeOffsets',
|
572
|
+
IsOffset => 1,
|
573
|
+
OffsetPair => 0x121,
|
574
|
+
ValueConv => 'length($val) > 32 ? \$val : $val',
|
575
|
+
},
|
576
|
+
0x121 => {
|
577
|
+
Name => 'FreeByteCounts',
|
578
|
+
OffsetPair => 0x120,
|
579
|
+
ValueConv => 'length($val) > 32 ? \$val : $val',
|
580
|
+
},
|
581
|
+
0x122 => {
|
582
|
+
Name => 'GrayResponseUnit',
|
583
|
+
PrintConv => { #3
|
584
|
+
1 => 0.1,
|
585
|
+
2 => 0.001,
|
586
|
+
3 => 0.0001,
|
587
|
+
4 => 0.00001,
|
588
|
+
5 => 0.000001,
|
589
|
+
},
|
590
|
+
},
|
591
|
+
0x123 => {
|
592
|
+
Name => 'GrayResponseCurve',
|
593
|
+
Binary => 1,
|
594
|
+
},
|
595
|
+
0x124 => {
|
596
|
+
Name => 'T4Options',
|
597
|
+
PrintConv => { BITMASK => {
|
598
|
+
0 => '2-Dimensional encoding',
|
599
|
+
1 => 'Uncompressed',
|
600
|
+
2 => 'Fill bits added',
|
601
|
+
} }, #3
|
602
|
+
},
|
603
|
+
0x125 => {
|
604
|
+
Name => 'T6Options',
|
605
|
+
PrintConv => { BITMASK => {
|
606
|
+
1 => 'Uncompressed',
|
607
|
+
} }, #3
|
608
|
+
},
|
609
|
+
0x128 => {
|
610
|
+
Name => 'ResolutionUnit',
|
611
|
+
Notes => 'the value 1 is not standard EXIF',
|
612
|
+
PrintConv => {
|
613
|
+
1 => 'None',
|
614
|
+
2 => 'inches',
|
615
|
+
3 => 'cm',
|
616
|
+
},
|
617
|
+
Priority => 0,
|
618
|
+
},
|
619
|
+
0x129 => 'PageNumber',
|
620
|
+
0x12c => 'ColorResponseUnit', #9
|
621
|
+
0x12d => {
|
622
|
+
Name => 'TransferFunction',
|
623
|
+
Binary => 1,
|
624
|
+
},
|
625
|
+
0x131 => {
|
626
|
+
Name => 'Software',
|
627
|
+
RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
|
628
|
+
},
|
629
|
+
0x132 => {
|
630
|
+
Name => 'ModifyDate',
|
631
|
+
Groups => { 2 => 'Time' },
|
632
|
+
Notes => 'called DateTime by the EXIF spec.',
|
633
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
634
|
+
},
|
635
|
+
0x13b => {
|
636
|
+
Name => 'Artist',
|
637
|
+
Groups => { 2 => 'Author' },
|
638
|
+
Notes => 'becomes a list-type tag when the MWG module is loaded',
|
639
|
+
RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
|
640
|
+
},
|
641
|
+
0x13c => 'HostComputer',
|
642
|
+
0x13d => {
|
643
|
+
Name => 'Predictor',
|
644
|
+
PrintConv => {
|
645
|
+
1 => 'None',
|
646
|
+
2 => 'Horizontal differencing',
|
647
|
+
},
|
648
|
+
},
|
649
|
+
0x13e => {
|
650
|
+
Name => 'WhitePoint',
|
651
|
+
Groups => { 2 => 'Camera' },
|
652
|
+
},
|
653
|
+
0x13f => {
|
654
|
+
Name => 'PrimaryChromaticities',
|
655
|
+
Priority => 0,
|
656
|
+
},
|
657
|
+
0x140 => {
|
658
|
+
Name => 'ColorMap',
|
659
|
+
Format => 'binary',
|
660
|
+
Binary => 1,
|
661
|
+
},
|
662
|
+
0x141 => 'HalftoneHints',
|
663
|
+
0x142 => 'TileWidth',
|
664
|
+
0x143 => 'TileLength',
|
665
|
+
0x144 => {
|
666
|
+
Name => 'TileOffsets',
|
667
|
+
IsOffset => 1,
|
668
|
+
OffsetPair => 0x145,
|
669
|
+
ValueConv => 'length($val) > 32 ? \$val : $val',
|
670
|
+
},
|
671
|
+
0x145 => {
|
672
|
+
Name => 'TileByteCounts',
|
673
|
+
OffsetPair => 0x144,
|
674
|
+
ValueConv => 'length($val) > 32 ? \$val : $val',
|
675
|
+
},
|
676
|
+
0x146 => 'BadFaxLines', #3
|
677
|
+
0x147 => { #3
|
678
|
+
Name => 'CleanFaxData',
|
679
|
+
PrintConv => {
|
680
|
+
0 => 'Clean',
|
681
|
+
1 => 'Regenerated',
|
682
|
+
2 => 'Unclean',
|
683
|
+
},
|
684
|
+
},
|
685
|
+
0x148 => 'ConsecutiveBadFaxLines', #3
|
686
|
+
0x14a => [
|
687
|
+
{
|
688
|
+
Name => 'SubIFD',
|
689
|
+
# use this opportunity to identify an ARW image, and if so we
|
690
|
+
# must decide if this is a SubIFD or the A100 raw data
|
691
|
+
# (use SubfileType, Compression and FILE_TYPE to identify ARW/SR2,
|
692
|
+
# then call SetARW to finish the job)
|
693
|
+
Condition => q{
|
694
|
+
$$self{DIR_NAME} ne 'IFD0' or $$self{FILE_TYPE} ne 'TIFF' or
|
695
|
+
$$self{Make} !~ /^SONY/ or
|
696
|
+
not $$self{SubfileType} or $$self{SubfileType} != 1 or
|
697
|
+
not $$self{Compression} or $$self{Compression} != 6 or
|
698
|
+
not require Image::ExifTool::Sony or
|
699
|
+
Image::ExifTool::Sony::SetARW($self, $valPt)
|
700
|
+
},
|
701
|
+
Groups => { 1 => 'SubIFD' },
|
702
|
+
Flags => 'SubIFD',
|
703
|
+
SubDirectory => {
|
704
|
+
Start => '$val',
|
705
|
+
MaxSubdirs => 10, # (have seen 5 in a DNG 1.4 image)
|
706
|
+
},
|
707
|
+
},
|
708
|
+
{ #16
|
709
|
+
Name => 'A100DataOffset',
|
710
|
+
Notes => 'the data offset in original Sony DSLR-A100 ARW images',
|
711
|
+
DataMember => 'A100DataOffset',
|
712
|
+
RawConv => '$$self{A100DataOffset} = $val',
|
713
|
+
IsOffset => 1,
|
714
|
+
Protected => 2,
|
715
|
+
},
|
716
|
+
],
|
717
|
+
0x14c => {
|
718
|
+
Name => 'InkSet',
|
719
|
+
PrintConv => { #3
|
720
|
+
1 => 'CMYK',
|
721
|
+
2 => 'Not CMYK',
|
722
|
+
},
|
723
|
+
},
|
724
|
+
0x14d => 'InkNames', #3
|
725
|
+
0x14e => 'NumberofInks', #3
|
726
|
+
0x150 => 'DotRange',
|
727
|
+
0x151 => 'TargetPrinter',
|
728
|
+
0x152 => {
|
729
|
+
Name => 'ExtraSamples',
|
730
|
+
PrintConv => { #20
|
731
|
+
0 => 'Unspecified',
|
732
|
+
1 => 'Associated Alpha',
|
733
|
+
2 => 'Unassociated Alpha',
|
734
|
+
},
|
735
|
+
},
|
736
|
+
0x153 => {
|
737
|
+
Name => 'SampleFormat',
|
738
|
+
Notes => 'SamplesPerPixel values',
|
739
|
+
PrintConvColumns => 2,
|
740
|
+
PrintConv => [ \%sampleFormat, \%sampleFormat, \%sampleFormat, \%sampleFormat ],
|
741
|
+
},
|
742
|
+
0x154 => 'SMinSampleValue',
|
743
|
+
0x155 => 'SMaxSampleValue',
|
744
|
+
0x156 => 'TransferRange',
|
745
|
+
0x157 => 'ClipPath', #3
|
746
|
+
0x158 => 'XClipPathUnits', #3
|
747
|
+
0x159 => 'YClipPathUnits', #3
|
748
|
+
0x15a => { #3
|
749
|
+
Name => 'Indexed',
|
750
|
+
PrintConv => { 0 => 'Not indexed', 1 => 'Indexed' },
|
751
|
+
},
|
752
|
+
0x15b => {
|
753
|
+
Name => 'JPEGTables',
|
754
|
+
Binary => 1,
|
755
|
+
},
|
756
|
+
0x15f => { #10
|
757
|
+
Name => 'OPIProxy',
|
758
|
+
PrintConv => {
|
759
|
+
0 => 'Higher resolution image does not exist',
|
760
|
+
1 => 'Higher resolution image exists',
|
761
|
+
},
|
762
|
+
},
|
763
|
+
# 0x181 => 'Decode', #20 (typo! - should be 0x1b1, ref 21)
|
764
|
+
# 0x182 => 'DefaultImageColor', #20 (typo! - should be 0x1b2, ref 21)
|
765
|
+
0x190 => { #3
|
766
|
+
Name => 'GlobalParametersIFD',
|
767
|
+
Groups => { 1 => 'GlobParamIFD' },
|
768
|
+
Flags => 'SubIFD',
|
769
|
+
SubDirectory => {
|
770
|
+
DirName => 'GlobParamIFD',
|
771
|
+
Start => '$val',
|
772
|
+
MaxSubdirs => 1,
|
773
|
+
},
|
774
|
+
},
|
775
|
+
0x191 => { #3
|
776
|
+
Name => 'ProfileType',
|
777
|
+
PrintConv => { 0 => 'Unspecified', 1 => 'Group 3 FAX' },
|
778
|
+
},
|
779
|
+
0x192 => { #3
|
780
|
+
Name => 'FaxProfile',
|
781
|
+
PrintConv => {
|
782
|
+
0 => 'Unknown',
|
783
|
+
1 => 'Minimal B&W lossless, S',
|
784
|
+
2 => 'Extended B&W lossless, F',
|
785
|
+
3 => 'Lossless JBIG B&W, J',
|
786
|
+
4 => 'Lossy color and grayscale, C',
|
787
|
+
5 => 'Lossless color and grayscale, L',
|
788
|
+
6 => 'Mixed raster content, M',
|
789
|
+
7 => 'Profile T', #20
|
790
|
+
255 => 'Multi Profiles', #20
|
791
|
+
},
|
792
|
+
},
|
793
|
+
0x193 => { #3
|
794
|
+
Name => 'CodingMethods',
|
795
|
+
PrintConv => { BITMASK => {
|
796
|
+
0 => 'Unspecified compression',
|
797
|
+
1 => 'Modified Huffman',
|
798
|
+
2 => 'Modified Read',
|
799
|
+
3 => 'Modified MR',
|
800
|
+
4 => 'JBIG',
|
801
|
+
5 => 'Baseline JPEG',
|
802
|
+
6 => 'JBIG color',
|
803
|
+
} },
|
804
|
+
},
|
805
|
+
0x194 => 'VersionYear', #3
|
806
|
+
0x195 => 'ModeNumber', #3
|
807
|
+
0x1b1 => 'Decode', #3
|
808
|
+
0x1b2 => 'DefaultImageColor', #3 (changed to ImageBaseColor, ref 21)
|
809
|
+
0x1b3 => 'T82Options', #20
|
810
|
+
0x1b5 => { #19
|
811
|
+
Name => 'JPEGTables',
|
812
|
+
Binary => 1,
|
813
|
+
},
|
814
|
+
0x200 => {
|
815
|
+
Name => 'JPEGProc',
|
816
|
+
PrintConv => {
|
817
|
+
1 => 'Baseline',
|
818
|
+
14 => 'Lossless',
|
819
|
+
},
|
820
|
+
},
|
821
|
+
0x201 => [
|
822
|
+
{
|
823
|
+
Name => 'ThumbnailOffset',
|
824
|
+
Notes => q{
|
825
|
+
ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
|
826
|
+
images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
|
827
|
+
PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images;
|
828
|
+
JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and
|
829
|
+
OtherImageStart in everything else
|
830
|
+
},
|
831
|
+
# thumbnail is found in IFD1 of JPEG and TIFF images, and
|
832
|
+
# IFD0 of EXIF information in FujiFilm AVI (RIFF) and MOV videos
|
833
|
+
Condition => q{
|
834
|
+
$$self{DIR_NAME} eq 'IFD1' or
|
835
|
+
($$self{DIR_NAME} eq 'IFD0' and $$self{FILE_TYPE} =~ /^(RIFF|MOV)$/)
|
836
|
+
},
|
837
|
+
IsOffset => 1,
|
838
|
+
OffsetPair => 0x202,
|
839
|
+
DataTag => 'ThumbnailImage',
|
840
|
+
Writable => 'int32u',
|
841
|
+
WriteGroup => 'IFD1',
|
842
|
+
# according to the EXIF spec. a JPEG-compressed thumbnail image may not
|
843
|
+
# be stored in a TIFF file, but these TIFF-based RAW image formats
|
844
|
+
# use IFD1 for a JPEG-compressed thumbnail: CR2, ARW, SR2 and PEF.
|
845
|
+
# (SRF also stores a JPEG image in IFD1, but it is actually a preview
|
846
|
+
# and we don't yet write SRF anyway)
|
847
|
+
WriteCondition => q{
|
848
|
+
$$self{FILE_TYPE} ne "TIFF" or
|
849
|
+
$$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/
|
850
|
+
},
|
851
|
+
Protected => 2,
|
852
|
+
},
|
853
|
+
{
|
854
|
+
Name => 'ThumbnailOffset',
|
855
|
+
# thumbnail in IFD0 of MRW images (Minolta A200)
|
856
|
+
# and IFD0 of NRW images (Nikon Coolpix P6000,P7000,P7100)
|
857
|
+
Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(MRW|NRW)$/',
|
858
|
+
IsOffset => 1,
|
859
|
+
OffsetPair => 0x202,
|
860
|
+
# A200 uses the wrong base offset for this pointer!!
|
861
|
+
WrongBase => '$$self{Model} =~ /^DiMAGE A200/ ? $$self{MRW_WrongBase} : undef',
|
862
|
+
DataTag => 'ThumbnailImage',
|
863
|
+
Writable => 'int32u',
|
864
|
+
WriteGroup => 'IFD0',
|
865
|
+
WriteCondition => '$$self{FILE_TYPE} =~ /^(MRW|NRW)$/',
|
866
|
+
Protected => 2,
|
867
|
+
},
|
868
|
+
{
|
869
|
+
Name => 'ThumbnailOffset',
|
870
|
+
# in SubIFD of IFD1 in Samsung SRW images
|
871
|
+
Condition => q{
|
872
|
+
$$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and
|
873
|
+
$$self{PATH}[-2] eq 'IFD1'
|
874
|
+
},
|
875
|
+
IsOffset => 1,
|
876
|
+
OffsetPair => 0x202,
|
877
|
+
DataTag => 'ThumbnailImage',
|
878
|
+
Writable => 'int32u',
|
879
|
+
WriteGroup => 'SubIFD',
|
880
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "SRW"',
|
881
|
+
Protected => 2,
|
882
|
+
},
|
883
|
+
{
|
884
|
+
Name => 'PreviewImageStart',
|
885
|
+
Condition => '$$self{DIR_NAME} eq "MakerNotes"',
|
886
|
+
IsOffset => 1,
|
887
|
+
OffsetPair => 0x202,
|
888
|
+
DataTag => 'PreviewImage',
|
889
|
+
Writable => 'int32u',
|
890
|
+
WriteGroup => 'MakerNotes',
|
891
|
+
# (no WriteCondition necessary because MakerNotes won't be created)
|
892
|
+
Protected => 2,
|
893
|
+
},
|
894
|
+
{
|
895
|
+
Name => 'PreviewImageStart',
|
896
|
+
# PreviewImage in IFD0 of ARW and SR2 files for all models
|
897
|
+
Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
|
898
|
+
IsOffset => 1,
|
899
|
+
OffsetPair => 0x202,
|
900
|
+
DataTag => 'PreviewImage',
|
901
|
+
Writable => 'int32u',
|
902
|
+
WriteGroup => 'IFD0',
|
903
|
+
WriteCondition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
|
904
|
+
Protected => 2,
|
905
|
+
},
|
906
|
+
{
|
907
|
+
Name => 'JpgFromRawStart',
|
908
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD"',
|
909
|
+
IsOffset => 1,
|
910
|
+
OffsetPair => 0x202,
|
911
|
+
DataTag => 'JpgFromRaw',
|
912
|
+
Writable => 'int32u',
|
913
|
+
WriteGroup => 'SubIFD',
|
914
|
+
# JpgFromRaw is in SubIFD of NEF, NRW and SRW files
|
915
|
+
WriteCondition => '$$self{TIFF_TYPE} =~ /^(NEF|NRW|SRW)$/',
|
916
|
+
Protected => 2,
|
917
|
+
},
|
918
|
+
{
|
919
|
+
Name => 'JpgFromRawStart',
|
920
|
+
Condition => '$$self{DIR_NAME} eq "IFD2"',
|
921
|
+
IsOffset => 1,
|
922
|
+
OffsetPair => 0x202,
|
923
|
+
DataTag => 'JpgFromRaw',
|
924
|
+
Writable => 'int32u',
|
925
|
+
WriteGroup => 'IFD2',
|
926
|
+
# JpgFromRaw is in IFD2 of PEF files
|
927
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "PEF"',
|
928
|
+
Protected => 2,
|
929
|
+
},
|
930
|
+
{
|
931
|
+
Name => 'OtherImageStart',
|
932
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD1"',
|
933
|
+
IsOffset => 1,
|
934
|
+
OffsetPair => 0x202,
|
935
|
+
DataTag => 'OtherImage',
|
936
|
+
Writable => 'int32u',
|
937
|
+
WriteGroup => 'SubIFD1',
|
938
|
+
Protected => 2,
|
939
|
+
Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
|
940
|
+
},
|
941
|
+
{
|
942
|
+
Name => 'OtherImageStart',
|
943
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD2"',
|
944
|
+
IsOffset => 1,
|
945
|
+
OffsetPair => 0x202,
|
946
|
+
DataTag => 'OtherImage',
|
947
|
+
Writable => 'int32u',
|
948
|
+
WriteGroup => 'SubIFD2',
|
949
|
+
Protected => 2,
|
950
|
+
Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
|
951
|
+
},
|
952
|
+
{
|
953
|
+
Name => 'OtherImageStart',
|
954
|
+
IsOffset => 1,
|
955
|
+
OffsetPair => 0x202,
|
956
|
+
},
|
957
|
+
],
|
958
|
+
0x202 => [
|
959
|
+
{
|
960
|
+
Name => 'ThumbnailLength',
|
961
|
+
Notes => q{
|
962
|
+
ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
|
963
|
+
images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
|
964
|
+
PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images;
|
965
|
+
JpgFromRawLength in SubIFD of NEF images, and IFD2 of PEF images; and
|
966
|
+
OtherImageLength in everything else
|
967
|
+
},
|
968
|
+
Condition => q{
|
969
|
+
$$self{DIR_NAME} eq 'IFD1' or
|
970
|
+
($$self{DIR_NAME} eq 'IFD0' and $$self{FILE_TYPE} =~ /^(RIFF|MOV)$/)
|
971
|
+
},
|
972
|
+
OffsetPair => 0x201,
|
973
|
+
DataTag => 'ThumbnailImage',
|
974
|
+
Writable => 'int32u',
|
975
|
+
WriteGroup => 'IFD1',
|
976
|
+
WriteCondition => q{
|
977
|
+
$$self{FILE_TYPE} ne "TIFF" or
|
978
|
+
$$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/
|
979
|
+
},
|
980
|
+
Protected => 2,
|
981
|
+
},
|
982
|
+
{
|
983
|
+
Name => 'ThumbnailLength',
|
984
|
+
# thumbnail in IFD0 of MRW images (Minolta A200)
|
985
|
+
# and IFD0 of NRW images (Nikon Coolpix P6000,P7000,P7100)
|
986
|
+
Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(MRW|NRW)$/',
|
987
|
+
OffsetPair => 0x201,
|
988
|
+
DataTag => 'ThumbnailImage',
|
989
|
+
Writable => 'int32u',
|
990
|
+
WriteGroup => 'IFD0',
|
991
|
+
WriteCondition => '$$self{FILE_TYPE} =~ /^(MRW|NRW)$/',
|
992
|
+
Protected => 2,
|
993
|
+
},
|
994
|
+
{
|
995
|
+
Name => 'ThumbnailLength',
|
996
|
+
# in SubIFD of IFD1 in Samsung SRW images
|
997
|
+
Condition => q{
|
998
|
+
$$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and
|
999
|
+
$$self{PATH}[-2] eq 'IFD1'
|
1000
|
+
},
|
1001
|
+
OffsetPair => 0x201,
|
1002
|
+
DataTag => 'ThumbnailImage',
|
1003
|
+
Writable => 'int32u',
|
1004
|
+
WriteGroup => 'SubIFD',
|
1005
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "SRW"',
|
1006
|
+
Protected => 2,
|
1007
|
+
},
|
1008
|
+
{
|
1009
|
+
Name => 'PreviewImageLength',
|
1010
|
+
Condition => '$$self{DIR_NAME} eq "MakerNotes"',
|
1011
|
+
OffsetPair => 0x201,
|
1012
|
+
DataTag => 'PreviewImage',
|
1013
|
+
Writable => 'int32u',
|
1014
|
+
WriteGroup => 'MakerNotes',
|
1015
|
+
# (no WriteCondition necessary because MakerNotes won't be created)
|
1016
|
+
Protected => 2,
|
1017
|
+
},
|
1018
|
+
{
|
1019
|
+
Name => 'PreviewImageLength',
|
1020
|
+
# PreviewImage in IFD0 of ARW and SR2 files for all models
|
1021
|
+
Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
|
1022
|
+
OffsetPair => 0x201,
|
1023
|
+
DataTag => 'PreviewImage',
|
1024
|
+
Writable => 'int32u',
|
1025
|
+
WriteGroup => 'IFD0',
|
1026
|
+
WriteCondition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
|
1027
|
+
Protected => 2,
|
1028
|
+
},
|
1029
|
+
{
|
1030
|
+
Name => 'JpgFromRawLength',
|
1031
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD"',
|
1032
|
+
OffsetPair => 0x201,
|
1033
|
+
DataTag => 'JpgFromRaw',
|
1034
|
+
Writable => 'int32u',
|
1035
|
+
WriteGroup => 'SubIFD',
|
1036
|
+
WriteCondition => '$$self{TIFF_TYPE} =~ /^(NEF|NRW|SRW)$/',
|
1037
|
+
Protected => 2,
|
1038
|
+
},
|
1039
|
+
{
|
1040
|
+
Name => 'JpgFromRawLength',
|
1041
|
+
Condition => '$$self{DIR_NAME} eq "IFD2"',
|
1042
|
+
OffsetPair => 0x201,
|
1043
|
+
DataTag => 'JpgFromRaw',
|
1044
|
+
Writable => 'int32u',
|
1045
|
+
WriteGroup => 'IFD2',
|
1046
|
+
WriteCondition => '$$self{TIFF_TYPE} eq "PEF"',
|
1047
|
+
Protected => 2,
|
1048
|
+
},
|
1049
|
+
{
|
1050
|
+
Name => 'OtherImageLength',
|
1051
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD1"',
|
1052
|
+
OffsetPair => 0x201,
|
1053
|
+
DataTag => 'OtherImage',
|
1054
|
+
Writable => 'int32u',
|
1055
|
+
WriteGroup => 'SubIFD1',
|
1056
|
+
Protected => 2,
|
1057
|
+
Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
|
1058
|
+
},
|
1059
|
+
{
|
1060
|
+
Name => 'OtherImageLength',
|
1061
|
+
Condition => '$$self{DIR_NAME} eq "SubIFD2"',
|
1062
|
+
OffsetPair => 0x201,
|
1063
|
+
DataTag => 'OtherImage',
|
1064
|
+
Writable => 'int32u',
|
1065
|
+
WriteGroup => 'SubIFD2',
|
1066
|
+
Protected => 2,
|
1067
|
+
Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
|
1068
|
+
},
|
1069
|
+
{
|
1070
|
+
Name => 'OtherImageLength',
|
1071
|
+
OffsetPair => 0x201,
|
1072
|
+
},
|
1073
|
+
],
|
1074
|
+
0x203 => 'JPEGRestartInterval',
|
1075
|
+
0x205 => 'JPEGLosslessPredictors',
|
1076
|
+
0x206 => 'JPEGPointTransforms',
|
1077
|
+
0x207 => {
|
1078
|
+
Name => 'JPEGQTables',
|
1079
|
+
IsOffset => 1,
|
1080
|
+
# this tag is not supported for writing, so define an
|
1081
|
+
# invalid offset pair to cause a "No size tag" error to be
|
1082
|
+
# generated if we try to write a file containing this tag
|
1083
|
+
OffsetPair => -1,
|
1084
|
+
},
|
1085
|
+
0x208 => {
|
1086
|
+
Name => 'JPEGDCTables',
|
1087
|
+
IsOffset => 1,
|
1088
|
+
OffsetPair => -1, # (see comment for JPEGQTables)
|
1089
|
+
},
|
1090
|
+
0x209 => {
|
1091
|
+
Name => 'JPEGACTables',
|
1092
|
+
IsOffset => 1,
|
1093
|
+
OffsetPair => -1, # (see comment for JPEGQTables)
|
1094
|
+
},
|
1095
|
+
0x211 => {
|
1096
|
+
Name => 'YCbCrCoefficients',
|
1097
|
+
Priority => 0,
|
1098
|
+
},
|
1099
|
+
0x212 => {
|
1100
|
+
Name => 'YCbCrSubSampling',
|
1101
|
+
PrintConvColumns => 2,
|
1102
|
+
PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling,
|
1103
|
+
Priority => 0,
|
1104
|
+
},
|
1105
|
+
0x213 => {
|
1106
|
+
Name => 'YCbCrPositioning',
|
1107
|
+
PrintConv => {
|
1108
|
+
1 => 'Centered',
|
1109
|
+
2 => 'Co-sited',
|
1110
|
+
},
|
1111
|
+
Priority => 0,
|
1112
|
+
},
|
1113
|
+
0x214 => {
|
1114
|
+
Name => 'ReferenceBlackWhite',
|
1115
|
+
Priority => 0,
|
1116
|
+
},
|
1117
|
+
0x22f => 'StripRowCounts',
|
1118
|
+
0x2bc => {
|
1119
|
+
Name => 'ApplicationNotes', # (writable directory!)
|
1120
|
+
Writable => 'int8u',
|
1121
|
+
Format => 'undef',
|
1122
|
+
Flags => [ 'Binary', 'Protected' ],
|
1123
|
+
# this could be an XMP block
|
1124
|
+
SubDirectory => {
|
1125
|
+
DirName => 'XMP',
|
1126
|
+
TagTable => 'Image::ExifTool::XMP::Main',
|
1127
|
+
},
|
1128
|
+
},
|
1129
|
+
0x3e7 => 'USPTOMiscellaneous', #20
|
1130
|
+
0x1000 => 'RelatedImageFileFormat', #5
|
1131
|
+
0x1001 => 'RelatedImageWidth', #5
|
1132
|
+
0x1002 => { #5
|
1133
|
+
Name => 'RelatedImageHeight',
|
1134
|
+
Notes => 'called RelatedImageLength by the DCF spec.',
|
1135
|
+
},
|
1136
|
+
# (0x474x tags written by MicrosoftPhoto)
|
1137
|
+
0x4746 => 'Rating', #PH
|
1138
|
+
0x4747 => { # (written by Digital Image Pro)
|
1139
|
+
Name => 'XP_DIP_XML',
|
1140
|
+
Format => 'undef',
|
1141
|
+
# the following reference indicates this is Unicode:
|
1142
|
+
# http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/ce6edcbb-8fc2-40c6-ad98-85f5d835ddfb
|
1143
|
+
ValueConv => '$self->Decode($val,"UCS2","II")',
|
1144
|
+
},
|
1145
|
+
0x4748 => {
|
1146
|
+
Name => 'StitchInfo',
|
1147
|
+
SubDirectory => {
|
1148
|
+
TagTable => 'Image::ExifTool::Microsoft::Stitch',
|
1149
|
+
ByteOrder => 'LittleEndian', #PH (NC)
|
1150
|
+
},
|
1151
|
+
},
|
1152
|
+
0x4749 => 'RatingPercent', #PH
|
1153
|
+
0x800d => 'ImageID', #10
|
1154
|
+
0x80a3 => { Name => 'WangTag1', Binary => 1 }, #20
|
1155
|
+
0x80a4 => { Name => 'WangAnnotation', Binary => 1 },
|
1156
|
+
0x80a5 => { Name => 'WangTag3', Binary => 1 }, #20
|
1157
|
+
0x80a6 => { #20
|
1158
|
+
Name => 'WangTag4',
|
1159
|
+
PrintConv => 'length($val) <= 64 ? $val : \$val',
|
1160
|
+
},
|
1161
|
+
0x80e3 => 'Matteing', #9
|
1162
|
+
0x80e4 => 'DataType', #9
|
1163
|
+
0x80e5 => 'ImageDepth', #9
|
1164
|
+
0x80e6 => 'TileDepth', #9
|
1165
|
+
0x827d => 'Model2',
|
1166
|
+
0x828d => 'CFARepeatPatternDim', #12
|
1167
|
+
0x828e => {
|
1168
|
+
Name => 'CFAPattern2', #12
|
1169
|
+
Format => 'int8u', # (written incorrectly as 'undef' in Nikon NRW images)
|
1170
|
+
},
|
1171
|
+
0x828f => { #12
|
1172
|
+
Name => 'BatteryLevel',
|
1173
|
+
Groups => { 2 => 'Camera' },
|
1174
|
+
},
|
1175
|
+
0x8290 => {
|
1176
|
+
Name => 'KodakIFD',
|
1177
|
+
Groups => { 1 => 'KodakIFD' },
|
1178
|
+
Flags => 'SubIFD',
|
1179
|
+
Notes => 'used in various types of Kodak images',
|
1180
|
+
SubDirectory => {
|
1181
|
+
TagTable => 'Image::ExifTool::Kodak::IFD',
|
1182
|
+
DirName => 'KodakIFD',
|
1183
|
+
Start => '$val',
|
1184
|
+
MaxSubdirs => 1,
|
1185
|
+
},
|
1186
|
+
},
|
1187
|
+
0x8298 => {
|
1188
|
+
Name => 'Copyright',
|
1189
|
+
Groups => { 2 => 'Author' },
|
1190
|
+
Format => 'undef',
|
1191
|
+
Notes => q{
|
1192
|
+
may contain copyright notices for photographer and editor, separated by a
|
1193
|
+
newline in ExifTool
|
1194
|
+
},
|
1195
|
+
# internally the strings are separated by a null character in this format:
|
1196
|
+
# Photographer only: photographer + NULL
|
1197
|
+
# Both: photographer + NULL + editor + NULL
|
1198
|
+
# Editor only: SPACE + NULL + editor + NULL
|
1199
|
+
# (this is done as a RawConv so conditional replaces will work properly)
|
1200
|
+
RawConv => sub {
|
1201
|
+
my ($val, $self) = @_;
|
1202
|
+
$val =~ s/ *\0/\n/; # translate first NULL to a newline, removing trailing blanks
|
1203
|
+
$val =~ s/ *\0.*//s; # truncate at second NULL and remove trailing blanks
|
1204
|
+
$val =~ s/\n$//; # remove trailing newline if it exists
|
1205
|
+
# decode if necessary (note: this is the only non-'string' EXIF value like this)
|
1206
|
+
my $enc = $self->Options('CharsetEXIF');
|
1207
|
+
$val = $self->Decode($val,$enc) if $enc;
|
1208
|
+
return $val;
|
1209
|
+
},
|
1210
|
+
},
|
1211
|
+
0x829a => {
|
1212
|
+
Name => 'ExposureTime',
|
1213
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
1214
|
+
},
|
1215
|
+
0x829d => {
|
1216
|
+
Name => 'FNumber',
|
1217
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
1218
|
+
},
|
1219
|
+
0x82a5 => { #3
|
1220
|
+
Name => 'MDFileTag',
|
1221
|
+
Notes => 'tags 0x82a5-0x82ac are used in Molecular Dynamics GEL files',
|
1222
|
+
},
|
1223
|
+
0x82a6 => 'MDScalePixel', #3
|
1224
|
+
0x82a7 => 'MDColorTable', #3
|
1225
|
+
0x82a8 => 'MDLabName', #3
|
1226
|
+
0x82a9 => 'MDSampleInfo', #3
|
1227
|
+
0x82aa => 'MDPrepDate', #3
|
1228
|
+
0x82ab => 'MDPrepTime', #3
|
1229
|
+
0x82ac => 'MDFileUnits', #3
|
1230
|
+
0x830e => 'PixelScale',
|
1231
|
+
0x8335 => 'AdventScale', #20
|
1232
|
+
0x8336 => 'AdventRevision', #20
|
1233
|
+
0x835c => 'UIC1Tag', #23
|
1234
|
+
0x835d => 'UIC2Tag', #23
|
1235
|
+
0x835e => 'UIC3Tag', #23
|
1236
|
+
0x835f => 'UIC4Tag', #23
|
1237
|
+
0x83bb => { #12
|
1238
|
+
Name => 'IPTC-NAA', # (writable directory! -- but see note below)
|
1239
|
+
# this should actually be written as 'undef' (see
|
1240
|
+
# http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html),
|
1241
|
+
# but Photoshop writes it as int32u and Nikon Capture won't read
|
1242
|
+
# anything else, so we do the same thing here... Doh!
|
1243
|
+
Format => 'undef', # convert binary values as undef
|
1244
|
+
Writable => 'int32u', # but write int32u format code in IFD
|
1245
|
+
WriteGroup => 'IFD0',
|
1246
|
+
Flags => [ 'Binary', 'Protected' ],
|
1247
|
+
SubDirectory => {
|
1248
|
+
DirName => 'IPTC',
|
1249
|
+
TagTable => 'Image::ExifTool::IPTC::Main',
|
1250
|
+
},
|
1251
|
+
# Note: This directory may be written as a block via the IPTC-NAA tag,
|
1252
|
+
# but this technique is not recommended. Instead, it is better to
|
1253
|
+
# write the Extra IPTC tag and let ExifTool decide where it should go.
|
1254
|
+
},
|
1255
|
+
0x847e => 'IntergraphPacketData', #3
|
1256
|
+
0x847f => 'IntergraphFlagRegisters', #3
|
1257
|
+
0x8480 => 'IntergraphMatrix',
|
1258
|
+
0x8481 => 'INGRReserved', #20
|
1259
|
+
0x8482 => {
|
1260
|
+
Name => 'ModelTiePoint',
|
1261
|
+
Groups => { 2 => 'Location' },
|
1262
|
+
},
|
1263
|
+
0x84e0 => 'Site', #9
|
1264
|
+
0x84e1 => 'ColorSequence', #9
|
1265
|
+
0x84e2 => 'IT8Header', #9
|
1266
|
+
0x84e3 => { #9
|
1267
|
+
Name => 'RasterPadding',
|
1268
|
+
PrintConv => { #20
|
1269
|
+
0 => 'Byte',
|
1270
|
+
1 => 'Word',
|
1271
|
+
2 => 'Long Word',
|
1272
|
+
9 => 'Sector',
|
1273
|
+
10 => 'Long Sector',
|
1274
|
+
},
|
1275
|
+
},
|
1276
|
+
0x84e4 => 'BitsPerRunLength', #9
|
1277
|
+
0x84e5 => 'BitsPerExtendedRunLength', #9
|
1278
|
+
0x84e6 => 'ColorTable', #9
|
1279
|
+
0x84e7 => { #9
|
1280
|
+
Name => 'ImageColorIndicator',
|
1281
|
+
PrintConv => { #20
|
1282
|
+
0 => 'Unspecified Image Color',
|
1283
|
+
1 => 'Specified Image Color',
|
1284
|
+
},
|
1285
|
+
},
|
1286
|
+
0x84e8 => { #9
|
1287
|
+
Name => 'BackgroundColorIndicator',
|
1288
|
+
PrintConv => { #20
|
1289
|
+
0 => 'Unspecified Background Color',
|
1290
|
+
1 => 'Specified Background Color',
|
1291
|
+
},
|
1292
|
+
},
|
1293
|
+
0x84e9 => 'ImageColorValue', #9
|
1294
|
+
0x84ea => 'BackgroundColorValue', #9
|
1295
|
+
0x84eb => 'PixelIntensityRange', #9
|
1296
|
+
0x84ec => 'TransparencyIndicator', #9
|
1297
|
+
0x84ed => 'ColorCharacterization', #9
|
1298
|
+
0x84ee => { #9
|
1299
|
+
Name => 'HCUsage',
|
1300
|
+
PrintConv => { #20
|
1301
|
+
0 => 'CT',
|
1302
|
+
1 => 'Line Art',
|
1303
|
+
2 => 'Trap',
|
1304
|
+
},
|
1305
|
+
},
|
1306
|
+
0x84ef => 'TrapIndicator', #17
|
1307
|
+
0x84f0 => 'CMYKEquivalent', #17
|
1308
|
+
0x8546 => { #11
|
1309
|
+
Name => 'SEMInfo',
|
1310
|
+
Notes => 'found in some scanning electron microscope images',
|
1311
|
+
},
|
1312
|
+
0x8568 => {
|
1313
|
+
Name => 'AFCP_IPTC',
|
1314
|
+
SubDirectory => {
|
1315
|
+
# must change directory name so we don't create this directory
|
1316
|
+
DirName => 'AFCP_IPTC',
|
1317
|
+
TagTable => 'Image::ExifTool::IPTC::Main',
|
1318
|
+
},
|
1319
|
+
},
|
1320
|
+
0x85b8 => 'PixelMagicJBIGOptions', #20
|
1321
|
+
0x85d8 => {
|
1322
|
+
Name => 'ModelTransform',
|
1323
|
+
Groups => { 2 => 'Location' },
|
1324
|
+
},
|
1325
|
+
0x8602 => { #16
|
1326
|
+
Name => 'WB_GRGBLevels',
|
1327
|
+
Notes => 'found in IFD0 of Leaf MOS images',
|
1328
|
+
},
|
1329
|
+
# 0x8603 - Leaf CatchLight color matrix (ref 16)
|
1330
|
+
0x8606 => {
|
1331
|
+
Name => 'LeafData',
|
1332
|
+
Format => 'undef', # avoid converting huge block to string of int8u's!
|
1333
|
+
SubDirectory => {
|
1334
|
+
DirName => 'LeafIFD',
|
1335
|
+
TagTable => 'Image::ExifTool::Leaf::Main',
|
1336
|
+
},
|
1337
|
+
},
|
1338
|
+
0x8649 => { #19
|
1339
|
+
Name => 'PhotoshopSettings',
|
1340
|
+
Format => 'binary',
|
1341
|
+
SubDirectory => {
|
1342
|
+
DirName => 'Photoshop',
|
1343
|
+
TagTable => 'Image::ExifTool::Photoshop::Main',
|
1344
|
+
},
|
1345
|
+
},
|
1346
|
+
0x8769 => {
|
1347
|
+
Name => 'ExifOffset',
|
1348
|
+
Groups => { 1 => 'ExifIFD' },
|
1349
|
+
SubIFD => 2,
|
1350
|
+
SubDirectory => {
|
1351
|
+
DirName => 'ExifIFD',
|
1352
|
+
Start => '$val',
|
1353
|
+
},
|
1354
|
+
},
|
1355
|
+
0x8773 => {
|
1356
|
+
Name => 'ICC_Profile',
|
1357
|
+
SubDirectory => {
|
1358
|
+
TagTable => 'Image::ExifTool::ICC_Profile::Main',
|
1359
|
+
},
|
1360
|
+
},
|
1361
|
+
0x877f => { #20
|
1362
|
+
Name => 'TIFF_FXExtensions',
|
1363
|
+
PrintConv => { BITMASK => {
|
1364
|
+
0 => 'Resolution/Image Width',
|
1365
|
+
1 => 'N Layer Profile M',
|
1366
|
+
2 => 'Shared Data',
|
1367
|
+
3 => 'B&W JBIG2',
|
1368
|
+
4 => 'JBIG2 Profile M',
|
1369
|
+
}},
|
1370
|
+
},
|
1371
|
+
0x8780 => { #20
|
1372
|
+
Name => 'MultiProfiles',
|
1373
|
+
PrintConv => { BITMASK => {
|
1374
|
+
0 => 'Profile S',
|
1375
|
+
1 => 'Profile F',
|
1376
|
+
2 => 'Profile J',
|
1377
|
+
3 => 'Profile C',
|
1378
|
+
4 => 'Profile L',
|
1379
|
+
5 => 'Profile M',
|
1380
|
+
6 => 'Profile T',
|
1381
|
+
7 => 'Resolution/Image Width',
|
1382
|
+
8 => 'N Layer Profile M',
|
1383
|
+
9 => 'Shared Data',
|
1384
|
+
10 => 'JBIG2 Profile M',
|
1385
|
+
}},
|
1386
|
+
},
|
1387
|
+
0x8781 => { #22
|
1388
|
+
Name => 'SharedData',
|
1389
|
+
IsOffset => 1,
|
1390
|
+
# this tag is not supported for writing, so define an
|
1391
|
+
# invalid offset pair to cause a "No size tag" error to be
|
1392
|
+
# generated if we try to write a file containing this tag
|
1393
|
+
OffsetPair => -1,
|
1394
|
+
},
|
1395
|
+
0x8782 => 'T88Options', #20
|
1396
|
+
0x87ac => 'ImageLayer',
|
1397
|
+
0x87af => {
|
1398
|
+
Name => 'GeoTiffDirectory',
|
1399
|
+
Format => 'binary',
|
1400
|
+
Binary => 1,
|
1401
|
+
},
|
1402
|
+
0x87b0 => {
|
1403
|
+
Name => 'GeoTiffDoubleParams',
|
1404
|
+
Format => 'binary',
|
1405
|
+
Binary => 1,
|
1406
|
+
},
|
1407
|
+
0x87b1 => {
|
1408
|
+
Name => 'GeoTiffAsciiParams',
|
1409
|
+
Binary => 1,
|
1410
|
+
},
|
1411
|
+
0x8822 => {
|
1412
|
+
Name => 'ExposureProgram',
|
1413
|
+
Groups => { 2 => 'Camera' },
|
1414
|
+
Notes => 'the value of 9 is not standard EXIF, but is used by the Canon EOS 7D',
|
1415
|
+
PrintConv => {
|
1416
|
+
0 => 'Not Defined',
|
1417
|
+
1 => 'Manual',
|
1418
|
+
2 => 'Program AE',
|
1419
|
+
3 => 'Aperture-priority AE',
|
1420
|
+
4 => 'Shutter speed priority AE',
|
1421
|
+
5 => 'Creative (Slow speed)',
|
1422
|
+
6 => 'Action (High speed)',
|
1423
|
+
7 => 'Portrait',
|
1424
|
+
8 => 'Landscape',
|
1425
|
+
9 => 'Bulb', #25
|
1426
|
+
},
|
1427
|
+
},
|
1428
|
+
0x8824 => {
|
1429
|
+
Name => 'SpectralSensitivity',
|
1430
|
+
Groups => { 2 => 'Camera' },
|
1431
|
+
},
|
1432
|
+
0x8825 => {
|
1433
|
+
Name => 'GPSInfo',
|
1434
|
+
Groups => { 1 => 'GPS' },
|
1435
|
+
Flags => 'SubIFD',
|
1436
|
+
SubDirectory => {
|
1437
|
+
DirName => 'GPS',
|
1438
|
+
TagTable => 'Image::ExifTool::GPS::Main',
|
1439
|
+
Start => '$val',
|
1440
|
+
MaxSubdirs => 1,
|
1441
|
+
},
|
1442
|
+
},
|
1443
|
+
0x8827 => {
|
1444
|
+
Name => 'ISO',
|
1445
|
+
Notes => q{
|
1446
|
+
called ISOSpeedRatings by EXIF 2.2, then PhotographicSensitivity by the EXIF
|
1447
|
+
2.3 spec.
|
1448
|
+
},
|
1449
|
+
PrintConv => '$val=~s/\s+/, /g; $val',
|
1450
|
+
},
|
1451
|
+
0x8828 => {
|
1452
|
+
Name => 'Opto-ElectricConvFactor',
|
1453
|
+
Notes => 'called OECF by the EXIF spec.',
|
1454
|
+
Binary => 1,
|
1455
|
+
},
|
1456
|
+
0x8829 => 'Interlace', #12
|
1457
|
+
0x882a => 'TimeZoneOffset', #12
|
1458
|
+
0x882b => 'SelfTimerMode', #12
|
1459
|
+
0x8830 => { #24
|
1460
|
+
Name => 'SensitivityType',
|
1461
|
+
Notes => 'applies to EXIF:ISO tag',
|
1462
|
+
PrintConv => {
|
1463
|
+
0 => 'Unknown',
|
1464
|
+
1 => 'Standard Output Sensitivity',
|
1465
|
+
2 => 'Recommended Exposure Index',
|
1466
|
+
3 => 'ISO Speed',
|
1467
|
+
4 => 'Standard Output Sensitivity and Recommended Exposure Index',
|
1468
|
+
5 => 'Standard Output Sensitivity and ISO Speed',
|
1469
|
+
6 => 'Recommended Exposure Index and ISO Speed',
|
1470
|
+
7 => 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed',
|
1471
|
+
},
|
1472
|
+
},
|
1473
|
+
0x8831 => 'StandardOutputSensitivity', #24
|
1474
|
+
0x8832 => 'RecommendedExposureIndex', #24
|
1475
|
+
0x8833 => 'ISOSpeed', #24
|
1476
|
+
0x8834 => { #24
|
1477
|
+
Name => 'ISOSpeedLatitudeyyy',
|
1478
|
+
Description => 'ISO Speed Latitude yyy',
|
1479
|
+
},
|
1480
|
+
0x8835 => { #24
|
1481
|
+
Name => 'ISOSpeedLatitudezzz',
|
1482
|
+
Description => 'ISO Speed Latitude zzz',
|
1483
|
+
},
|
1484
|
+
0x885c => 'FaxRecvParams', #9
|
1485
|
+
0x885d => 'FaxSubAddress', #9
|
1486
|
+
0x885e => 'FaxRecvTime', #9
|
1487
|
+
0x888a => { #PH
|
1488
|
+
Name => 'LeafSubIFD',
|
1489
|
+
Format => 'int32u', # Leaf incorrectly uses 'undef' format!
|
1490
|
+
Groups => { 1 => 'LeafSubIFD' },
|
1491
|
+
Flags => 'SubIFD',
|
1492
|
+
SubDirectory => {
|
1493
|
+
TagTable => 'Image::ExifTool::Leaf::SubIFD',
|
1494
|
+
Start => '$val',
|
1495
|
+
},
|
1496
|
+
},
|
1497
|
+
0x9000 => {
|
1498
|
+
Name => 'ExifVersion',
|
1499
|
+
RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
|
1500
|
+
},
|
1501
|
+
0x9003 => {
|
1502
|
+
Name => 'DateTimeOriginal',
|
1503
|
+
Description => 'Date/Time Original',
|
1504
|
+
Groups => { 2 => 'Time' },
|
1505
|
+
Notes => 'date/time when original image was taken',
|
1506
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
1507
|
+
},
|
1508
|
+
0x9004 => {
|
1509
|
+
Name => 'CreateDate',
|
1510
|
+
Groups => { 2 => 'Time' },
|
1511
|
+
Notes => 'called DateTimeDigitized by the EXIF spec.',
|
1512
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
1513
|
+
},
|
1514
|
+
0x9101 => {
|
1515
|
+
Name => 'ComponentsConfiguration',
|
1516
|
+
Format => 'int8u',
|
1517
|
+
PrintConvColumns => 2,
|
1518
|
+
PrintConv => {
|
1519
|
+
0 => '-',
|
1520
|
+
1 => 'Y',
|
1521
|
+
2 => 'Cb',
|
1522
|
+
3 => 'Cr',
|
1523
|
+
4 => 'R',
|
1524
|
+
5 => 'G',
|
1525
|
+
6 => 'B',
|
1526
|
+
OTHER => sub {
|
1527
|
+
my ($val, $inv, $conv) = @_;
|
1528
|
+
my @a = split /,?\s+/, $val;
|
1529
|
+
if ($inv) {
|
1530
|
+
my %invConv;
|
1531
|
+
$invConv{lc $$conv{$_}} = $_ foreach keys %$conv;
|
1532
|
+
# strings like "YCbCr" and "RGB" still work for writing
|
1533
|
+
@a = $a[0] =~ /(Y|Cb|Cr|R|G|B)/g if @a == 1;
|
1534
|
+
foreach (@a) {
|
1535
|
+
$_ = $invConv{lc $_};
|
1536
|
+
return undef unless defined $_;
|
1537
|
+
}
|
1538
|
+
push @a, 0 while @a < 4;
|
1539
|
+
} else {
|
1540
|
+
foreach (@a) {
|
1541
|
+
$_ = $$conv{$_} || "Err ($_)";
|
1542
|
+
}
|
1543
|
+
}
|
1544
|
+
return join ', ', @a;
|
1545
|
+
},
|
1546
|
+
},
|
1547
|
+
},
|
1548
|
+
0x9102 => 'CompressedBitsPerPixel',
|
1549
|
+
0x9201 => {
|
1550
|
+
Name => 'ShutterSpeedValue',
|
1551
|
+
Notes => 'displayed in seconds, but stored as an APEX value',
|
1552
|
+
Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
|
1553
|
+
ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
|
1554
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
1555
|
+
},
|
1556
|
+
0x9202 => {
|
1557
|
+
Name => 'ApertureValue',
|
1558
|
+
Notes => 'displayed as an F number, but stored as an APEX value',
|
1559
|
+
ValueConv => '2 ** ($val / 2)',
|
1560
|
+
PrintConv => 'sprintf("%.1f",$val)',
|
1561
|
+
},
|
1562
|
+
# Wikipedia: BrightnessValue = Bv = Av + Tv - Sv
|
1563
|
+
# ExifTool: LightValue = LV = Av + Tv - Sv + 5 (5 is the Sv for ISO 100 in Exif usage)
|
1564
|
+
0x9203 => 'BrightnessValue',
|
1565
|
+
0x9204 => {
|
1566
|
+
Name => 'ExposureCompensation',
|
1567
|
+
Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
|
1568
|
+
Notes => 'called ExposureBiasValue by the EXIF spec.',
|
1569
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
|
1570
|
+
},
|
1571
|
+
0x9205 => {
|
1572
|
+
Name => 'MaxApertureValue',
|
1573
|
+
Notes => 'displayed as an F number, but stored as an APEX value',
|
1574
|
+
Groups => { 2 => 'Camera' },
|
1575
|
+
ValueConv => '2 ** ($val / 2)',
|
1576
|
+
PrintConv => 'sprintf("%.1f",$val)',
|
1577
|
+
},
|
1578
|
+
0x9206 => {
|
1579
|
+
Name => 'SubjectDistance',
|
1580
|
+
Groups => { 2 => 'Camera' },
|
1581
|
+
PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "${val} m"',
|
1582
|
+
},
|
1583
|
+
0x9207 => {
|
1584
|
+
Name => 'MeteringMode',
|
1585
|
+
Groups => { 2 => 'Camera' },
|
1586
|
+
PrintConv => {
|
1587
|
+
0 => 'Unknown',
|
1588
|
+
1 => 'Average',
|
1589
|
+
2 => 'Center-weighted average',
|
1590
|
+
3 => 'Spot',
|
1591
|
+
4 => 'Multi-spot',
|
1592
|
+
5 => 'Multi-segment',
|
1593
|
+
6 => 'Partial',
|
1594
|
+
255 => 'Other',
|
1595
|
+
},
|
1596
|
+
},
|
1597
|
+
0x9208 => {
|
1598
|
+
Name => 'LightSource',
|
1599
|
+
Groups => { 2 => 'Camera' },
|
1600
|
+
SeparateTable => 'LightSource',
|
1601
|
+
PrintConv => \%lightSource,
|
1602
|
+
},
|
1603
|
+
0x9209 => {
|
1604
|
+
Name => 'Flash',
|
1605
|
+
Groups => { 2 => 'Camera' },
|
1606
|
+
Flags => 'PrintHex',
|
1607
|
+
SeparateTable => 'Flash',
|
1608
|
+
PrintConv => \%flash,
|
1609
|
+
},
|
1610
|
+
0x920a => {
|
1611
|
+
Name => 'FocalLength',
|
1612
|
+
Groups => { 2 => 'Camera' },
|
1613
|
+
PrintConv => 'sprintf("%.1f mm",$val)',
|
1614
|
+
},
|
1615
|
+
# Note: tags 0x920b-0x9217 are duplicates of 0xa20b-0xa217
|
1616
|
+
# (The TIFF standard uses 0xa2xx, but you'll find both in images)
|
1617
|
+
0x920b => { #12
|
1618
|
+
Name => 'FlashEnergy',
|
1619
|
+
Groups => { 2 => 'Camera' },
|
1620
|
+
},
|
1621
|
+
0x920c => 'SpatialFrequencyResponse', #12 (not in Fuji images - PH)
|
1622
|
+
0x920d => 'Noise', #12
|
1623
|
+
0x920e => 'FocalPlaneXResolution', #12
|
1624
|
+
0x920f => 'FocalPlaneYResolution', #12
|
1625
|
+
0x9210 => { #12
|
1626
|
+
Name => 'FocalPlaneResolutionUnit',
|
1627
|
+
Groups => { 2 => 'Camera' },
|
1628
|
+
PrintConv => {
|
1629
|
+
1 => 'None',
|
1630
|
+
2 => 'inches',
|
1631
|
+
3 => 'cm',
|
1632
|
+
4 => 'mm',
|
1633
|
+
5 => 'um',
|
1634
|
+
},
|
1635
|
+
},
|
1636
|
+
0x9211 => 'ImageNumber', #12
|
1637
|
+
0x9212 => { #12
|
1638
|
+
Name => 'SecurityClassification',
|
1639
|
+
PrintConv => {
|
1640
|
+
T => 'Top Secret',
|
1641
|
+
S => 'Secret',
|
1642
|
+
C => 'Confidential',
|
1643
|
+
R => 'Restricted',
|
1644
|
+
U => 'Unclassified',
|
1645
|
+
},
|
1646
|
+
},
|
1647
|
+
0x9213 => 'ImageHistory', #12
|
1648
|
+
0x9214 => {
|
1649
|
+
Name => 'SubjectArea',
|
1650
|
+
Groups => { 2 => 'Camera' },
|
1651
|
+
},
|
1652
|
+
0x9215 => 'ExposureIndex', #12
|
1653
|
+
0x9216 => 'TIFF-EPStandardID', #12
|
1654
|
+
0x9217 => { #12
|
1655
|
+
Name => 'SensingMethod',
|
1656
|
+
Groups => { 2 => 'Camera' },
|
1657
|
+
Notes => 'values 1 and 6 are not standard EXIF',
|
1658
|
+
PrintConv => {
|
1659
|
+
1 => 'Monochrome area', #12 (not standard EXIF)
|
1660
|
+
2 => 'One-chip color area',
|
1661
|
+
3 => 'Two-chip color area',
|
1662
|
+
4 => 'Three-chip color area',
|
1663
|
+
5 => 'Color sequential area',
|
1664
|
+
6 => 'Monochrome linear', #12 (not standard EXIF)
|
1665
|
+
7 => 'Trilinear',
|
1666
|
+
8 => 'Color sequential linear',
|
1667
|
+
},
|
1668
|
+
},
|
1669
|
+
0x923a => 'CIP3DataFile', #20
|
1670
|
+
0x923b => 'CIP3Sheet', #20
|
1671
|
+
0x923c => 'CIP3Side', #20
|
1672
|
+
0x923f => 'StoNits', #9
|
1673
|
+
# handle maker notes as a conditional list
|
1674
|
+
0x927c => \@Image::ExifTool::MakerNotes::Main,
|
1675
|
+
0x9286 => {
|
1676
|
+
Name => 'UserComment',
|
1677
|
+
# I have seen other applications write it incorrectly as 'string' or 'int8u'
|
1678
|
+
Format => 'undef',
|
1679
|
+
RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1)',
|
1680
|
+
},
|
1681
|
+
0x9290 => {
|
1682
|
+
Name => 'SubSecTime',
|
1683
|
+
Groups => { 2 => 'Time' },
|
1684
|
+
ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
|
1685
|
+
},
|
1686
|
+
0x9291 => {
|
1687
|
+
Name => 'SubSecTimeOriginal',
|
1688
|
+
Groups => { 2 => 'Time' },
|
1689
|
+
ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
|
1690
|
+
},
|
1691
|
+
0x9292 => {
|
1692
|
+
Name => 'SubSecTimeDigitized',
|
1693
|
+
Groups => { 2 => 'Time' },
|
1694
|
+
ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
|
1695
|
+
},
|
1696
|
+
# The following 3 tags are found in MSOffice TIFF images
|
1697
|
+
# References:
|
1698
|
+
# http://social.msdn.microsoft.com/Forums/en-US/os_standocs/thread/03086d55-294a-49d5-967a-5303d34c40f8/
|
1699
|
+
# http://blogs.msdn.com/openspecification/archive/2009/12/08/details-of-three-tiff-tag-extensions-that-microsoft-office-document-imaging-modi-software-may-write-into-the-tiff-files-it-generates.aspx
|
1700
|
+
# http://www.microsoft.com/downloads/details.aspx?FamilyID=0dbc435d-3544-4f4b-9092-2f2643d64a39&displaylang=en#filelist
|
1701
|
+
0x932f => 'MSDocumentText',
|
1702
|
+
0x9330 => {
|
1703
|
+
Name => 'MSPropertySetStorage',
|
1704
|
+
Binary => 1,
|
1705
|
+
},
|
1706
|
+
0x9331 => {
|
1707
|
+
Name => 'MSDocumentTextPosition',
|
1708
|
+
Binary => 1, # (just in case -- don't know what format this is)
|
1709
|
+
},
|
1710
|
+
0x935c => { #3/19
|
1711
|
+
Name => 'ImageSourceData',
|
1712
|
+
Binary => 1,
|
1713
|
+
Protected => 1, # (because this can be hundreds of megabytes)
|
1714
|
+
},
|
1715
|
+
0x9c9b => {
|
1716
|
+
Name => 'XPTitle',
|
1717
|
+
Format => 'undef',
|
1718
|
+
ValueConv => '$self->Decode($val,"UCS2","II")',
|
1719
|
+
},
|
1720
|
+
0x9c9c => {
|
1721
|
+
Name => 'XPComment',
|
1722
|
+
Format => 'undef',
|
1723
|
+
ValueConv => '$self->Decode($val,"UCS2","II")',
|
1724
|
+
},
|
1725
|
+
0x9c9d => {
|
1726
|
+
Name => 'XPAuthor',
|
1727
|
+
Groups => { 2 => 'Author' },
|
1728
|
+
Format => 'undef',
|
1729
|
+
ValueConv => '$self->Decode($val,"UCS2","II")',
|
1730
|
+
},
|
1731
|
+
0x9c9e => {
|
1732
|
+
Name => 'XPKeywords',
|
1733
|
+
Format => 'undef',
|
1734
|
+
ValueConv => '$self->Decode($val,"UCS2","II")',
|
1735
|
+
},
|
1736
|
+
0x9c9f => {
|
1737
|
+
Name => 'XPSubject',
|
1738
|
+
Format => 'undef',
|
1739
|
+
ValueConv => '$self->Decode($val,"UCS2","II")',
|
1740
|
+
},
|
1741
|
+
0xa000 => {
|
1742
|
+
Name => 'FlashpixVersion',
|
1743
|
+
RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
|
1744
|
+
},
|
1745
|
+
0xa001 => {
|
1746
|
+
Name => 'ColorSpace',
|
1747
|
+
Notes => q{
|
1748
|
+
the value of 0x2 is not standard EXIF. Instead, an Adobe RGB image is
|
1749
|
+
indicated by "Uncalibrated" with an InteropIndex of "R03". The values
|
1750
|
+
0xfffd and 0xfffe are also non-standard, and are used by some Sony cameras
|
1751
|
+
},
|
1752
|
+
PrintHex => 1,
|
1753
|
+
PrintConv => {
|
1754
|
+
1 => 'sRGB',
|
1755
|
+
2 => 'Adobe RGB',
|
1756
|
+
0xffff => 'Uncalibrated',
|
1757
|
+
# Sony uses these definitions: (ref JD)
|
1758
|
+
# 0xffff => 'Adobe RGB', (conflicts with Uncalibrated)
|
1759
|
+
0xfffe => 'ICC Profile',
|
1760
|
+
0xfffd => 'Wide Gamut RGB',
|
1761
|
+
},
|
1762
|
+
},
|
1763
|
+
0xa002 => {
|
1764
|
+
Name => 'ExifImageWidth',
|
1765
|
+
Notes => 'called PixelXDimension by the EXIF spec.',
|
1766
|
+
},
|
1767
|
+
0xa003 => {
|
1768
|
+
Name => 'ExifImageHeight',
|
1769
|
+
Notes => 'called PixelYDimension by the EXIF spec.',
|
1770
|
+
},
|
1771
|
+
0xa004 => 'RelatedSoundFile',
|
1772
|
+
0xa005 => {
|
1773
|
+
Name => 'InteropOffset',
|
1774
|
+
Groups => { 1 => 'InteropIFD' },
|
1775
|
+
Flags => 'SubIFD',
|
1776
|
+
Description => 'Interoperability Offset',
|
1777
|
+
SubDirectory => {
|
1778
|
+
DirName => 'InteropIFD',
|
1779
|
+
Start => '$val',
|
1780
|
+
MaxSubdirs => 1,
|
1781
|
+
},
|
1782
|
+
},
|
1783
|
+
0xa20b => {
|
1784
|
+
Name => 'FlashEnergy',
|
1785
|
+
Groups => { 2 => 'Camera' },
|
1786
|
+
},
|
1787
|
+
0xa20c => {
|
1788
|
+
Name => 'SpatialFrequencyResponse',
|
1789
|
+
PrintConv => 'Image::ExifTool::Exif::PrintSFR($val)',
|
1790
|
+
},
|
1791
|
+
0xa20d => 'Noise',
|
1792
|
+
0xa20e => { Name => 'FocalPlaneXResolution', Groups => { 2 => 'Camera' } },
|
1793
|
+
0xa20f => { Name => 'FocalPlaneYResolution', Groups => { 2 => 'Camera' } },
|
1794
|
+
0xa210 => {
|
1795
|
+
Name => 'FocalPlaneResolutionUnit',
|
1796
|
+
Groups => { 2 => 'Camera' },
|
1797
|
+
Notes => 'values 1, 4 and 5 are not standard EXIF',
|
1798
|
+
PrintConv => {
|
1799
|
+
1 => 'None', # (not standard EXIF)
|
1800
|
+
2 => 'inches',
|
1801
|
+
3 => 'cm',
|
1802
|
+
4 => 'mm', # (not standard EXIF)
|
1803
|
+
5 => 'um', # (not standard EXIF)
|
1804
|
+
},
|
1805
|
+
},
|
1806
|
+
0xa211 => 'ImageNumber',
|
1807
|
+
0xa212 => 'SecurityClassification',
|
1808
|
+
0xa213 => 'ImageHistory',
|
1809
|
+
0xa214 => {
|
1810
|
+
Name => 'SubjectLocation',
|
1811
|
+
Groups => { 2 => 'Camera' },
|
1812
|
+
},
|
1813
|
+
0xa215 => 'ExposureIndex',
|
1814
|
+
0xa216 => 'TIFF-EPStandardID',
|
1815
|
+
0xa217 => {
|
1816
|
+
Name => 'SensingMethod',
|
1817
|
+
Groups => { 2 => 'Camera' },
|
1818
|
+
PrintConv => {
|
1819
|
+
1 => 'Not defined',
|
1820
|
+
2 => 'One-chip color area',
|
1821
|
+
3 => 'Two-chip color area',
|
1822
|
+
4 => 'Three-chip color area',
|
1823
|
+
5 => 'Color sequential area',
|
1824
|
+
7 => 'Trilinear',
|
1825
|
+
8 => 'Color sequential linear',
|
1826
|
+
},
|
1827
|
+
},
|
1828
|
+
0xa300 => {
|
1829
|
+
Name => 'FileSource',
|
1830
|
+
PrintConv => {
|
1831
|
+
1 => 'Film Scanner',
|
1832
|
+
2 => 'Reflection Print Scanner',
|
1833
|
+
3 => 'Digital Camera',
|
1834
|
+
# handle the case where Sigma incorrectly gives this tag a count of 4
|
1835
|
+
"\3\0\0\0" => 'Sigma Digital Camera',
|
1836
|
+
},
|
1837
|
+
},
|
1838
|
+
0xa301 => {
|
1839
|
+
Name => 'SceneType',
|
1840
|
+
PrintConv => {
|
1841
|
+
1 => 'Directly photographed',
|
1842
|
+
},
|
1843
|
+
},
|
1844
|
+
0xa302 => {
|
1845
|
+
Name => 'CFAPattern',
|
1846
|
+
RawConv => 'Image::ExifTool::Exif::DecodeCFAPattern($self, $val)',
|
1847
|
+
PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)',
|
1848
|
+
},
|
1849
|
+
0xa401 => {
|
1850
|
+
Name => 'CustomRendered',
|
1851
|
+
PrintConv => {
|
1852
|
+
0 => 'Normal',
|
1853
|
+
1 => 'Custom',
|
1854
|
+
},
|
1855
|
+
},
|
1856
|
+
0xa402 => {
|
1857
|
+
Name => 'ExposureMode',
|
1858
|
+
Groups => { 2 => 'Camera' },
|
1859
|
+
PrintConv => {
|
1860
|
+
0 => 'Auto',
|
1861
|
+
1 => 'Manual',
|
1862
|
+
2 => 'Auto bracket',
|
1863
|
+
# have seen 3 from Samsung EX1 and NX200 - PH
|
1864
|
+
},
|
1865
|
+
},
|
1866
|
+
0xa403 => {
|
1867
|
+
Name => 'WhiteBalance',
|
1868
|
+
Groups => { 2 => 'Camera' },
|
1869
|
+
# set Priority to zero to keep this WhiteBalance from overriding the
|
1870
|
+
# MakerNotes WhiteBalance, since the MakerNotes WhiteBalance and is more
|
1871
|
+
# accurate and contains more information (if it exists)
|
1872
|
+
Priority => 0,
|
1873
|
+
PrintConv => {
|
1874
|
+
0 => 'Auto',
|
1875
|
+
1 => 'Manual',
|
1876
|
+
},
|
1877
|
+
},
|
1878
|
+
0xa404 => {
|
1879
|
+
Name => 'DigitalZoomRatio',
|
1880
|
+
Groups => { 2 => 'Camera' },
|
1881
|
+
},
|
1882
|
+
0xa405 => {
|
1883
|
+
Name => 'FocalLengthIn35mmFormat',
|
1884
|
+
Notes => 'called FocalLengthIn35mmFilm by the EXIF spec.',
|
1885
|
+
Groups => { 2 => 'Camera' },
|
1886
|
+
PrintConv => '"$val mm"',
|
1887
|
+
},
|
1888
|
+
0xa406 => {
|
1889
|
+
Name => 'SceneCaptureType',
|
1890
|
+
Groups => { 2 => 'Camera' },
|
1891
|
+
PrintConv => {
|
1892
|
+
0 => 'Standard',
|
1893
|
+
1 => 'Landscape',
|
1894
|
+
2 => 'Portrait',
|
1895
|
+
3 => 'Night',
|
1896
|
+
},
|
1897
|
+
},
|
1898
|
+
0xa407 => {
|
1899
|
+
Name => 'GainControl',
|
1900
|
+
Groups => { 2 => 'Camera' },
|
1901
|
+
PrintConv => {
|
1902
|
+
0 => 'None',
|
1903
|
+
1 => 'Low gain up',
|
1904
|
+
2 => 'High gain up',
|
1905
|
+
3 => 'Low gain down',
|
1906
|
+
4 => 'High gain down',
|
1907
|
+
},
|
1908
|
+
},
|
1909
|
+
0xa408 => {
|
1910
|
+
Name => 'Contrast',
|
1911
|
+
Groups => { 2 => 'Camera' },
|
1912
|
+
PrintConv => {
|
1913
|
+
0 => 'Normal',
|
1914
|
+
1 => 'Low',
|
1915
|
+
2 => 'High',
|
1916
|
+
},
|
1917
|
+
},
|
1918
|
+
0xa409 => {
|
1919
|
+
Name => 'Saturation',
|
1920
|
+
Groups => { 2 => 'Camera' },
|
1921
|
+
PrintConv => {
|
1922
|
+
0 => 'Normal',
|
1923
|
+
1 => 'Low',
|
1924
|
+
2 => 'High',
|
1925
|
+
},
|
1926
|
+
},
|
1927
|
+
0xa40a => {
|
1928
|
+
Name => 'Sharpness',
|
1929
|
+
Groups => { 2 => 'Camera' },
|
1930
|
+
PrintConv => {
|
1931
|
+
0 => 'Normal',
|
1932
|
+
1 => 'Soft',
|
1933
|
+
2 => 'Hard',
|
1934
|
+
},
|
1935
|
+
},
|
1936
|
+
0xa40b => {
|
1937
|
+
Name => 'DeviceSettingDescription',
|
1938
|
+
Groups => { 2 => 'Camera' },
|
1939
|
+
Binary => 1,
|
1940
|
+
},
|
1941
|
+
0xa40c => {
|
1942
|
+
Name => 'SubjectDistanceRange',
|
1943
|
+
Groups => { 2 => 'Camera' },
|
1944
|
+
PrintConv => {
|
1945
|
+
0 => 'Unknown',
|
1946
|
+
1 => 'Macro',
|
1947
|
+
2 => 'Close',
|
1948
|
+
3 => 'Distant',
|
1949
|
+
},
|
1950
|
+
},
|
1951
|
+
# 0xa40d - int16u: 0 (GE E1486 TW)
|
1952
|
+
# 0xa40e - int16u: 1 (GE E1486 TW)
|
1953
|
+
0xa420 => 'ImageUniqueID',
|
1954
|
+
0xa430 => { #24
|
1955
|
+
Name => 'OwnerName',
|
1956
|
+
Notes => 'called CameraOwnerName by the EXIF spec.',
|
1957
|
+
},
|
1958
|
+
0xa431 => { #24
|
1959
|
+
Name => 'SerialNumber',
|
1960
|
+
Notes => 'called BodySerialNumber by the EXIF spec.',
|
1961
|
+
},
|
1962
|
+
0xa432 => { #24
|
1963
|
+
Name => 'LensInfo',
|
1964
|
+
Notes => q{
|
1965
|
+
4 rational values giving focal and aperture ranges, called LensSpecification
|
1966
|
+
by the EXIF spec.
|
1967
|
+
},
|
1968
|
+
# convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
|
1969
|
+
PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
|
1970
|
+
},
|
1971
|
+
0xa433 => 'LensMake', #24
|
1972
|
+
0xa434 => 'LensModel', #24
|
1973
|
+
0xa435 => 'LensSerialNumber', #24
|
1974
|
+
0xa480 => 'GDALMetadata', #3
|
1975
|
+
0xa481 => 'GDALNoData', #3
|
1976
|
+
0xa500 => 'Gamma',
|
1977
|
+
0xafc0 => 'ExpandSoftware', #JD (Opanda)
|
1978
|
+
0xafc1 => 'ExpandLens', #JD (Opanda)
|
1979
|
+
0xafc2 => 'ExpandFilm', #JD (Opanda)
|
1980
|
+
0xafc3 => 'ExpandFilterLens', #JD (Opanda)
|
1981
|
+
0xafc4 => 'ExpandScanner', #JD (Opanda)
|
1982
|
+
0xafc5 => 'ExpandFlashLamp', #JD (Opanda)
|
1983
|
+
#
|
1984
|
+
# Windows Media Photo / HD Photo (WDP/HDP) tags
|
1985
|
+
#
|
1986
|
+
0xbc01 => { #13
|
1987
|
+
Name => 'PixelFormat',
|
1988
|
+
PrintHex => 1,
|
1989
|
+
Format => 'undef',
|
1990
|
+
Notes => q{
|
1991
|
+
tags 0xbc** are used in Windows HD Photo (HDP and WDP) images. The actual
|
1992
|
+
PixelFormat values are 16-byte GUID's but the leading 15 bytes,
|
1993
|
+
'6fddc324-4e03-4bfe-b1853-d77768dc9', have been removed below to avoid
|
1994
|
+
unnecessary clutter
|
1995
|
+
},
|
1996
|
+
ValueConv => q{
|
1997
|
+
require Image::ExifTool::ASF;
|
1998
|
+
$val = Image::ExifTool::ASF::GetGUID($val);
|
1999
|
+
# GUID's are too long, so remove redundant information
|
2000
|
+
$val =~ s/^6fddc324-4e03-4bfe-b185-3d77768dc9//i and $val = hex($val);
|
2001
|
+
return $val;
|
2002
|
+
},
|
2003
|
+
PrintConv => {
|
2004
|
+
0x0d => '24-bit RGB',
|
2005
|
+
0x0c => '24-bit BGR',
|
2006
|
+
0x0e => '32-bit BGR',
|
2007
|
+
0x15 => '48-bit RGB',
|
2008
|
+
0x12 => '48-bit RGB Fixed Point',
|
2009
|
+
0x3b => '48-bit RGB Half',
|
2010
|
+
0x18 => '96-bit RGB Fixed Point',
|
2011
|
+
0x1b => '128-bit RGB Float',
|
2012
|
+
0x0f => '32-bit BGRA',
|
2013
|
+
0x16 => '64-bit RGBA',
|
2014
|
+
0x1d => '64-bit RGBA Fixed Point',
|
2015
|
+
0x3a => '64-bit RGBA Half',
|
2016
|
+
0x1e => '128-bit RGBA Fixed Point',
|
2017
|
+
0x19 => '128-bit RGBA Float',
|
2018
|
+
0x10 => '32-bit PBGRA',
|
2019
|
+
0x17 => '64-bit PRGBA',
|
2020
|
+
0x1a => '128-bit PRGBA Float',
|
2021
|
+
0x1c => '32-bit CMYK',
|
2022
|
+
0x2c => '40-bit CMYK Alpha',
|
2023
|
+
0x1f => '64-bit CMYK',
|
2024
|
+
0x2d => '80-bit CMYK Alpha',
|
2025
|
+
0x20 => '24-bit 3 Channels',
|
2026
|
+
0x21 => '32-bit 4 Channels',
|
2027
|
+
0x22 => '40-bit 5 Channels',
|
2028
|
+
0x23 => '48-bit 6 Channels',
|
2029
|
+
0x24 => '56-bit 7 Channels',
|
2030
|
+
0x25 => '64-bit 8 Channels',
|
2031
|
+
0x2e => '32-bit 3 Channels Alpha',
|
2032
|
+
0x2f => '40-bit 4 Channels Alpha',
|
2033
|
+
0x30 => '48-bit 5 Channels Alpha',
|
2034
|
+
0x31 => '56-bit 6 Channels Alpha',
|
2035
|
+
0x32 => '64-bit 7 Channels Alpha',
|
2036
|
+
0x33 => '72-bit 8 Channels Alpha',
|
2037
|
+
0x26 => '48-bit 3 Channels',
|
2038
|
+
0x27 => '64-bit 4 Channels',
|
2039
|
+
0x28 => '80-bit 5 Channels',
|
2040
|
+
0x29 => '96-bit 6 Channels',
|
2041
|
+
0x2a => '112-bit 7 Channels',
|
2042
|
+
0x2b => '128-bit 8 Channels',
|
2043
|
+
0x34 => '64-bit 3 Channels Alpha',
|
2044
|
+
0x35 => '80-bit 4 Channels Alpha',
|
2045
|
+
0x36 => '96-bit 5 Channels Alpha',
|
2046
|
+
0x37 => '112-bit 6 Channels Alpha',
|
2047
|
+
0x38 => '128-bit 7 Channels Alpha',
|
2048
|
+
0x39 => '144-bit 8 Channels Alpha',
|
2049
|
+
0x08 => '8-bit Gray',
|
2050
|
+
0x0b => '16-bit Gray',
|
2051
|
+
0x13 => '16-bit Gray Fixed Point',
|
2052
|
+
0x3e => '16-bit Gray Half',
|
2053
|
+
0x3f => '32-bit Gray Fixed Point',
|
2054
|
+
0x11 => '32-bit Gray Float',
|
2055
|
+
0x05 => 'Black & White',
|
2056
|
+
0x09 => '16-bit BGR555',
|
2057
|
+
0x0a => '16-bit BGR565',
|
2058
|
+
0x13 => '32-bit BGR101010',
|
2059
|
+
0x3d => '32-bit RGBE',
|
2060
|
+
},
|
2061
|
+
},
|
2062
|
+
0xbc02 => { #13
|
2063
|
+
Name => 'Transformation',
|
2064
|
+
PrintConv => {
|
2065
|
+
0 => 'Horizontal (normal)',
|
2066
|
+
1 => 'Mirror vertical',
|
2067
|
+
2 => 'Mirror horizontal',
|
2068
|
+
3 => 'Rotate 180',
|
2069
|
+
4 => 'Rotate 90 CW',
|
2070
|
+
5 => 'Mirror horizontal and rotate 90 CW',
|
2071
|
+
6 => 'Mirror horizontal and rotate 270 CW',
|
2072
|
+
7 => 'Rotate 270 CW',
|
2073
|
+
},
|
2074
|
+
},
|
2075
|
+
0xbc03 => { #13
|
2076
|
+
Name => 'Uncompressed',
|
2077
|
+
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
2078
|
+
},
|
2079
|
+
0xbc04 => { #13
|
2080
|
+
Name => 'ImageType',
|
2081
|
+
PrintConv => { BITMASK => {
|
2082
|
+
0 => 'Preview',
|
2083
|
+
1 => 'Page',
|
2084
|
+
} },
|
2085
|
+
},
|
2086
|
+
0xbc80 => 'ImageWidth', #13
|
2087
|
+
0xbc81 => 'ImageHeight', #13
|
2088
|
+
0xbc82 => 'WidthResolution', #13
|
2089
|
+
0xbc83 => 'HeightResolution', #13
|
2090
|
+
0xbcc0 => { #13
|
2091
|
+
Name => 'ImageOffset',
|
2092
|
+
IsOffset => 1,
|
2093
|
+
OffsetPair => 0xbcc1, # point to associated byte count
|
2094
|
+
},
|
2095
|
+
0xbcc1 => { #13
|
2096
|
+
Name => 'ImageByteCount',
|
2097
|
+
OffsetPair => 0xbcc0, # point to associated offset
|
2098
|
+
},
|
2099
|
+
0xbcc2 => { #13
|
2100
|
+
Name => 'AlphaOffset',
|
2101
|
+
IsOffset => 1,
|
2102
|
+
OffsetPair => 0xbcc3, # point to associated byte count
|
2103
|
+
},
|
2104
|
+
0xbcc3 => { #13
|
2105
|
+
Name => 'AlphaByteCount',
|
2106
|
+
OffsetPair => 0xbcc2, # point to associated offset
|
2107
|
+
},
|
2108
|
+
0xbcc4 => { #13
|
2109
|
+
Name => 'ImageDataDiscard',
|
2110
|
+
PrintConv => {
|
2111
|
+
0 => 'Full Resolution',
|
2112
|
+
1 => 'Flexbits Discarded',
|
2113
|
+
2 => 'HighPass Frequency Data Discarded',
|
2114
|
+
3 => 'Highpass and LowPass Frequency Data Discarded',
|
2115
|
+
},
|
2116
|
+
},
|
2117
|
+
0xbcc5 => { #13
|
2118
|
+
Name => 'AlphaDataDiscard',
|
2119
|
+
PrintConv => {
|
2120
|
+
0 => 'Full Resolution',
|
2121
|
+
1 => 'Flexbits Discarded',
|
2122
|
+
2 => 'HighPass Frequency Data Discarded',
|
2123
|
+
3 => 'Highpass and LowPass Frequency Data Discarded',
|
2124
|
+
},
|
2125
|
+
},
|
2126
|
+
#
|
2127
|
+
0xc427 => 'OceScanjobDesc', #3
|
2128
|
+
0xc428 => 'OceApplicationSelector', #3
|
2129
|
+
0xc429 => 'OceIDNumber', #3
|
2130
|
+
0xc42a => 'OceImageLogic', #3
|
2131
|
+
0xc44f => { Name => 'Annotations', Binary => 1 }, #7/19
|
2132
|
+
0xc4a5 => {
|
2133
|
+
Name => 'PrintIM', # (writable directory!)
|
2134
|
+
# must set Writable here so this tag will be saved with MakerNotes option
|
2135
|
+
Writable => 'undef',
|
2136
|
+
WriteGroup => 'IFD0',
|
2137
|
+
Binary => 1,
|
2138
|
+
# (don't make Binary/Protected because we can't copy individual PrintIM tags anyway)
|
2139
|
+
Description => 'Print Image Matching',
|
2140
|
+
SubDirectory => {
|
2141
|
+
TagTable => 'Image::ExifTool::PrintIM::Main',
|
2142
|
+
},
|
2143
|
+
PrintConvInv => '$val =~ /^PrintIM/ ? $val : undef', # quick validation
|
2144
|
+
},
|
2145
|
+
0xc573 => { #PH
|
2146
|
+
Name => 'OriginalFileName',
|
2147
|
+
Notes => 'used by some obscure software', # (possibly Swizzy Photosmacker?)
|
2148
|
+
# (it is a 'string', but obscure, so don't make it writable)
|
2149
|
+
},
|
2150
|
+
0xc580 => { #20
|
2151
|
+
Name => 'USPTOOriginalContentType',
|
2152
|
+
PrintConv => {
|
2153
|
+
0 => 'Text or Drawing',
|
2154
|
+
1 => 'Grayscale',
|
2155
|
+
2 => 'Color',
|
2156
|
+
},
|
2157
|
+
},
|
2158
|
+
#
|
2159
|
+
# DNG tags 0xc6XX and 0xc7XX (ref 2 unless otherwise stated)
|
2160
|
+
#
|
2161
|
+
0xc612 => {
|
2162
|
+
Name => 'DNGVersion',
|
2163
|
+
Notes => 'tags 0xc612-0xc7b5 are used in DNG images unless otherwise noted',
|
2164
|
+
DataMember => 'DNGVersion',
|
2165
|
+
RawConv => '$$self{DNGVersion} = $val',
|
2166
|
+
PrintConv => '$val =~ tr/ /./; $val',
|
2167
|
+
},
|
2168
|
+
0xc613 => {
|
2169
|
+
Name => 'DNGBackwardVersion',
|
2170
|
+
PrintConv => '$val =~ tr/ /./; $val',
|
2171
|
+
},
|
2172
|
+
0xc614 => 'UniqueCameraModel',
|
2173
|
+
0xc615 => {
|
2174
|
+
Name => 'LocalizedCameraModel',
|
2175
|
+
Format => 'string',
|
2176
|
+
PrintConv => '$self->Printable($val, 0)',
|
2177
|
+
},
|
2178
|
+
0xc616 => {
|
2179
|
+
Name => 'CFAPlaneColor',
|
2180
|
+
PrintConv => q{
|
2181
|
+
my @cols = qw(Red Green Blue Cyan Magenta Yellow White);
|
2182
|
+
my @vals = map { $cols[$_] || "Unknown($_)" } split(' ', $val);
|
2183
|
+
return join(',', @vals);
|
2184
|
+
},
|
2185
|
+
},
|
2186
|
+
0xc617 => {
|
2187
|
+
Name => 'CFALayout',
|
2188
|
+
PrintConv => {
|
2189
|
+
1 => 'Rectangular',
|
2190
|
+
2 => 'Even columns offset down 1/2 row',
|
2191
|
+
3 => 'Even columns offset up 1/2 row',
|
2192
|
+
4 => 'Even rows offset right 1/2 column',
|
2193
|
+
5 => 'Even rows offset left 1/2 column',
|
2194
|
+
# the following are new for DNG 1.3:
|
2195
|
+
6 => 'Even rows offset up by 1/2 row, even columns offset left by 1/2 column',
|
2196
|
+
7 => 'Even rows offset up by 1/2 row, even columns offset right by 1/2 column',
|
2197
|
+
8 => 'Even rows offset down by 1/2 row, even columns offset left by 1/2 column',
|
2198
|
+
9 => 'Even rows offset down by 1/2 row, even columns offset right by 1/2 column',
|
2199
|
+
},
|
2200
|
+
},
|
2201
|
+
0xc618 => { Name => 'LinearizationTable', Binary => 1 },
|
2202
|
+
0xc619 => 'BlackLevelRepeatDim',
|
2203
|
+
0xc61a => 'BlackLevel',
|
2204
|
+
0xc61b => { Name => 'BlackLevelDeltaH', %longBin },
|
2205
|
+
0xc61c => { Name => 'BlackLevelDeltaV', %longBin },
|
2206
|
+
0xc61d => 'WhiteLevel',
|
2207
|
+
0xc61e => 'DefaultScale',
|
2208
|
+
0xc61f => 'DefaultCropOrigin',
|
2209
|
+
0xc620 => 'DefaultCropSize',
|
2210
|
+
0xc621 => 'ColorMatrix1',
|
2211
|
+
0xc622 => 'ColorMatrix2',
|
2212
|
+
0xc623 => 'CameraCalibration1',
|
2213
|
+
0xc624 => 'CameraCalibration2',
|
2214
|
+
0xc625 => 'ReductionMatrix1',
|
2215
|
+
0xc626 => 'ReductionMatrix2',
|
2216
|
+
0xc627 => 'AnalogBalance',
|
2217
|
+
0xc628 => 'AsShotNeutral',
|
2218
|
+
0xc629 => 'AsShotWhiteXY',
|
2219
|
+
0xc62a => 'BaselineExposure',
|
2220
|
+
0xc62b => 'BaselineNoise',
|
2221
|
+
0xc62c => 'BaselineSharpness',
|
2222
|
+
0xc62d => 'BayerGreenSplit',
|
2223
|
+
0xc62e => 'LinearResponseLimit',
|
2224
|
+
0xc62f => {
|
2225
|
+
Name => 'CameraSerialNumber',
|
2226
|
+
Groups => { 2 => 'Camera' },
|
2227
|
+
},
|
2228
|
+
0xc630 => {
|
2229
|
+
Name => 'DNGLensInfo',
|
2230
|
+
Groups => { 2 => 'Camera' },
|
2231
|
+
PrintConv =>\&PrintLensInfo,
|
2232
|
+
},
|
2233
|
+
0xc631 => 'ChromaBlurRadius',
|
2234
|
+
0xc632 => 'AntiAliasStrength',
|
2235
|
+
0xc633 => 'ShadowScale',
|
2236
|
+
0xc634 => [
|
2237
|
+
{
|
2238
|
+
Condition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
|
2239
|
+
Name => 'SR2Private',
|
2240
|
+
Groups => { 1 => 'SR2' },
|
2241
|
+
Flags => 'SubIFD',
|
2242
|
+
Format => 'int32u',
|
2243
|
+
# some utilites have problems unless this is int8u format:
|
2244
|
+
# - Adobe Camera Raw 5.3 gives an error
|
2245
|
+
# - Apple Preview 10.5.8 gets the wrong white balance
|
2246
|
+
FixFormat => 'int8u', # (stupid Sony)
|
2247
|
+
SubDirectory => {
|
2248
|
+
DirName => 'SR2Private',
|
2249
|
+
TagTable => 'Image::ExifTool::Sony::SR2Private',
|
2250
|
+
Start => '$val',
|
2251
|
+
},
|
2252
|
+
},
|
2253
|
+
{
|
2254
|
+
Condition => '$$valPt =~ /^Adobe\0/',
|
2255
|
+
Name => 'DNGAdobeData',
|
2256
|
+
Flags => [ 'Binary', 'Protected' ],
|
2257
|
+
Writable => 'undef', # (writable directory!) (to make it possible to delete this mess)
|
2258
|
+
WriteGroup => 'IFD0',
|
2259
|
+
NestedHtmlDump => 1,
|
2260
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DNG::AdobeData' },
|
2261
|
+
Format => 'undef', # written incorrectly as int8u (change to undef for speed)
|
2262
|
+
},
|
2263
|
+
{
|
2264
|
+
# Pentax/Samsung models that write AOC maker notes in JPG images:
|
2265
|
+
# K-5,K-7,K-m,K-x,K-r,K10D,K20D,K100D,K110D,K200D,K2000,GX10,GX20
|
2266
|
+
# (Note: the following expression also appears in WriteExif.pl)
|
2267
|
+
Condition => q{
|
2268
|
+
$$valPt =~ /^(PENTAX |SAMSUNG)\0/ and
|
2269
|
+
$$self{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/
|
2270
|
+
},
|
2271
|
+
Name => 'MakerNotePentax',
|
2272
|
+
MakerNotes => 1, # (causes "MakerNotes header" to be identified in HtmlDump output)
|
2273
|
+
Binary => 1,
|
2274
|
+
# Note: Don't make this block-writable for a few reasons:
|
2275
|
+
# 1) It would be dangerous (possibly confusing Pentax software)
|
2276
|
+
# 2) It is a different format from the JPEG version of MakerNotePentax
|
2277
|
+
# 3) It is converted to JPEG format by RebuildMakerNotes() when copying
|
2278
|
+
SubDirectory => {
|
2279
|
+
TagTable => 'Image::ExifTool::Pentax::Main',
|
2280
|
+
Start => '$valuePtr + 10',
|
2281
|
+
Base => '$start - 10',
|
2282
|
+
ByteOrder => 'Unknown', # easier to do this than read byteorder word
|
2283
|
+
},
|
2284
|
+
Format => 'undef', # written incorrectly as int8u (change to undef for speed)
|
2285
|
+
},
|
2286
|
+
{
|
2287
|
+
# must duplicate the above tag with a different name for more recent
|
2288
|
+
# Pentax models which use the "PENTAX" instead of the "AOC" maker notes
|
2289
|
+
# in JPG images (needed when copying maker notes from DNG to JPG)
|
2290
|
+
Condition => '$$valPt =~ /^(PENTAX |SAMSUNG)\0/',
|
2291
|
+
Name => 'MakerNotePentax5',
|
2292
|
+
MakerNotes => 1,
|
2293
|
+
Binary => 1,
|
2294
|
+
SubDirectory => {
|
2295
|
+
TagTable => 'Image::ExifTool::Pentax::Main',
|
2296
|
+
Start => '$valuePtr + 10',
|
2297
|
+
Base => '$start - 10',
|
2298
|
+
ByteOrder => 'Unknown',
|
2299
|
+
},
|
2300
|
+
Format => 'undef',
|
2301
|
+
},
|
2302
|
+
{
|
2303
|
+
Name => 'DNGPrivateData',
|
2304
|
+
Flags => [ 'Binary', 'Protected' ],
|
2305
|
+
Format => 'undef',
|
2306
|
+
Writable => 'undef',
|
2307
|
+
WriteGroup => 'IFD0',
|
2308
|
+
},
|
2309
|
+
],
|
2310
|
+
0xc635 => {
|
2311
|
+
Name => 'MakerNoteSafety',
|
2312
|
+
PrintConv => {
|
2313
|
+
0 => 'Unsafe',
|
2314
|
+
1 => 'Safe',
|
2315
|
+
},
|
2316
|
+
},
|
2317
|
+
0xc640 => { #15
|
2318
|
+
Name => 'RawImageSegmentation',
|
2319
|
+
# (int16u[3], not writable)
|
2320
|
+
Notes => q{
|
2321
|
+
used in segmented Canon CR2 images. 3 numbers: 1. Number of segments minus
|
2322
|
+
one; 2. Pixel width of segments except last; 3. Pixel width of last segment
|
2323
|
+
},
|
2324
|
+
},
|
2325
|
+
0xc65a => {
|
2326
|
+
Name => 'CalibrationIlluminant1',
|
2327
|
+
SeparateTable => 'LightSource',
|
2328
|
+
PrintConv => \%lightSource,
|
2329
|
+
},
|
2330
|
+
0xc65b => {
|
2331
|
+
Name => 'CalibrationIlluminant2',
|
2332
|
+
SeparateTable => 'LightSource',
|
2333
|
+
PrintConv => \%lightSource,
|
2334
|
+
},
|
2335
|
+
0xc65c => 'BestQualityScale',
|
2336
|
+
0xc65d => {
|
2337
|
+
Name => 'RawDataUniqueID',
|
2338
|
+
Format => 'undef',
|
2339
|
+
ValueConv => 'uc(unpack("H*",$val))',
|
2340
|
+
},
|
2341
|
+
0xc660 => { #3
|
2342
|
+
Name => 'AliasLayerMetadata',
|
2343
|
+
Notes => 'used by Alias Sketchbook Pro',
|
2344
|
+
},
|
2345
|
+
0xc68b => {
|
2346
|
+
Name => 'OriginalRawFileName',
|
2347
|
+
Format => 'string', # sometimes written as int8u
|
2348
|
+
},
|
2349
|
+
0xc68c => {
|
2350
|
+
Name => 'OriginalRawFileData', # (writable directory!)
|
2351
|
+
Writable => 'undef', # must be defined here so tag will be extracted if specified
|
2352
|
+
WriteGroup => 'IFD0',
|
2353
|
+
Flags => [ 'Binary', 'Protected' ],
|
2354
|
+
SubDirectory => {
|
2355
|
+
TagTable => 'Image::ExifTool::DNG::OriginalRaw',
|
2356
|
+
},
|
2357
|
+
},
|
2358
|
+
0xc68d => 'ActiveArea',
|
2359
|
+
0xc68e => 'MaskedAreas',
|
2360
|
+
0xc68f => {
|
2361
|
+
Name => 'AsShotICCProfile',
|
2362
|
+
Binary => 1,
|
2363
|
+
Writable => 'undef', # must be defined here so tag will be extracted if specified
|
2364
|
+
SubDirectory => {
|
2365
|
+
DirName => 'AsShotICCProfile',
|
2366
|
+
TagTable => 'Image::ExifTool::ICC_Profile::Main',
|
2367
|
+
},
|
2368
|
+
},
|
2369
|
+
0xc690 => 'AsShotPreProfileMatrix',
|
2370
|
+
0xc691 => {
|
2371
|
+
Name => 'CurrentICCProfile',
|
2372
|
+
Binary => 1,
|
2373
|
+
Writable => 'undef', # must be defined here so tag will be extracted if specified
|
2374
|
+
SubDirectory => {
|
2375
|
+
DirName => 'CurrentICCProfile',
|
2376
|
+
TagTable => 'Image::ExifTool::ICC_Profile::Main',
|
2377
|
+
},
|
2378
|
+
},
|
2379
|
+
0xc692 => 'CurrentPreProfileMatrix',
|
2380
|
+
0xc6bf => 'ColorimetricReference',
|
2381
|
+
0xc6d2 => { #JD (Panasonic DMC-TZ5)
|
2382
|
+
# this text is UTF-8 encoded (hooray!) - PH (TZ5)
|
2383
|
+
Name => 'PanasonicTitle',
|
2384
|
+
Format => 'string', # written incorrectly as 'undef'
|
2385
|
+
Notes => 'proprietary Panasonic tag used for baby/pet name, etc',
|
2386
|
+
# panasonic always records this tag (64 zero bytes),
|
2387
|
+
# so ignore it unless it contains valid information
|
2388
|
+
RawConv => 'length($val) ? $val : undef',
|
2389
|
+
ValueConv => '$self->Decode($val, "UTF8")',
|
2390
|
+
},
|
2391
|
+
0xc6d3 => { #PH (Panasonic DMC-FS7)
|
2392
|
+
Name => 'PanasonicTitle2',
|
2393
|
+
Format => 'string', # written incorrectly as 'undef'
|
2394
|
+
Notes => 'proprietary Panasonic tag used for baby/pet name with age',
|
2395
|
+
# panasonic always records this tag (128 zero bytes),
|
2396
|
+
# so ignore it unless it contains valid information
|
2397
|
+
RawConv => 'length($val) ? $val : undef',
|
2398
|
+
ValueConv => '$self->Decode($val, "UTF8")',
|
2399
|
+
},
|
2400
|
+
0xc6f3 => 'CameraCalibrationSig',
|
2401
|
+
0xc6f4 => 'ProfileCalibrationSig',
|
2402
|
+
0xc6f5 => {
|
2403
|
+
Name => 'ProfileIFD', # (ExtraCameraProfiles)
|
2404
|
+
Groups => { 1 => 'ProfileIFD' },
|
2405
|
+
Flags => 'SubIFD',
|
2406
|
+
SubDirectory => {
|
2407
|
+
ProcessProc => \&ProcessTiffIFD,
|
2408
|
+
WriteProc => \&ProcessTiffIFD,
|
2409
|
+
DirName => 'ProfileIFD',
|
2410
|
+
Start => '$val',
|
2411
|
+
Base => '$start', # offsets relative to start of TIFF-like header
|
2412
|
+
MaxSubdirs => 10,
|
2413
|
+
Magic => 0x4352, # magic number for TIFF-like header
|
2414
|
+
},
|
2415
|
+
},
|
2416
|
+
0xc6f6 => 'AsShotProfileName',
|
2417
|
+
0xc6f7 => 'NoiseReductionApplied',
|
2418
|
+
0xc6f8 => 'ProfileName',
|
2419
|
+
0xc6f9 => 'ProfileHueSatMapDims',
|
2420
|
+
0xc6fa => { Name => 'ProfileHueSatMapData1', %longBin },
|
2421
|
+
0xc6fb => { Name => 'ProfileHueSatMapData2', %longBin },
|
2422
|
+
0xc6fc => {
|
2423
|
+
Name => 'ProfileToneCurve',
|
2424
|
+
Binary => 1,
|
2425
|
+
},
|
2426
|
+
0xc6fd => {
|
2427
|
+
Name => 'ProfileEmbedPolicy',
|
2428
|
+
PrintConv => {
|
2429
|
+
0 => 'Allow Copying',
|
2430
|
+
1 => 'Embed if Used',
|
2431
|
+
2 => 'Never Embed',
|
2432
|
+
3 => 'No Restrictions',
|
2433
|
+
},
|
2434
|
+
},
|
2435
|
+
0xc6fe => 'ProfileCopyright',
|
2436
|
+
0xc714 => 'ForwardMatrix1',
|
2437
|
+
0xc715 => 'ForwardMatrix2',
|
2438
|
+
0xc716 => 'PreviewApplicationName',
|
2439
|
+
0xc717 => 'PreviewApplicationVersion',
|
2440
|
+
0xc718 => 'PreviewSettingsName',
|
2441
|
+
0xc719 => {
|
2442
|
+
Name => 'PreviewSettingsDigest',
|
2443
|
+
Format => 'undef',
|
2444
|
+
ValueConv => 'unpack("H*", $val)',
|
2445
|
+
},
|
2446
|
+
0xc71a => 'PreviewColorSpace',
|
2447
|
+
0xc71b => {
|
2448
|
+
Name => 'PreviewDateTime',
|
2449
|
+
Groups => { 2 => 'Time' },
|
2450
|
+
ValueConv => q{
|
2451
|
+
require Image::ExifTool::XMP;
|
2452
|
+
return Image::ExifTool::XMP::ConvertXMPDate($val);
|
2453
|
+
},
|
2454
|
+
},
|
2455
|
+
0xc71c => {
|
2456
|
+
Name => 'RawImageDigest',
|
2457
|
+
Format => 'undef',
|
2458
|
+
ValueConv => 'unpack("H*", $val)',
|
2459
|
+
},
|
2460
|
+
0xc71d => {
|
2461
|
+
Name => 'OriginalRawFileDigest',
|
2462
|
+
Format => 'undef',
|
2463
|
+
ValueConv => 'unpack("H*", $val)',
|
2464
|
+
},
|
2465
|
+
0xc71e => 'SubTileBlockSize',
|
2466
|
+
0xc71f => 'RowInterleaveFactor',
|
2467
|
+
0xc725 => 'ProfileLookTableDims',
|
2468
|
+
0xc726 => {
|
2469
|
+
Name => 'ProfileLookTableData',
|
2470
|
+
Binary => 1,
|
2471
|
+
},
|
2472
|
+
0xc740 => { # DNG 1.3
|
2473
|
+
Name => 'OpcodeList1',
|
2474
|
+
Binary => 1,
|
2475
|
+
# opcodes:
|
2476
|
+
# 1 => 'WarpRectilinear',
|
2477
|
+
# 2 => 'WarpFisheye',
|
2478
|
+
# 3 => 'FixVignetteRadial',
|
2479
|
+
# 4 => 'FixBadPixelsConstant',
|
2480
|
+
# 5 => 'FixBadPixelsList',
|
2481
|
+
# 6 => 'TrimBounds',
|
2482
|
+
# 7 => 'MapTable',
|
2483
|
+
# 8 => 'MapPolynomial',
|
2484
|
+
# 9 => 'GainMap',
|
2485
|
+
# 10 => 'DeltaPerRow',
|
2486
|
+
# 11 => 'DeltaPerColumn',
|
2487
|
+
# 12 => 'ScalePerRow',
|
2488
|
+
# 13 => 'ScalePerColumn',
|
2489
|
+
},
|
2490
|
+
0xc741 => { # DNG 1.3
|
2491
|
+
Name => 'OpcodeList2',
|
2492
|
+
Binary => 1,
|
2493
|
+
},
|
2494
|
+
0xc74e => { # DNG 1.3
|
2495
|
+
Name => 'OpcodeList3',
|
2496
|
+
Binary => 1,
|
2497
|
+
},
|
2498
|
+
0xc761 => 'NoiseProfile', # DNG 1.3
|
2499
|
+
0xc763 => { #28
|
2500
|
+
Name => 'TimeCodes',
|
2501
|
+
ValueConv => q{
|
2502
|
+
my @a = split ' ', $val;
|
2503
|
+
my @v;
|
2504
|
+
push @v, join('.', map { sprintf('%.2x',$_) } splice(@a,0,8)) while @a >= 8;
|
2505
|
+
join ' ', @v;
|
2506
|
+
},
|
2507
|
+
# Note: Currently ignore the flags:
|
2508
|
+
# byte 0 0x80 - color frame
|
2509
|
+
# byte 0 0x40 - drop frame
|
2510
|
+
# byte 1 0x80 - field phase
|
2511
|
+
PrintConv => q{
|
2512
|
+
my @a = map hex, split /[. ]+/, $val;
|
2513
|
+
my @v;
|
2514
|
+
while (@a >= 8) {
|
2515
|
+
my $str = sprintf("%.2x:%.2x:%.2x.%.2x", $a[3]&0x3f,
|
2516
|
+
$a[2]&0x7f, $a[1]&0x7f, $a[0]&0x3f);
|
2517
|
+
if ($a[3] & 0x80) { # date+timezone exist if BGF2 is set
|
2518
|
+
my $tz = $a[7] & 0x3f;
|
2519
|
+
my $bz = sprintf('%.2x', $tz);
|
2520
|
+
$bz = 100 if $bz =~ /[a-f]/i; # not BCD
|
2521
|
+
if ($bz < 26) {
|
2522
|
+
$tz = ($bz < 13 ? 0 : 26) - $bz;
|
2523
|
+
} elsif ($bz == 32) {
|
2524
|
+
$tz = 12.75;
|
2525
|
+
} elsif ($bz >= 28 and $bz <= 31) {
|
2526
|
+
$tz = 0; # UTC
|
2527
|
+
} elsif ($bz < 100) {
|
2528
|
+
undef $tz; # undefined or user-defined
|
2529
|
+
} elsif ($tz < 0x20) {
|
2530
|
+
$tz = (($tz < 0x10 ? 10 : 20) - $tz) - 0.5;
|
2531
|
+
} else {
|
2532
|
+
$tz = (($tz < 0x30 ? 53 : 63) - $tz) + 0.5;
|
2533
|
+
}
|
2534
|
+
if ($a[7] & 0x80) { # MJD format (/w UTC time)
|
2535
|
+
my ($h,$m,$s,$f) = split /[:.]/, $str;
|
2536
|
+
my $jday = sprintf('%x%.2x%.2x', reverse @a[4..6]);
|
2537
|
+
$str = ConvertUnixTime(($jday - 40587) * 24 * 3600
|
2538
|
+
+ ((($h+$tz) * 60) + $m) * 60 + $s) . ".$f";
|
2539
|
+
$str =~ s/^(\d+):(\d+):(\d+) /$1-$2-${3}T/;
|
2540
|
+
} else { # YYMMDD (Note: CinemaDNG 1.1 example seems wrong)
|
2541
|
+
my $yr = sprintf('%.2x',$a[6]) + 1900;
|
2542
|
+
$yr += 100 if $yr < 1970;
|
2543
|
+
$str = sprintf('%d-%.2x-%.2xT%s',$yr,$a[5],$a[4],$str);
|
2544
|
+
}
|
2545
|
+
$str .= TimeZoneString($tz*60) if defined $tz;
|
2546
|
+
}
|
2547
|
+
push @v, $str;
|
2548
|
+
splice @a, 0, 8;
|
2549
|
+
}
|
2550
|
+
join ' ', @v;
|
2551
|
+
},
|
2552
|
+
},
|
2553
|
+
0xc764 => { #28
|
2554
|
+
Name => 'FrameRate',
|
2555
|
+
PrintConv => 'int($val * 1000 + 0.5) / 1000',
|
2556
|
+
},
|
2557
|
+
0xc772 => { #28
|
2558
|
+
Name => 'TStop',
|
2559
|
+
PrintConv => 'join("-", map { sprintf("%.2f",$_) } split " ", $val)',
|
2560
|
+
},
|
2561
|
+
0xc789 => 'ReelName', #28
|
2562
|
+
0xc791 => 'OriginalDefaultFinalSize', # DNG 1.4
|
2563
|
+
0xc792 => { # DNG 1.4
|
2564
|
+
Name => 'OriginalBestQualitySize',
|
2565
|
+
Notes => 'called OriginalBestQualityFinalSize by the DNG spec',
|
2566
|
+
},
|
2567
|
+
0xc793 => 'OriginalDefaultCropSize', # DNG 1.4
|
2568
|
+
0xc7a1 => 'CameraLabel', #28
|
2569
|
+
0xc7a3 => { # DNG 1.4
|
2570
|
+
Name => 'ProfileHueSatMapEncoding',
|
2571
|
+
PrintConv => {
|
2572
|
+
0 => 'Linear',
|
2573
|
+
1 => 'sRGB',
|
2574
|
+
},
|
2575
|
+
},
|
2576
|
+
0xc7a4 => { # DNG 1.4
|
2577
|
+
Name => 'ProfileLookTableEncoding',
|
2578
|
+
PrintConv => {
|
2579
|
+
0 => 'Linear',
|
2580
|
+
1 => 'sRGB',
|
2581
|
+
},
|
2582
|
+
},
|
2583
|
+
0xc7a5 => 'BaselineExposureOffset', # DNG 1.4
|
2584
|
+
0xc7a6 => { # DNG 1.4
|
2585
|
+
Name => 'DefaultBlackRender',
|
2586
|
+
PrintConv => {
|
2587
|
+
0 => 'Auto',
|
2588
|
+
1 => 'None',
|
2589
|
+
},
|
2590
|
+
},
|
2591
|
+
0xc7a7 => { # DNG 1.4
|
2592
|
+
Name => 'NewRawImageDigest',
|
2593
|
+
Format => 'undef',
|
2594
|
+
ValueConv => 'unpack("H*", $val)',
|
2595
|
+
},
|
2596
|
+
0xc7a8 => 'RawToPreviewGain', # DNG 1.4
|
2597
|
+
# 0xc7aa - undocumented DNG tag written by LR4 (int32u[1] - val=256, related to fast load data?)
|
2598
|
+
0xc7b5 => 'DefaultUserCrop', # DNG 1.4
|
2599
|
+
0xea1c => { #13
|
2600
|
+
Name => 'Padding',
|
2601
|
+
Binary => 1,
|
2602
|
+
Writable => 'undef',
|
2603
|
+
# must start with 0x1c 0xea by the WM Photo specification
|
2604
|
+
# (not sure what should happen if padding is only 1 byte)
|
2605
|
+
# (why does MicrosoftPhoto write "1c ea 00 00 00 08"?)
|
2606
|
+
RawConvInv => '$val=~s/^../\x1c\xea/s; $val',
|
2607
|
+
},
|
2608
|
+
0xea1d => {
|
2609
|
+
Name => 'OffsetSchema',
|
2610
|
+
Notes => "Microsoft's ill-conceived maker note offset difference",
|
2611
|
+
# From the Microsoft documentation:
|
2612
|
+
#
|
2613
|
+
# Any time the "Maker Note" is relocated by Windows, the Exif MakerNote
|
2614
|
+
# tag (37500) is updated automatically to reference the new location. In
|
2615
|
+
# addition, Windows records the offset (or difference) between the old and
|
2616
|
+
# new locations in the Exif OffsetSchema tag (59933). If the "Maker Note"
|
2617
|
+
# contains relative references, the developer can add the value in
|
2618
|
+
# OffsetSchema to the original references to find the correct information.
|
2619
|
+
#
|
2620
|
+
# My recommendation is for other developers to ignore this tag because the
|
2621
|
+
# information it contains is unreliable. It will be wrong if the image has
|
2622
|
+
# been subsequently edited by another application that doesn't recognize the
|
2623
|
+
# new Microsoft tag.
|
2624
|
+
#
|
2625
|
+
# The new tag unfortunately only gives the difference between the new maker
|
2626
|
+
# note offset and the original offset. Instead, it should have been designed
|
2627
|
+
# to store the original offset. The new offset may change if the image is
|
2628
|
+
# edited, which will invalidate the tag as currently written. If instead the
|
2629
|
+
# original offset had been stored, the new difference could be easily
|
2630
|
+
# calculated because the new maker note offset is known.
|
2631
|
+
#
|
2632
|
+
# I exchanged emails with a Microsoft technical representative, pointing out
|
2633
|
+
# this problem shortly after they released the update (Feb 2007), but so far
|
2634
|
+
# they have taken no steps to address this.
|
2635
|
+
},
|
2636
|
+
|
2637
|
+
# tags in the range 0xfde8-0xfe58 have been observed in PS7 files
|
2638
|
+
# generated from RAW images. They are all strings with the
|
2639
|
+
# tag name at the start of the string. To accomodate these types
|
2640
|
+
# of tags, all tags with values above 0xf000 are handled specially
|
2641
|
+
# by ProcessExif().
|
2642
|
+
|
2643
|
+
0xfe00 => {
|
2644
|
+
Name => 'KDC_IFD',
|
2645
|
+
Groups => { 1 => 'KDC_IFD' },
|
2646
|
+
Flags => 'SubIFD',
|
2647
|
+
Notes => 'used in some Kodak KDC images',
|
2648
|
+
SubDirectory => {
|
2649
|
+
TagTable => 'Image::ExifTool::Kodak::KDC_IFD',
|
2650
|
+
DirName => 'KDC_IFD',
|
2651
|
+
Start => '$val',
|
2652
|
+
},
|
2653
|
+
},
|
2654
|
+
);
|
2655
|
+
|
2656
|
+
# EXIF Composite tags (plus other more general Composite tags)
|
2657
|
+
%Image::ExifTool::Exif::Composite = (
|
2658
|
+
GROUPS => { 2 => 'Image' },
|
2659
|
+
ImageSize => {
|
2660
|
+
Require => {
|
2661
|
+
0 => 'ImageWidth',
|
2662
|
+
1 => 'ImageHeight',
|
2663
|
+
},
|
2664
|
+
Desire => {
|
2665
|
+
2 => 'ExifImageWidth',
|
2666
|
+
3 => 'ExifImageHeight',
|
2667
|
+
},
|
2668
|
+
# use ExifImageWidth/Height only for Canon and Phase One TIFF-base RAW images
|
2669
|
+
ValueConv => q{
|
2670
|
+
return "$val[2]x$val[3]" if $val[2] and $val[3] and
|
2671
|
+
$$self{TIFF_TYPE} =~ /^(CR2|Canon 1D RAW|IIQ|EIP)$/;
|
2672
|
+
return "$val[0]x$val[1]";
|
2673
|
+
},
|
2674
|
+
},
|
2675
|
+
# pick the best shutter speed value
|
2676
|
+
ShutterSpeed => {
|
2677
|
+
Desire => {
|
2678
|
+
0 => 'ExposureTime',
|
2679
|
+
1 => 'ShutterSpeedValue',
|
2680
|
+
2 => 'BulbDuration',
|
2681
|
+
},
|
2682
|
+
ValueConv => '($val[2] and $val[2]>0) ? $val[2] : (defined($val[0]) ? $val[0] : $val[1])',
|
2683
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
2684
|
+
},
|
2685
|
+
Aperture => {
|
2686
|
+
Desire => {
|
2687
|
+
0 => 'FNumber',
|
2688
|
+
1 => 'ApertureValue',
|
2689
|
+
},
|
2690
|
+
RawConv => '($val[0] || $val[1]) ? $val : undef',
|
2691
|
+
ValueConv => '$val[0] || $val[1]',
|
2692
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
2693
|
+
},
|
2694
|
+
LightValue => {
|
2695
|
+
Notes => 'calculated LV -- similar to exposure value but normalized to ISO 100',
|
2696
|
+
Require => {
|
2697
|
+
0 => 'Aperture',
|
2698
|
+
1 => 'ShutterSpeed',
|
2699
|
+
2 => 'ISO',
|
2700
|
+
},
|
2701
|
+
ValueConv => 'Image::ExifTool::Exif::CalculateLV($val[0],$val[1],$prt[2])',
|
2702
|
+
PrintConv => 'sprintf("%.1f",$val)',
|
2703
|
+
},
|
2704
|
+
FocalLength35efl => { #26/PH
|
2705
|
+
Description => 'Focal Length',
|
2706
|
+
Notes => 'this value may be incorrect if the image has been resized',
|
2707
|
+
Groups => { 2 => 'Camera' },
|
2708
|
+
Require => {
|
2709
|
+
0 => 'FocalLength',
|
2710
|
+
},
|
2711
|
+
Desire => {
|
2712
|
+
1 => 'ScaleFactor35efl',
|
2713
|
+
},
|
2714
|
+
ValueConv => 'ToFloat(@val); ($val[0] || 0) * ($val[1] || 1)',
|
2715
|
+
PrintConv => '$val[1] ? sprintf("%.1f mm (35 mm equivalent: %.1f mm)", $val[0], $val) : sprintf("%.1f mm", $val)',
|
2716
|
+
},
|
2717
|
+
ScaleFactor35efl => { #26/PH
|
2718
|
+
Description => 'Scale Factor To 35 mm Equivalent',
|
2719
|
+
Notes => q{
|
2720
|
+
this value and any derived values may be incorrect if the image has been
|
2721
|
+
resized
|
2722
|
+
},
|
2723
|
+
Groups => { 2 => 'Camera' },
|
2724
|
+
Desire => {
|
2725
|
+
0 => 'FocalLength',
|
2726
|
+
1 => 'FocalLengthIn35mmFormat',
|
2727
|
+
2 => 'Composite:DigitalZoom',
|
2728
|
+
3 => 'FocalPlaneDiagonal',
|
2729
|
+
4 => 'SensorSize',
|
2730
|
+
5 => 'FocalPlaneXSize',
|
2731
|
+
6 => 'FocalPlaneYSize',
|
2732
|
+
7 => 'FocalPlaneResolutionUnit',
|
2733
|
+
8 => 'FocalPlaneXResolution',
|
2734
|
+
9 => 'FocalPlaneYResolution',
|
2735
|
+
10 => 'ExifImageWidth',
|
2736
|
+
11 => 'ExifImageHeight',
|
2737
|
+
12 => 'CanonImageWidth',
|
2738
|
+
13 => 'CanonImageHeight',
|
2739
|
+
14 => 'ImageWidth',
|
2740
|
+
15 => 'ImageHeight',
|
2741
|
+
},
|
2742
|
+
ValueConv => 'Image::ExifTool::Exif::CalcScaleFactor35efl($self, @val)',
|
2743
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
2744
|
+
},
|
2745
|
+
CircleOfConfusion => {
|
2746
|
+
Notes => q{
|
2747
|
+
calculated as D/1440, where D is the focal plane diagonal in mm. This value
|
2748
|
+
may be incorrect if the image has been resized
|
2749
|
+
},
|
2750
|
+
Groups => { 2 => 'Camera' },
|
2751
|
+
Require => 'ScaleFactor35efl',
|
2752
|
+
ValueConv => 'sqrt(24*24+36*36) / ($val * 1440)',
|
2753
|
+
PrintConv => 'sprintf("%.3f mm",$val)',
|
2754
|
+
},
|
2755
|
+
HyperfocalDistance => {
|
2756
|
+
Notes => 'this value may be incorrect if the image has been resized',
|
2757
|
+
Groups => { 2 => 'Camera' },
|
2758
|
+
Require => {
|
2759
|
+
0 => 'FocalLength',
|
2760
|
+
1 => 'Aperture',
|
2761
|
+
2 => 'CircleOfConfusion',
|
2762
|
+
},
|
2763
|
+
ValueConv => q{
|
2764
|
+
ToFloat(@val);
|
2765
|
+
return 'inf' unless $val[1] and $val[2];
|
2766
|
+
return $val[0] * $val[0] / ($val[1] * $val[2] * 1000);
|
2767
|
+
},
|
2768
|
+
PrintConv => 'sprintf("%.2f m", $val)',
|
2769
|
+
},
|
2770
|
+
DOF => {
|
2771
|
+
Description => 'Depth Of Field',
|
2772
|
+
Notes => 'this value may be incorrect if the image has been resized',
|
2773
|
+
Require => {
|
2774
|
+
0 => 'FocalLength',
|
2775
|
+
1 => 'Aperture',
|
2776
|
+
2 => 'CircleOfConfusion',
|
2777
|
+
},
|
2778
|
+
Desire => {
|
2779
|
+
3 => 'FocusDistance', # focus distance in metres (0 is infinity)
|
2780
|
+
4 => 'SubjectDistance',
|
2781
|
+
5 => 'ObjectDistance',
|
2782
|
+
},
|
2783
|
+
ValueConv => q{
|
2784
|
+
ToFloat(@val);
|
2785
|
+
my ($d, $f) = ($val[3], $val[0]);
|
2786
|
+
if (defined $d) {
|
2787
|
+
$d or $d = 1e10; # (use large number for infinity)
|
2788
|
+
} else {
|
2789
|
+
$d = $val[4] || $val[5];
|
2790
|
+
return undef unless defined $d;
|
2791
|
+
}
|
2792
|
+
return 0 unless $f and $val[2];
|
2793
|
+
my $t = $val[1] * $val[2] * ($d * 1000 - $f) / ($f * $f);
|
2794
|
+
my @v = ($d / (1 + $t), $d / (1 - $t));
|
2795
|
+
$v[1] < 0 and $v[1] = 0; # 0 means 'inf'
|
2796
|
+
return join(' ',@v);
|
2797
|
+
},
|
2798
|
+
PrintConv => q{
|
2799
|
+
$val =~ tr/,/./; # in case locale is whacky
|
2800
|
+
my @v = split ' ', $val;
|
2801
|
+
$v[1] or return sprintf("inf (%.2f m - inf)", $v[0]);
|
2802
|
+
my $dof = $v[1] - $v[0];
|
2803
|
+
my $fmt = ($dof>0 and $dof<0.02) ? "%.3f" : "%.2f";
|
2804
|
+
return sprintf("$fmt m ($fmt - $fmt)",$dof,$v[0],$v[1]);
|
2805
|
+
},
|
2806
|
+
},
|
2807
|
+
FOV => {
|
2808
|
+
Description => 'Field Of View',
|
2809
|
+
Notes => q{
|
2810
|
+
calculated for the long image dimension. This value may be incorrect for
|
2811
|
+
fisheye lenses, or if the image has been resized
|
2812
|
+
},
|
2813
|
+
Require => {
|
2814
|
+
0 => 'FocalLength',
|
2815
|
+
1 => 'ScaleFactor35efl',
|
2816
|
+
},
|
2817
|
+
Desire => {
|
2818
|
+
2 => 'FocusDistance', # (multiply by 1000 to convert to mm)
|
2819
|
+
},
|
2820
|
+
# ref http://www.bobatkins.com/photography/technical/field_of_view.html
|
2821
|
+
# (calculations below apply to rectilinear lenses only, not fisheye)
|
2822
|
+
ValueConv => q{
|
2823
|
+
ToFloat(@val);
|
2824
|
+
return undef unless $val[0] and $val[1];
|
2825
|
+
my $corr = 1;
|
2826
|
+
if ($val[2]) {
|
2827
|
+
my $d = 1000 * $val[2] - $val[0];
|
2828
|
+
$corr += $val[0]/$d if $d > 0;
|
2829
|
+
}
|
2830
|
+
my $fd2 = atan2(36, 2*$val[0]*$val[1]*$corr);
|
2831
|
+
my @fov = ( $fd2 * 360 / 3.14159 );
|
2832
|
+
if ($val[2] and $val[2] > 0 and $val[2] < 10000) {
|
2833
|
+
push @fov, 2 * $val[2] * sin($fd2) / cos($fd2);
|
2834
|
+
}
|
2835
|
+
return join(' ', @fov);
|
2836
|
+
},
|
2837
|
+
PrintConv => q{
|
2838
|
+
my @v = split(' ',$val);
|
2839
|
+
my $str = sprintf("%.1f deg", $v[0]);
|
2840
|
+
$str .= sprintf(" (%.2f m)", $v[1]) if $v[1];
|
2841
|
+
return $str;
|
2842
|
+
},
|
2843
|
+
},
|
2844
|
+
# generate DateTimeOriginal from Date and Time Created if not extracted already
|
2845
|
+
DateTimeOriginal => {
|
2846
|
+
Condition => 'not defined $$self{VALUE}{DateTimeOriginal}',
|
2847
|
+
Description => 'Date/Time Original',
|
2848
|
+
Groups => { 2 => 'Time' },
|
2849
|
+
Desire => {
|
2850
|
+
0 => 'DateTimeCreated',
|
2851
|
+
1 => 'DateCreated',
|
2852
|
+
2 => 'TimeCreated',
|
2853
|
+
},
|
2854
|
+
RawConv => '($val[1] and $val[2]) ? $val : undef',
|
2855
|
+
ValueConv => q{
|
2856
|
+
return $val[0] if $val[0] and $val[0]=~/ /;
|
2857
|
+
return "$val[1] $val[2]";
|
2858
|
+
},
|
2859
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
2860
|
+
},
|
2861
|
+
ThumbnailImage => {
|
2862
|
+
Writable => 1,
|
2863
|
+
WriteCheck => '$self->CheckImage(\$val)',
|
2864
|
+
WriteAlso => {
|
2865
|
+
# (the 0xfeedfeed values are translated in the Exif write routine)
|
2866
|
+
ThumbnailOffset => 'defined $val ? 0xfeedfeed : undef',
|
2867
|
+
ThumbnailLength => 'defined $val ? 0xfeedfeed : undef',
|
2868
|
+
},
|
2869
|
+
Require => {
|
2870
|
+
0 => 'ThumbnailOffset',
|
2871
|
+
1 => 'ThumbnailLength',
|
2872
|
+
},
|
2873
|
+
# retrieve the thumbnail from our EXIF data
|
2874
|
+
RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ThumbnailImage")',
|
2875
|
+
},
|
2876
|
+
PreviewImage => {
|
2877
|
+
Writable => 1,
|
2878
|
+
WriteCheck => '$self->CheckImage(\$val)',
|
2879
|
+
DelCheck => '$val = ""; return undef', # can't delete, so set to empty string
|
2880
|
+
WriteAlso => {
|
2881
|
+
PreviewImageStart => 'defined $val ? 0xfeedfeed : undef',
|
2882
|
+
PreviewImageLength => 'defined $val ? 0xfeedfeed : undef',
|
2883
|
+
PreviewImageValid => 'defined $val and length $val ? 1 : 0',
|
2884
|
+
},
|
2885
|
+
Require => {
|
2886
|
+
0 => 'PreviewImageStart',
|
2887
|
+
1 => 'PreviewImageLength',
|
2888
|
+
},
|
2889
|
+
Desire => {
|
2890
|
+
2 => 'PreviewImageValid',
|
2891
|
+
# (DNG and A100 ARW may be have 2 preview images)
|
2892
|
+
3 => 'PreviewImageStart (1)',
|
2893
|
+
4 => 'PreviewImageLength (1)',
|
2894
|
+
},
|
2895
|
+
# note: extract 2nd preview, but ignore double-referenced preview
|
2896
|
+
# (in A100 ARW images, the 2nd PreviewImageLength from IFD0 may be wrong anyway)
|
2897
|
+
RawConv => q{
|
2898
|
+
if ($val[3] and $val[4] and $val[0] ne $val[3]) {
|
2899
|
+
my %val = (
|
2900
|
+
0 => 'PreviewImageStart (1)',
|
2901
|
+
1 => 'PreviewImageLength (1)',
|
2902
|
+
2 => 'PreviewImageValid',
|
2903
|
+
);
|
2904
|
+
$self->FoundTag($tagInfo, \%val);
|
2905
|
+
}
|
2906
|
+
return undef if defined $val[2] and not $val[2];
|
2907
|
+
return Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],'PreviewImage');
|
2908
|
+
},
|
2909
|
+
},
|
2910
|
+
JpgFromRaw => {
|
2911
|
+
Writable => 1,
|
2912
|
+
WriteCheck => '$self->CheckImage(\$val)',
|
2913
|
+
WriteAlso => {
|
2914
|
+
JpgFromRawStart => 'defined $val ? 0xfeedfeed : undef',
|
2915
|
+
JpgFromRawLength => 'defined $val ? 0xfeedfeed : undef',
|
2916
|
+
},
|
2917
|
+
Require => {
|
2918
|
+
0 => 'JpgFromRawStart',
|
2919
|
+
1 => 'JpgFromRawLength',
|
2920
|
+
},
|
2921
|
+
RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"JpgFromRaw")',
|
2922
|
+
},
|
2923
|
+
OtherImage => {
|
2924
|
+
Writable => 1,
|
2925
|
+
WriteCheck => '$self->CheckImage(\$val)',
|
2926
|
+
DelCheck => '$val = ""; return undef', # can't delete, so set to empty string
|
2927
|
+
WriteAlso => {
|
2928
|
+
OtherImageStart => 'defined $val ? 0xfeedfeed : undef',
|
2929
|
+
OtherImageLength => 'defined $val ? 0xfeedfeed : undef',
|
2930
|
+
},
|
2931
|
+
Require => {
|
2932
|
+
0 => 'OtherImageStart',
|
2933
|
+
1 => 'OtherImageLength',
|
2934
|
+
},
|
2935
|
+
# retrieve the thumbnail from our EXIF data
|
2936
|
+
RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"OtherImage")',
|
2937
|
+
},
|
2938
|
+
PreviewImageSize => {
|
2939
|
+
Require => {
|
2940
|
+
0 => 'PreviewImageWidth',
|
2941
|
+
1 => 'PreviewImageHeight',
|
2942
|
+
},
|
2943
|
+
ValueConv => '"$val[0]x$val[1]"',
|
2944
|
+
},
|
2945
|
+
SubSecDateTimeOriginal => {
|
2946
|
+
Description => 'Date/Time Original',
|
2947
|
+
Groups => { 2 => 'Time' },
|
2948
|
+
Require => {
|
2949
|
+
0 => 'EXIF:DateTimeOriginal',
|
2950
|
+
1 => 'SubSecTimeOriginal',
|
2951
|
+
},
|
2952
|
+
# be careful here just in case there is a timezone following the seconds
|
2953
|
+
RawConv => '$val[1]=~/\d/ ? $val : undef',
|
2954
|
+
ValueConv => q{
|
2955
|
+
$_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
|
2956
|
+
},
|
2957
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
2958
|
+
},
|
2959
|
+
SubSecCreateDate => {
|
2960
|
+
Description => 'Create Date',
|
2961
|
+
Groups => { 2 => 'Time' },
|
2962
|
+
Require => {
|
2963
|
+
0 => 'EXIF:CreateDate',
|
2964
|
+
1 => 'SubSecTimeDigitized',
|
2965
|
+
},
|
2966
|
+
RawConv => '$val[1]=~/\d/ ? $val : undef',
|
2967
|
+
ValueConv => q{
|
2968
|
+
$_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
|
2969
|
+
},
|
2970
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
2971
|
+
},
|
2972
|
+
SubSecModifyDate => {
|
2973
|
+
Description => 'Modify Date',
|
2974
|
+
Groups => { 2 => 'Time' },
|
2975
|
+
Require => {
|
2976
|
+
0 => 'EXIF:ModifyDate',
|
2977
|
+
1 => 'SubSecTime',
|
2978
|
+
},
|
2979
|
+
RawConv => '$val[1]=~/\d/ ? $val : undef',
|
2980
|
+
ValueConv => q{
|
2981
|
+
$_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
|
2982
|
+
},
|
2983
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
2984
|
+
},
|
2985
|
+
CFAPattern => {
|
2986
|
+
Require => {
|
2987
|
+
0 => 'CFARepeatPatternDim',
|
2988
|
+
1 => 'CFAPattern2',
|
2989
|
+
},
|
2990
|
+
# generate CFAPattern
|
2991
|
+
ValueConv => q{
|
2992
|
+
my @a = split / /, $val[0];
|
2993
|
+
my @b = split / /, $val[1];
|
2994
|
+
return '?' unless @a==2 and @b==$a[0]*$a[1];
|
2995
|
+
return "$a[0] $a[1] @b";
|
2996
|
+
},
|
2997
|
+
PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)',
|
2998
|
+
},
|
2999
|
+
RedBalance => {
|
3000
|
+
Groups => { 2 => 'Camera' },
|
3001
|
+
Desire => {
|
3002
|
+
0 => 'WB_RGGBLevels',
|
3003
|
+
1 => 'WB_RGBGLevels',
|
3004
|
+
2 => 'WB_RBGGLevels',
|
3005
|
+
3 => 'WB_GRBGLevels',
|
3006
|
+
4 => 'WB_GRGBLevels',
|
3007
|
+
5 => 'WB_GBRGLevels',
|
3008
|
+
6 => 'WB_RGBLevels',
|
3009
|
+
7 => 'WB_GRBLevels',
|
3010
|
+
8 => 'WB_RBLevels',
|
3011
|
+
9 => 'WBRedLevel', # red
|
3012
|
+
10 => 'WBGreenLevel',
|
3013
|
+
},
|
3014
|
+
ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(0,@val)',
|
3015
|
+
PrintConv => 'int($val * 1e6 + 0.5) * 1e-6',
|
3016
|
+
},
|
3017
|
+
BlueBalance => {
|
3018
|
+
Groups => { 2 => 'Camera' },
|
3019
|
+
Desire => {
|
3020
|
+
0 => 'WB_RGGBLevels',
|
3021
|
+
1 => 'WB_RGBGLevels',
|
3022
|
+
2 => 'WB_RBGGLevels',
|
3023
|
+
3 => 'WB_GRBGLevels',
|
3024
|
+
4 => 'WB_GRGBLevels',
|
3025
|
+
5 => 'WB_GBRGLevels',
|
3026
|
+
6 => 'WB_RGBLevels',
|
3027
|
+
7 => 'WB_GRBLevels',
|
3028
|
+
8 => 'WB_RBLevels',
|
3029
|
+
9 => 'WBBlueLevel', # blue
|
3030
|
+
10 => 'WBGreenLevel',
|
3031
|
+
},
|
3032
|
+
ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(1,@val)',
|
3033
|
+
PrintConv => 'int($val * 1e6 + 0.5) * 1e-6',
|
3034
|
+
},
|
3035
|
+
GPSPosition => {
|
3036
|
+
Groups => { 2 => 'Location' },
|
3037
|
+
Require => {
|
3038
|
+
0 => 'GPSLatitude',
|
3039
|
+
1 => 'GPSLongitude',
|
3040
|
+
},
|
3041
|
+
ValueConv => '"$val[0] $val[1]"',
|
3042
|
+
PrintConv => '"$prt[0], $prt[1]"',
|
3043
|
+
},
|
3044
|
+
LensID => {
|
3045
|
+
Groups => { 2 => 'Camera' },
|
3046
|
+
Require => {
|
3047
|
+
0 => 'LensType',
|
3048
|
+
},
|
3049
|
+
Desire => {
|
3050
|
+
1 => 'FocalLength',
|
3051
|
+
2 => 'MaxAperture',
|
3052
|
+
3 => 'MaxApertureValue',
|
3053
|
+
4 => 'MinFocalLength',
|
3054
|
+
5 => 'MaxFocalLength',
|
3055
|
+
6 => 'LensModel',
|
3056
|
+
7 => 'LensFocalRange',
|
3057
|
+
8 => 'LensSpec',
|
3058
|
+
9 => 'LensType2',
|
3059
|
+
},
|
3060
|
+
Notes => q{
|
3061
|
+
attempt to identify the actual lens from all lenses with a given LensType.
|
3062
|
+
Applies only to LensType values with a lookup table. May be configured
|
3063
|
+
by adding user-defined lenses
|
3064
|
+
},
|
3065
|
+
# this LensID is only valid if the LensType has a PrintConv or is a model name
|
3066
|
+
RawConv => q{
|
3067
|
+
return $val if ref $$self{TAG_INFO}{LensType}{PrintConv} eq "HASH" or
|
3068
|
+
$val[0] =~ /(mm|\d\/F)/;
|
3069
|
+
return undef;
|
3070
|
+
},
|
3071
|
+
ValueConv => '$val',
|
3072
|
+
PrintConv => q{
|
3073
|
+
my $pcv;
|
3074
|
+
# use LensType2 instead of LensType if available and valid (Sony E-mount lenses)
|
3075
|
+
if ($val[9] and $val[9] & 0x8000) {
|
3076
|
+
$val[0] = $val[9];
|
3077
|
+
$prt[0] = $prt[9];
|
3078
|
+
$pcv = $$self{TAG_INFO}{LensType2}{PrintConv};
|
3079
|
+
}
|
3080
|
+
Image::ExifTool::Exif::PrintLensID($self, $prt[0], $pcv, $prt[8], @val);
|
3081
|
+
},
|
3082
|
+
},
|
3083
|
+
);
|
3084
|
+
|
3085
|
+
# table for unknown IFD entries
|
3086
|
+
%Image::ExifTool::Exif::Unknown = (
|
3087
|
+
GROUPS => { 0 => 'EXIF', 1 => 'UnknownIFD', 2 => 'Image'},
|
3088
|
+
WRITE_PROC => \&WriteExif,
|
3089
|
+
);
|
3090
|
+
|
3091
|
+
# add our composite tags
|
3092
|
+
Image::ExifTool::AddCompositeTags('Image::ExifTool::Exif');
|
3093
|
+
|
3094
|
+
|
3095
|
+
#------------------------------------------------------------------------------
|
3096
|
+
# AutoLoad our writer routines when necessary
|
3097
|
+
#
|
3098
|
+
sub AUTOLOAD
|
3099
|
+
{
|
3100
|
+
return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
|
3101
|
+
}
|
3102
|
+
|
3103
|
+
#------------------------------------------------------------------------------
|
3104
|
+
# Identify RAW file type for some TIFF-based formats using Compression value
|
3105
|
+
# Inputs: 0) ExifTool object reference, 1) Compression value
|
3106
|
+
# - sets TIFF_TYPE and FileType if identified
|
3107
|
+
sub IdentifyRawFile($$)
|
3108
|
+
{
|
3109
|
+
my ($et, $comp) = @_;
|
3110
|
+
if ($$et{FILE_TYPE} eq 'TIFF' and not $$et{IdentifiedRawFile}) {
|
3111
|
+
if ($compression{$comp} and $compression{$comp} =~ /^\w+ ([A-Z]{3}) Compressed$/) {
|
3112
|
+
$et->OverrideFileType($$et{TIFF_TYPE} = $1);
|
3113
|
+
$$et{IdentifiedRawFile} = 1;
|
3114
|
+
}
|
3115
|
+
}
|
3116
|
+
}
|
3117
|
+
|
3118
|
+
#------------------------------------------------------------------------------
|
3119
|
+
# Calculate LV (Light Value)
|
3120
|
+
# Inputs: 0) Aperture, 1) ShutterSpeed, 2) ISO
|
3121
|
+
# Returns: LV value (and converts input values to floating point if necessary)
|
3122
|
+
sub CalculateLV($$$)
|
3123
|
+
{
|
3124
|
+
local $_;
|
3125
|
+
# do validity checks on arguments
|
3126
|
+
return undef unless @_ >= 3;
|
3127
|
+
foreach (@_) {
|
3128
|
+
return undef unless $_ and /([+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)/ and $1 > 0;
|
3129
|
+
$_ = $1; # extract float from any other garbage
|
3130
|
+
}
|
3131
|
+
# (A light value of 0 is defined as f/1.0 at 1 second with ISO 100)
|
3132
|
+
return (2*log($_[0]) - log($_[1]) - log($_[2]/100)) / log(2);
|
3133
|
+
}
|
3134
|
+
|
3135
|
+
#------------------------------------------------------------------------------
|
3136
|
+
# Calculate scale factor for 35mm effective focal length (ref 26/PH)
|
3137
|
+
# Inputs: 0) ExifTool object ref
|
3138
|
+
# 1) Focal length
|
3139
|
+
# 2) Focal length in 35mm format
|
3140
|
+
# 3) Canon digital zoom factor
|
3141
|
+
# 4) Focal plane diagonal size (in mm)
|
3142
|
+
# 5) Sensor size (X and Y in mm)
|
3143
|
+
# 6/7) Focal plane X/Y size (in mm)
|
3144
|
+
# 8) focal plane resolution units (1=None,2=inches,3=cm,4=mm,5=um)
|
3145
|
+
# 9/10) Focal plane X/Y resolution
|
3146
|
+
# 11/12,13/14...) Image width/height in order of precedence (first valid pair is used)
|
3147
|
+
# Returns: 35mm conversion factor (or undefined if it can't be calculated)
|
3148
|
+
sub CalcScaleFactor35efl
|
3149
|
+
{
|
3150
|
+
my $et = shift;
|
3151
|
+
my $res = $_[7]; # save resolution units (in case they have been converted to string)
|
3152
|
+
my $sensXY = $_[4];
|
3153
|
+
Image::ExifTool::ToFloat(@_);
|
3154
|
+
my $focal = shift;
|
3155
|
+
my $foc35 = shift;
|
3156
|
+
|
3157
|
+
return $foc35 / $focal if $focal and $foc35;
|
3158
|
+
|
3159
|
+
my $digz = shift || 1;
|
3160
|
+
my $diag = shift;
|
3161
|
+
my $sens = shift;
|
3162
|
+
# calculate Canon sensor size using a dedicated algorithm
|
3163
|
+
if ($$et{Make} eq 'Canon') {
|
3164
|
+
require Image::ExifTool::Canon;
|
3165
|
+
my $canonDiag = Image::ExifTool::Canon::CalcSensorDiag(
|
3166
|
+
$$et{RATIONAL}{FocalPlaneXResolution},
|
3167
|
+
$$et{RATIONAL}{FocalPlaneYResolution},
|
3168
|
+
);
|
3169
|
+
$diag = $canonDiag if $canonDiag;
|
3170
|
+
}
|
3171
|
+
unless ($diag and Image::ExifTool::IsFloat($diag)) {
|
3172
|
+
if ($sens and $sensXY =~ / (\d+(\.?\d*)?)$/) {
|
3173
|
+
$diag = sqrt($sens * $sens + $1 * $1);
|
3174
|
+
} else {
|
3175
|
+
undef $diag;
|
3176
|
+
my $xsize = shift;
|
3177
|
+
my $ysize = shift;
|
3178
|
+
if ($xsize and $ysize) {
|
3179
|
+
# validate by checking aspect ratio because FocalPlaneX/YSize is not reliable
|
3180
|
+
my $a = $xsize / $ysize;
|
3181
|
+
if (abs($a-1.3333) < .1 or abs($a-1.5) < .1) {
|
3182
|
+
$diag = sqrt($xsize * $xsize + $ysize * $ysize);
|
3183
|
+
}
|
3184
|
+
}
|
3185
|
+
}
|
3186
|
+
unless ($diag) {
|
3187
|
+
# get number of mm in units (assume inches unless otherwise specified)
|
3188
|
+
my %lkup = ( 3=>10, 4=>1, 5=>0.001 , cm=>10, mm=>1, um=>0.001 );
|
3189
|
+
my $units = $lkup{ shift() || $res || '' } || 25.4;
|
3190
|
+
my $x_res = shift || return undef;
|
3191
|
+
my $y_res = shift || return undef;
|
3192
|
+
Image::ExifTool::IsFloat($x_res) and $x_res != 0 or return undef;
|
3193
|
+
Image::ExifTool::IsFloat($y_res) and $y_res != 0 or return undef;
|
3194
|
+
my ($w, $h);
|
3195
|
+
for (;;) {
|
3196
|
+
@_ < 2 and return undef;
|
3197
|
+
$w = shift;
|
3198
|
+
$h = shift;
|
3199
|
+
next unless $w and $h;
|
3200
|
+
my $a = $w / $h;
|
3201
|
+
last if $a > 0.5 and $a < 2; # stop if we get a reasonable value
|
3202
|
+
}
|
3203
|
+
# calculate focal plane size in mm
|
3204
|
+
$w *= $units / $x_res;
|
3205
|
+
$h *= $units / $y_res;
|
3206
|
+
$diag = sqrt($w*$w+$h*$h);
|
3207
|
+
# make sure size is reasonable
|
3208
|
+
return undef unless $diag > 1 and $diag < 100;
|
3209
|
+
}
|
3210
|
+
}
|
3211
|
+
return sqrt(36*36+24*24) * $digz / $diag;
|
3212
|
+
}
|
3213
|
+
|
3214
|
+
#------------------------------------------------------------------------------
|
3215
|
+
# Print exposure compensation fraction
|
3216
|
+
sub PrintFraction($)
|
3217
|
+
{
|
3218
|
+
my $val = shift;
|
3219
|
+
my $str;
|
3220
|
+
if (defined $val) {
|
3221
|
+
$val *= 1.00001; # avoid round-off errors
|
3222
|
+
if (not $val) {
|
3223
|
+
$str = '0';
|
3224
|
+
} elsif (int($val)/$val > 0.999) {
|
3225
|
+
$str = sprintf("%+d", int($val));
|
3226
|
+
} elsif ((int($val*2))/($val*2) > 0.999) {
|
3227
|
+
$str = sprintf("%+d/2", int($val * 2));
|
3228
|
+
} elsif ((int($val*3))/($val*3) > 0.999) {
|
3229
|
+
$str = sprintf("%+d/3", int($val * 3));
|
3230
|
+
} else {
|
3231
|
+
$str = sprintf("%+.3g", $val);
|
3232
|
+
}
|
3233
|
+
}
|
3234
|
+
return $str;
|
3235
|
+
}
|
3236
|
+
|
3237
|
+
#------------------------------------------------------------------------------
|
3238
|
+
# Convert fraction or number to floating point value (or 'undef' or 'inf')
|
3239
|
+
sub ConvertFraction($)
|
3240
|
+
{
|
3241
|
+
my $val = shift;
|
3242
|
+
if ($val =~ m{([-+]?\d+)/(\d+)}) {
|
3243
|
+
$val = $2 ? $1 / $2 : ($1 ? 'inf' : 'undef');
|
3244
|
+
}
|
3245
|
+
return $val;
|
3246
|
+
}
|
3247
|
+
|
3248
|
+
#------------------------------------------------------------------------------
|
3249
|
+
# Convert EXIF text to something readable
|
3250
|
+
# Inputs: 0) ExifTool object reference, 1) EXIF text,
|
3251
|
+
# 2) flag to apply CharsetEXIF to ASCII text
|
3252
|
+
# Returns: text encoded according to Charset option (with trailing spaces removed)
|
3253
|
+
sub ConvertExifText($$;$)
|
3254
|
+
{
|
3255
|
+
my ($et, $val, $asciiFlex) = @_;
|
3256
|
+
return $val if length($val) < 8;
|
3257
|
+
my $id = substr($val, 0, 8);
|
3258
|
+
my $str = substr($val, 8);
|
3259
|
+
# Note: allow spaces instead of nulls in the ID codes because
|
3260
|
+
# it is fairly common for camera manufacturers to get this wrong
|
3261
|
+
# (also handle Canon ZoomBrowser EX 4.5 null followed by 7 bytes of garbage)
|
3262
|
+
if ($id =~ /^(ASCII)?(\0|[\0 ]+$)/) {
|
3263
|
+
# truncate at null terminator (shouldn't have a null based on the
|
3264
|
+
# EXIF spec, but it seems that few people actually read the spec)
|
3265
|
+
$str =~ s/\0.*//s;
|
3266
|
+
# allow ASCII text to contain any other specified encoding
|
3267
|
+
if ($asciiFlex) {
|
3268
|
+
my $enc = $et->Options('CharsetEXIF');
|
3269
|
+
$str = $et->Decode($str, $enc) if $enc;
|
3270
|
+
}
|
3271
|
+
# by the EXIF spec, the following string should be "UNICODE\0", but
|
3272
|
+
# apparently Kodak sometimes uses "Unicode\0" in the APP3 "Meta" information.
|
3273
|
+
# However, unfortunately Ricoh uses "Unicode\0" in the RR30 EXIF UserComment
|
3274
|
+
# when the text is actually ASCII, so only recognize uppercase "UNICODE\0".
|
3275
|
+
} elsif ($id =~ /^UNICODE[\0 ]$/) {
|
3276
|
+
# MicrosoftPhoto writes as little-endian even in big-endian EXIF,
|
3277
|
+
# so we must guess at the true byte ordering
|
3278
|
+
$str = $et->Decode($str, 'UTF16', 'Unknown');
|
3279
|
+
} elsif ($id =~ /^JIS[\0 ]{5}$/) {
|
3280
|
+
$str = $et->Decode($str, 'JIS', 'Unknown');
|
3281
|
+
} else {
|
3282
|
+
$et->Warn('Invalid EXIF text encoding');
|
3283
|
+
$str = $id . $str;
|
3284
|
+
}
|
3285
|
+
$str =~ s/ +$//; # trim trailing blanks
|
3286
|
+
return $str;
|
3287
|
+
}
|
3288
|
+
|
3289
|
+
#------------------------------------------------------------------------------
|
3290
|
+
# Print conversion for SpatialFrequencyResponse
|
3291
|
+
sub PrintSFR($)
|
3292
|
+
{
|
3293
|
+
my $val = shift;
|
3294
|
+
return $val unless length $val > 4;
|
3295
|
+
my ($n, $m) = (Get16u(\$val, 0), Get16u(\$val, 2));
|
3296
|
+
my @cols = split /\0/, substr($val, 4), $n+1;
|
3297
|
+
my $pos = length($val) - 8 * $n * $m;
|
3298
|
+
return $val unless @cols == $n+1 and $pos >= 4;
|
3299
|
+
pop @cols;
|
3300
|
+
my ($i, $j);
|
3301
|
+
for ($i=0; $i<$n; ++$i) {
|
3302
|
+
my @rows;
|
3303
|
+
for ($j=0; $j<$m; ++$j) {
|
3304
|
+
push @rows, Image::ExifTool::GetRational64u(\$val, $pos + 8*($i+$j*$n));
|
3305
|
+
}
|
3306
|
+
$cols[$i] .= '=' . join(',',@rows) . '';
|
3307
|
+
}
|
3308
|
+
return join '; ', @cols;
|
3309
|
+
}
|
3310
|
+
|
3311
|
+
#------------------------------------------------------------------------------
|
3312
|
+
# Print numerical parameter value (with sign, or 'Normal' for zero)
|
3313
|
+
# Inputs: 0) value, 1) flag for inverse conversion, 2) conversion hash reference
|
3314
|
+
sub PrintParameter($$$)
|
3315
|
+
{
|
3316
|
+
my ($val, $inv, $conv) = @_;
|
3317
|
+
return $val if $inv;
|
3318
|
+
if ($val > 0) {
|
3319
|
+
if ($val > 0xfff0) { # a negative value in disguise?
|
3320
|
+
$val = $val - 0x10000;
|
3321
|
+
} else {
|
3322
|
+
$val = "+$val";
|
3323
|
+
}
|
3324
|
+
}
|
3325
|
+
return $val;
|
3326
|
+
}
|
3327
|
+
|
3328
|
+
#------------------------------------------------------------------------------
|
3329
|
+
# Convert parameter back to standard EXIF value
|
3330
|
+
# 0,0.00,etc or "Normal" => 0
|
3331
|
+
# -1,-2,etc or "Soft" or "Low" => 1
|
3332
|
+
# +1,+2,1,2,etc or "Hard" or "High" => 2
|
3333
|
+
sub ConvertParameter($)
|
3334
|
+
{
|
3335
|
+
my $val = shift;
|
3336
|
+
my $isFloat = Image::ExifTool::IsFloat($val);
|
3337
|
+
# normal is a value of zero
|
3338
|
+
return 0 if $val =~ /\bn/i or ($isFloat and $val == 0);
|
3339
|
+
# "soft", "low" or any negative number is a value of 1
|
3340
|
+
return 1 if $val =~ /\b(s|l)/i or ($isFloat and $val < 0);
|
3341
|
+
# "hard", "high" or any positive number is a value of 2
|
3342
|
+
return 2 if $val =~ /\bh/i or $isFloat;
|
3343
|
+
return undef;
|
3344
|
+
}
|
3345
|
+
|
3346
|
+
#------------------------------------------------------------------------------
|
3347
|
+
# Calculate Red/BlueBalance
|
3348
|
+
# Inputs: 0) 0=red, 1=blue, 1-8) WB_RGGB/RGBG/RBGG/GRBG/GRGB/RGB/GRB/RBLevels,
|
3349
|
+
# 8) red or blue level, 9) green level
|
3350
|
+
my @rggbLookup = (
|
3351
|
+
# indices for R, G, G and B components in input value
|
3352
|
+
[ 0, 1, 2, 3 ], # 0 RGGB
|
3353
|
+
[ 0, 1, 3, 2 ], # 1 RGBG
|
3354
|
+
[ 0, 2, 3, 1 ], # 2 RBGG
|
3355
|
+
[ 1, 0, 3, 2 ], # 3 GRBG
|
3356
|
+
[ 1, 0, 2, 3 ], # 4 GRGB
|
3357
|
+
[ 2, 3, 0, 1 ], # 5 GBRG
|
3358
|
+
[ 0, 1, 1, 2 ], # 6 RGB
|
3359
|
+
[ 1, 0, 0, 2 ], # 7 GRB
|
3360
|
+
[ 0, 256, 256, 1 ], # 8 RB (green level is 256)
|
3361
|
+
);
|
3362
|
+
sub RedBlueBalance($@)
|
3363
|
+
{
|
3364
|
+
my $blue = shift;
|
3365
|
+
my ($i, $val, $levels);
|
3366
|
+
for ($i=0; $i<@rggbLookup; ++$i) {
|
3367
|
+
$levels = shift or next;
|
3368
|
+
my @levels = split ' ', $levels;
|
3369
|
+
next if @levels < 2;
|
3370
|
+
my $lookup = $rggbLookup[$i];
|
3371
|
+
my $g = $$lookup[1]; # get green level or index
|
3372
|
+
if ($g < 4) {
|
3373
|
+
next if @levels < 3;
|
3374
|
+
$g = ($levels[$g] + $levels[$$lookup[2]]) / 2 or next;
|
3375
|
+
} elsif ($levels[$$lookup[$blue * 3]] < 4) {
|
3376
|
+
$g = 1; # Some Nikon cameras use a scaling factor of 1 (E5700)
|
3377
|
+
}
|
3378
|
+
$val = $levels[$$lookup[$blue * 3]] / $g;
|
3379
|
+
last;
|
3380
|
+
}
|
3381
|
+
$val = $_[0] / $_[1] if not defined $val and ($_[0] and $_[1]);
|
3382
|
+
return $val;
|
3383
|
+
}
|
3384
|
+
|
3385
|
+
#------------------------------------------------------------------------------
|
3386
|
+
# Print exposure time as a fraction
|
3387
|
+
sub PrintExposureTime($)
|
3388
|
+
{
|
3389
|
+
my $secs = shift;
|
3390
|
+
if ($secs < 0.25001 and $secs > 0) {
|
3391
|
+
return sprintf("1/%d",int(0.5 + 1/$secs));
|
3392
|
+
}
|
3393
|
+
$_ = sprintf("%.1f",$secs);
|
3394
|
+
s/\.0$//;
|
3395
|
+
return $_;
|
3396
|
+
}
|
3397
|
+
|
3398
|
+
#------------------------------------------------------------------------------
|
3399
|
+
# Print FNumber
|
3400
|
+
sub PrintFNumber($)
|
3401
|
+
{
|
3402
|
+
my $val = shift;
|
3403
|
+
if (Image::ExifTool::IsFloat($val) and $val > 0) {
|
3404
|
+
# round to 1 decimal place, or 2 for values < 1.0
|
3405
|
+
$val = sprintf(($val<1 ? "%.2f" : "%.1f"), $val);
|
3406
|
+
}
|
3407
|
+
return $val;
|
3408
|
+
}
|
3409
|
+
|
3410
|
+
#------------------------------------------------------------------------------
|
3411
|
+
# Decode raw CFAPattern value
|
3412
|
+
# Inputs: 0) ExifTool ref, 1) binary value
|
3413
|
+
# Returns: string of numbers
|
3414
|
+
sub DecodeCFAPattern($$)
|
3415
|
+
{
|
3416
|
+
my ($self, $val) = @_;
|
3417
|
+
# some panasonic cameras (SV-AS3, SV-AS30) write this in ascii (very odd)
|
3418
|
+
if ($val =~ /^[0-6]+$/) {
|
3419
|
+
$self->Warn('Incorrectly formatted CFAPattern', 1);
|
3420
|
+
$val =~ tr/0-6/\x00-\x06/;
|
3421
|
+
}
|
3422
|
+
return $val unless length($val) >= 4;
|
3423
|
+
my @a = unpack(GetByteOrder() eq 'II' ? 'v2C*' : 'n2C*', $val);
|
3424
|
+
my $end = 2 + $a[0] * $a[1];
|
3425
|
+
if ($end > @a) {
|
3426
|
+
# try swapping byte order (I have seen this order different than in EXIF)
|
3427
|
+
my ($x, $y) = unpack('n2',pack('v2',$a[0],$a[1]));
|
3428
|
+
if (@a < 2 + $x * $y) {
|
3429
|
+
$self->Warn('Invalid CFAPattern', 1);
|
3430
|
+
} else {
|
3431
|
+
($a[0], $a[1]) = ($x, $y);
|
3432
|
+
# (can't technically be wrong because the order isn't well defined by the EXIF spec)
|
3433
|
+
# $self->Warn('Wrong byte order for CFAPattern');
|
3434
|
+
}
|
3435
|
+
}
|
3436
|
+
return "@a";
|
3437
|
+
}
|
3438
|
+
|
3439
|
+
#------------------------------------------------------------------------------
|
3440
|
+
# Print CFA Pattern
|
3441
|
+
sub PrintCFAPattern($)
|
3442
|
+
{
|
3443
|
+
my $val = shift;
|
3444
|
+
my @a = split ' ', $val;
|
3445
|
+
return '<truncated data>' unless @a >= 2;
|
3446
|
+
return '<zero pattern size>' unless $a[0] and $a[1];
|
3447
|
+
my $end = 2 + $a[0] * $a[1];
|
3448
|
+
return '<invalid pattern size>' if $end > @a;
|
3449
|
+
my @cfaColor = qw(Red Green Blue Cyan Magenta Yellow White);
|
3450
|
+
my ($pos, $rtnVal) = (2, '[');
|
3451
|
+
for (;;) {
|
3452
|
+
$rtnVal .= $cfaColor[$a[$pos]] || 'Unknown';
|
3453
|
+
last if ++$pos >= $end;
|
3454
|
+
($pos - 2) % $a[1] and $rtnVal .= ',', next;
|
3455
|
+
$rtnVal .= '][';
|
3456
|
+
}
|
3457
|
+
return $rtnVal . ']';
|
3458
|
+
}
|
3459
|
+
|
3460
|
+
#------------------------------------------------------------------------------
|
3461
|
+
# Print conversion for lens info
|
3462
|
+
# Inputs: 0) string of values (min focal, max focal, min F, max F)
|
3463
|
+
# Returns: string in the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
|
3464
|
+
sub PrintLensInfo($)
|
3465
|
+
{
|
3466
|
+
my $val = shift;
|
3467
|
+
my @vals = split ' ', $val;
|
3468
|
+
return $val unless @vals == 4;
|
3469
|
+
my $c = 0;
|
3470
|
+
foreach (@vals) {
|
3471
|
+
Image::ExifTool::IsFloat($_) and ++$c, next;
|
3472
|
+
$_ eq 'inf' and $_ = '?', ++$c, next;
|
3473
|
+
$_ eq 'undef' and $_ = '?', ++$c, next;
|
3474
|
+
}
|
3475
|
+
return $val unless $c == 4;
|
3476
|
+
$val = $vals[0];
|
3477
|
+
# (the Pentax Q writes zero for upper value of fixed-focal-length lenses)
|
3478
|
+
$val .= "-$vals[1]" if $vals[1] and $vals[1] ne $vals[0];
|
3479
|
+
$val .= "mm f/$vals[2]";
|
3480
|
+
$val .= "-$vals[3]" if $vals[3] and $vals[3] ne $vals[2];
|
3481
|
+
return $val;
|
3482
|
+
}
|
3483
|
+
|
3484
|
+
#------------------------------------------------------------------------------
|
3485
|
+
# Get lens info from lens model string
|
3486
|
+
# Inputs: 0) lens string, 1) flag to allow unknown "?" values
|
3487
|
+
# Returns: 0) min focal, 1) max focal, 2) min aperture, 3) max aperture
|
3488
|
+
# Notes: returns empty list if lens string could not be parsed
|
3489
|
+
sub GetLensInfo($;$)
|
3490
|
+
{
|
3491
|
+
my ($lens, $unk) = @_;
|
3492
|
+
# extract focal length and aperture ranges for this lens
|
3493
|
+
my $pat = '\\d+(?:\\.\\d+)?';
|
3494
|
+
$pat .= '|\\?' if $unk;
|
3495
|
+
return () unless $lens =~ /($pat)(?:-($pat))?\s*mm.*?(?:[fF]\/?\s*)($pat)(?:-($pat))?/;
|
3496
|
+
# ($1=short focal, $2=long focal, $3=max aperture wide, $4=max aperture tele)
|
3497
|
+
my @a = ($1, $2, $3, $4);
|
3498
|
+
$a[1] or $a[1] = $a[0];
|
3499
|
+
$a[3] or $a[3] = $a[2];
|
3500
|
+
if ($unk) {
|
3501
|
+
local $_;
|
3502
|
+
$_ eq '?' and $_ = 'undef' foreach @a;
|
3503
|
+
}
|
3504
|
+
return @a;
|
3505
|
+
}
|
3506
|
+
|
3507
|
+
#------------------------------------------------------------------------------
|
3508
|
+
# Attempt to identify the specific lens if multiple lenses have the same LensType
|
3509
|
+
# Inputs: 0) ExifTool object ref, 1) LensType print value, 2) PrintConv hash ref,
|
3510
|
+
# 3) LensSpec print value, 4) LensType numerical value, 5) FocalLength,
|
3511
|
+
# 6) MaxAperture, 7) MaxApertureValue, 8) MinFocalLength, 9) MaxFocalLength,
|
3512
|
+
# 10) LensModel, 11) LensFocalRange, 12) LensSpec
|
3513
|
+
sub PrintLensID($$@)
|
3514
|
+
{
|
3515
|
+
my ($et, $lensTypePrt, $printConv, $lensSpecPrt, $lensType, $focalLength,
|
3516
|
+
$maxAperture, $maxApertureValue, $shortFocal, $longFocal, $lensModel,
|
3517
|
+
$lensFocalRange, $lensSpec) = @_;
|
3518
|
+
# the rest of the logic relies on the LensType lookup:
|
3519
|
+
return undef unless defined $lensType;
|
3520
|
+
# get print conversion hash if necessary
|
3521
|
+
$printConv or $printConv = $$et{TAG_INFO}{LensType}{PrintConv};
|
3522
|
+
# just copy LensType PrintConv value if it was a lens name
|
3523
|
+
# (Olympus or Panasonic -- just exclude things like Nikon and Leaf LensType)
|
3524
|
+
unless (ref $printConv eq 'HASH') {
|
3525
|
+
return $lensTypePrt if $lensTypePrt =~ /mm/;
|
3526
|
+
return $lensTypePrt if $lensTypePrt =~ s/(\d)\/F/$1mm F/;
|
3527
|
+
return undef;
|
3528
|
+
}
|
3529
|
+
# get LensSpec information if available (Sony)
|
3530
|
+
my ($sf0, $lf0, $sa0, $la0);
|
3531
|
+
if ($lensSpecPrt) {
|
3532
|
+
($sf0, $lf0, $sa0, $la0) = GetLensInfo($lensSpecPrt);
|
3533
|
+
undef $sf0 unless $sa0; # (make sure aperture isn't zero)
|
3534
|
+
}
|
3535
|
+
# use MaxApertureValue if MaxAperture is not available
|
3536
|
+
$maxAperture = $maxApertureValue unless $maxAperture;
|
3537
|
+
if ($lensFocalRange and $lensFocalRange =~ /^(\d+)(?: (?:to )?(\d+))?$/) {
|
3538
|
+
($shortFocal, $longFocal) = ($1, $2 || $1);
|
3539
|
+
}
|
3540
|
+
if ($$et{Make} eq 'SONY') {
|
3541
|
+
if (($lensType & 0xff00) == 0xef00) {
|
3542
|
+
# patch for Metabones Canon adapter on a Sony camera (ref Jos Roost)
|
3543
|
+
# (note: the adapter kills the high byte for 2-byte LensType values,
|
3544
|
+
# so the reported lens will be incorrect for these)
|
3545
|
+
require Image::ExifTool::Canon;
|
3546
|
+
$printConv = \%Image::ExifTool::Canon::canonLensTypes;
|
3547
|
+
$lensType &= 0xff;
|
3548
|
+
$lensTypePrt = $$printConv{$lensType} if $$printConv{$lensType};
|
3549
|
+
}
|
3550
|
+
} elsif ($shortFocal and $longFocal) {
|
3551
|
+
# Canon (and some other makes) include makernote information
|
3552
|
+
# which allows better lens identification
|
3553
|
+
require Image::ExifTool::Canon;
|
3554
|
+
return Image::ExifTool::Canon::PrintLensID($printConv, $lensType,
|
3555
|
+
$shortFocal, $longFocal, $maxAperture, $lensModel);
|
3556
|
+
}
|
3557
|
+
my $lens = $$printConv{$lensType};
|
3558
|
+
return ($lensModel || $lensTypePrt) unless $lens;
|
3559
|
+
return $lens unless $$printConv{"$lensType.1"};
|
3560
|
+
$lens =~ s/ or .*//s; # remove everything after "or"
|
3561
|
+
# make list of all possible matching lenses
|
3562
|
+
my @lenses = ( $lens );
|
3563
|
+
my $i;
|
3564
|
+
for ($i=1; $$printConv{"$lensType.$i"}; ++$i) {
|
3565
|
+
push @lenses, $$printConv{"$lensType.$i"};
|
3566
|
+
}
|
3567
|
+
# attempt to determine actual lens
|
3568
|
+
my (@matches, @best, @user, $diff);
|
3569
|
+
foreach $lens (@lenses) {
|
3570
|
+
push @user, $lens if $Image::ExifTool::userLens{$lens};
|
3571
|
+
# sf = short focal
|
3572
|
+
# lf = long focal
|
3573
|
+
# sa = max aperture at short focal
|
3574
|
+
# la = max aperture at long focal
|
3575
|
+
my ($sf, $lf, $sa, $la) = GetLensInfo($lens);
|
3576
|
+
next unless $sf;
|
3577
|
+
# check against LensSpec parameters if available
|
3578
|
+
if ($sf0) {
|
3579
|
+
next if abs($sf - $sf0) > 0.5 or abs($sa - $sa0) > 0.15 or
|
3580
|
+
abs($lf - $lf0) > 0.5 or abs($la - $la0) > 0.15;
|
3581
|
+
# the basic parameters match, but also check against additional lens features
|
3582
|
+
# for Sony E lenses -- the full LensSpec string should match with end of LensType
|
3583
|
+
$lensSpecPrt and $lens =~ /\Q$lensSpecPrt\E$/ and @best = ( $lens ), last;
|
3584
|
+
# exactly-matching Sony E lens should have been found above, so skip
|
3585
|
+
# any not-exactly-matching Sony E-lenses
|
3586
|
+
next if $lens =~ /^Sony E /;
|
3587
|
+
push @best, $lens;
|
3588
|
+
next;
|
3589
|
+
}
|
3590
|
+
# adjust focal length and aperture if teleconverter is attached (Minolta)
|
3591
|
+
if ($lens =~ / \+ .*? (\d+(\.\d+)?)x( |$)/) {
|
3592
|
+
$sf *= $1; $lf *= $1;
|
3593
|
+
$sa *= $1; $la *= $1;
|
3594
|
+
}
|
3595
|
+
# see if we can rule out this lens using FocalLength and MaxAperture
|
3596
|
+
if ($focalLength) {
|
3597
|
+
next if $focalLength < $sf - 0.5;
|
3598
|
+
next if $focalLength > $lf + 0.5;
|
3599
|
+
}
|
3600
|
+
if ($maxAperture) {
|
3601
|
+
# it seems that most manufacturers set MaxAperture and MaxApertureValue
|
3602
|
+
# to the maximum aperture (smallest F number) for the current focal length
|
3603
|
+
# of the lens, so assume that MaxAperture varies with focal length and find
|
3604
|
+
# the closest match (this is somewhat contrary to the EXIF specification which
|
3605
|
+
# states "The smallest F number of the lens", without mention of focal length)
|
3606
|
+
next if $maxAperture < $sa - 0.15; # (0.15 is arbitrary)
|
3607
|
+
next if $maxAperture > $la + 0.15;
|
3608
|
+
# now determine the best match for this aperture
|
3609
|
+
my $aa; # approximate maximum aperture at this focal length
|
3610
|
+
if ($sf == $lf or $sa == $la or $focalLength <= $sf) {
|
3611
|
+
# either 1) prime lens, 2) fixed-aperture zoom, or 3) zoom at min focal
|
3612
|
+
$aa = $sa;
|
3613
|
+
} elsif ($focalLength >= $lf) {
|
3614
|
+
$aa = $la;
|
3615
|
+
} else {
|
3616
|
+
# assume a log-log variation of max aperture with focal length
|
3617
|
+
# (see http://regex.info/blog/2006-10-05/263)
|
3618
|
+
$aa = exp(log($sa) + (log($la)-log($sa)) / (log($lf)-log($sf)) *
|
3619
|
+
(log($focalLength)-log($sf)));
|
3620
|
+
# a linear relationship between 1/FocalLength and 1/MaxAperture fits Sony better (ref 27)
|
3621
|
+
#$aa = 1 / (1/$sa + (1/$focalLength - 1/$sf) * (1/$la - 1/$sa) / (1/$lf - 1/$sf));
|
3622
|
+
}
|
3623
|
+
my $d = abs($maxAperture - $aa);
|
3624
|
+
if (defined $diff) {
|
3625
|
+
$d > $diff + 0.15 and next; # (0.15 is arbitrary)
|
3626
|
+
$d < $diff - 0.15 and undef @best;
|
3627
|
+
}
|
3628
|
+
$diff = $d;
|
3629
|
+
push @best, $lens;
|
3630
|
+
}
|
3631
|
+
push @matches, $lens;
|
3632
|
+
}
|
3633
|
+
if (@user) {
|
3634
|
+
# choose the best match if we have more than one
|
3635
|
+
if (@user > 1) {
|
3636
|
+
my ($try, @good);
|
3637
|
+
foreach $try (\@best, \@matches) {
|
3638
|
+
$Image::ExifTool::userLens{$_} and push @good, $_ foreach @$try;
|
3639
|
+
return join(' or ', @good) if @good;
|
3640
|
+
}
|
3641
|
+
}
|
3642
|
+
return join(' or ', @user);
|
3643
|
+
}
|
3644
|
+
return join(' or ', @best) if @best;
|
3645
|
+
return join(' or ', @matches) if @matches;
|
3646
|
+
$lens = $$printConv{$lensType};
|
3647
|
+
return $lensModel if $lensModel and $lens =~ / or /; # (ie. Sony NEX-5N)
|
3648
|
+
return $lens;
|
3649
|
+
}
|
3650
|
+
|
3651
|
+
#------------------------------------------------------------------------------
|
3652
|
+
# translate date into standard EXIF format
|
3653
|
+
# Inputs: 0) date
|
3654
|
+
# Returns: date in format '2003:10:22'
|
3655
|
+
# - bad formats recognized: '2003-10-22','2003/10/22','2003 10 22','20031022'
|
3656
|
+
# - removes null terminator if it exists
|
3657
|
+
sub ExifDate($)
|
3658
|
+
{
|
3659
|
+
my $date = shift;
|
3660
|
+
$date =~ s/\0$//; # remove any null terminator
|
3661
|
+
# separate year:month:day with colons
|
3662
|
+
# (have seen many other characters, including nulls, used erroneously)
|
3663
|
+
$date =~ s/(\d{4})[^\d]*(\d{2})[^\d]*(\d{2})$/$1:$2:$3/;
|
3664
|
+
return $date;
|
3665
|
+
}
|
3666
|
+
|
3667
|
+
#------------------------------------------------------------------------------
|
3668
|
+
# translate time into standard EXIF format
|
3669
|
+
# Inputs: 0) time
|
3670
|
+
# Returns: time in format '10:30:55'
|
3671
|
+
# - bad formats recognized: '10 30 55', '103055', '103055+0500'
|
3672
|
+
# - removes null terminator if it exists
|
3673
|
+
# - leaves time zone intact if specified (ie. '10:30:55+05:00')
|
3674
|
+
sub ExifTime($)
|
3675
|
+
{
|
3676
|
+
my $time = shift;
|
3677
|
+
$time =~ tr/ /:/; # use ':' (not ' ') as a separator
|
3678
|
+
$time =~ s/\0$//; # remove any null terminator
|
3679
|
+
# add separators if they don't exist
|
3680
|
+
$time =~ s/^(\d{2})(\d{2})(\d{2})/$1:$2:$3/;
|
3681
|
+
$time =~ s/([+-]\d{2})(\d{2})\s*$/$1:$2/; # to timezone too
|
3682
|
+
return $time;
|
3683
|
+
}
|
3684
|
+
|
3685
|
+
#------------------------------------------------------------------------------
|
3686
|
+
# extract image from file
|
3687
|
+
# Inputs: 0) ExifTool object reference, 1) data offset (in file), 2) data length
|
3688
|
+
# 3) [optional] tag name
|
3689
|
+
# Returns: Reference to Image if specifically requested or "Binary data" message
|
3690
|
+
# Returns undef if there was an error loading the image
|
3691
|
+
sub ExtractImage($$$$)
|
3692
|
+
{
|
3693
|
+
my ($et, $offset, $len, $tag) = @_;
|
3694
|
+
my $dataPt = \$$et{EXIF_DATA};
|
3695
|
+
my $dataPos = $$et{EXIF_POS};
|
3696
|
+
my $image;
|
3697
|
+
|
3698
|
+
# no image if length is zero, and don't try to extract binary from XMP file
|
3699
|
+
return undef if not $len or $$et{FILE_TYPE} eq 'XMP';
|
3700
|
+
|
3701
|
+
# take data from EXIF block if possible
|
3702
|
+
if (defined $dataPos and $offset>=$dataPos and $offset+$len<=$dataPos+length($$dataPt)) {
|
3703
|
+
$image = substr($$dataPt, $offset-$dataPos, $len);
|
3704
|
+
} else {
|
3705
|
+
$image = $et->ExtractBinary($offset, $len, $tag);
|
3706
|
+
return undef unless defined $image;
|
3707
|
+
# patch for incorrect ThumbnailOffset in some Sony DSLR-A100 ARW images
|
3708
|
+
if ($tag and $tag eq 'ThumbnailImage' and $$et{TIFF_TYPE} eq 'ARW' and
|
3709
|
+
$$et{Model} eq 'DSLR-A100' and $offset < 0x10000 and
|
3710
|
+
$image !~ /^(Binary data|\xff\xd8\xff)/)
|
3711
|
+
{
|
3712
|
+
my $try = $et->ExtractBinary($offset + 0x10000, $len, $tag);
|
3713
|
+
if (defined $try and $try =~ /^\xff\xd8\xff/) {
|
3714
|
+
$image = $try;
|
3715
|
+
$$et{VALUE}{ThumbnailOffset} += 0x10000;
|
3716
|
+
$et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
|
3717
|
+
}
|
3718
|
+
}
|
3719
|
+
}
|
3720
|
+
return $et->ValidateImage(\$image, $tag);
|
3721
|
+
}
|
3722
|
+
|
3723
|
+
#------------------------------------------------------------------------------
|
3724
|
+
# Process EXIF directory
|
3725
|
+
# Inputs: 0) ExifTool object reference
|
3726
|
+
# 1) Reference to directory information hash
|
3727
|
+
# 2) Pointer to tag table for this directory
|
3728
|
+
# Returns: 1 on success, otherwise returns 0 and sets a Warning
|
3729
|
+
sub ProcessExif($$$)
|
3730
|
+
{
|
3731
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
3732
|
+
my $dataPt = $$dirInfo{DataPt};
|
3733
|
+
my $dataPos = $$dirInfo{DataPos} || 0;
|
3734
|
+
my $dataLen = $$dirInfo{DataLen};
|
3735
|
+
my $dirStart = $$dirInfo{DirStart} || 0;
|
3736
|
+
my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
|
3737
|
+
my $dirName = $$dirInfo{DirName};
|
3738
|
+
my $base = $$dirInfo{Base} || 0;
|
3739
|
+
my $firstBase = $base;
|
3740
|
+
my $raf = $$dirInfo{RAF};
|
3741
|
+
my $verbose = $et->Options('Verbose');
|
3742
|
+
my $htmlDump = $$et{HTML_DUMP};
|
3743
|
+
my $success = 1;
|
3744
|
+
my ($tagKey, $dirSize, $makerAddr, $strEnc);
|
3745
|
+
my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
|
3746
|
+
|
3747
|
+
# set encoding to assume for strings
|
3748
|
+
$strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
|
3749
|
+
|
3750
|
+
# ignore non-standard EXIF while in strict MWG compatibility mode
|
3751
|
+
if ($Image::ExifTool::MWG::strict and $dirName eq 'IFD0' and
|
3752
|
+
$tagTablePtr eq \%Image::ExifTool::Exif::Main and
|
3753
|
+
$$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
|
3754
|
+
{
|
3755
|
+
my $path = $et->MetadataPath();
|
3756
|
+
unless ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) {
|
3757
|
+
$et->Warn("Ignored non-standard EXIF at $path");
|
3758
|
+
return 1;
|
3759
|
+
}
|
3760
|
+
}
|
3761
|
+
$verbose = -1 if $htmlDump; # mix htmlDump into verbose so we can test for both at once
|
3762
|
+
$dirName eq 'EXIF' and $dirName = $$dirInfo{DirName} = 'IFD0';
|
3763
|
+
$$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi};
|
3764
|
+
# get a more descriptive name for MakerNote sub-directories
|
3765
|
+
my $name = $$dirInfo{Name};
|
3766
|
+
$name = $dirName unless $name and $inMakerNotes and $name !~ /^MakerNote/;
|
3767
|
+
|
3768
|
+
my ($numEntries, $dirEnd);
|
3769
|
+
if ($dirStart >= 0 and $dirStart <= $dataLen-2) {
|
3770
|
+
# make sure data is large enough (patches bug in Olympus subdirectory lengths)
|
3771
|
+
$numEntries = Get16u($dataPt, $dirStart);
|
3772
|
+
$dirSize = 2 + 12 * $numEntries;
|
3773
|
+
$dirEnd = $dirStart + $dirSize;
|
3774
|
+
if ($dirSize > $dirLen) {
|
3775
|
+
if ($verbose > 0 and not $$dirInfo{SubIFD}) {
|
3776
|
+
my $short = $dirSize - $dirLen;
|
3777
|
+
$et->Warn("Short directory size (missing $short bytes)");
|
3778
|
+
}
|
3779
|
+
undef $dirSize if $dirEnd > $dataLen; # read from file if necessary
|
3780
|
+
}
|
3781
|
+
}
|
3782
|
+
# read IFD from file if necessary
|
3783
|
+
unless ($dirSize) {
|
3784
|
+
$success = 0;
|
3785
|
+
if ($raf) {
|
3786
|
+
# read the count of entries in this IFD
|
3787
|
+
my $offset = $dirStart + $dataPos;
|
3788
|
+
my ($buff, $buf2);
|
3789
|
+
if ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) {
|
3790
|
+
my $len = 12 * Get16u(\$buff,0);
|
3791
|
+
# also read next IFD pointer if available
|
3792
|
+
if ($raf->Read($buf2, $len+4) >= $len) {
|
3793
|
+
$buff .= $buf2;
|
3794
|
+
# make copy of dirInfo since we're going to modify it
|
3795
|
+
my %newDirInfo = %$dirInfo;
|
3796
|
+
$dirInfo = \%newDirInfo;
|
3797
|
+
# update directory parameters for the newly loaded IFD
|
3798
|
+
$dataPt = $$dirInfo{DataPt} = \$buff;
|
3799
|
+
$dataPos = $$dirInfo{DataPos} = $offset;
|
3800
|
+
$dataLen = $$dirInfo{DataLen} = length $buff;
|
3801
|
+
$dirStart = $$dirInfo{DirStart} = 0;
|
3802
|
+
$dirLen = $$dirInfo{DirLen} = length $buff;
|
3803
|
+
$success = 1;
|
3804
|
+
}
|
3805
|
+
}
|
3806
|
+
}
|
3807
|
+
unless ($success) {
|
3808
|
+
$et->Warn("Bad $name directory");
|
3809
|
+
return 0;
|
3810
|
+
}
|
3811
|
+
$numEntries = Get16u($dataPt, $dirStart);
|
3812
|
+
$dirSize = 2 + 12 * $numEntries;
|
3813
|
+
$dirEnd = $dirStart + $dirSize;
|
3814
|
+
}
|
3815
|
+
$verbose > 0 and $et->VerboseDir($dirName, $numEntries);
|
3816
|
+
my $bytesFromEnd = $dataLen - $dirEnd;
|
3817
|
+
if ($bytesFromEnd < 4) {
|
3818
|
+
unless ($bytesFromEnd==2 or $bytesFromEnd==0) {
|
3819
|
+
$et->Warn("Illegal $name directory size ($numEntries entries)");
|
3820
|
+
return 0;
|
3821
|
+
}
|
3822
|
+
}
|
3823
|
+
# fix base offset for maker notes if necessary
|
3824
|
+
if (defined $$dirInfo{MakerNoteAddr}) {
|
3825
|
+
$makerAddr = $$dirInfo{MakerNoteAddr};
|
3826
|
+
delete $$dirInfo{MakerNoteAddr};
|
3827
|
+
if (Image::ExifTool::MakerNotes::FixBase($et, $dirInfo)) {
|
3828
|
+
$base = $$dirInfo{Base};
|
3829
|
+
$dataPos = $$dirInfo{DataPos};
|
3830
|
+
}
|
3831
|
+
}
|
3832
|
+
if ($htmlDump) {
|
3833
|
+
my $longName = $name eq 'MakerNotes' ? ($$dirInfo{Name} || $name) : $name;
|
3834
|
+
if (defined $makerAddr) {
|
3835
|
+
my $hdrLen = $dirStart + $dataPos + $base - $makerAddr;
|
3836
|
+
$et->HDump($makerAddr, $hdrLen, "MakerNotes header", $longName) if $hdrLen > 0;
|
3837
|
+
}
|
3838
|
+
unless ($$dirInfo{NoDumpEntryCount}) {
|
3839
|
+
$et->HDump($dirStart + $dataPos + $base, 2, "$longName entries",
|
3840
|
+
"Entry count: $numEntries");
|
3841
|
+
}
|
3842
|
+
my $tip;
|
3843
|
+
if ($bytesFromEnd >= 4) {
|
3844
|
+
my $nxt = ($name =~ /^(.*?)(\d+)$/) ? $1 . ($2 + 1) : 'Next IFD';
|
3845
|
+
$tip = sprintf("$nxt offset: 0x%.4x", Get32u($dataPt, $dirEnd));
|
3846
|
+
}
|
3847
|
+
$et->HDump($dirEnd + $dataPos + $base, 4, "Next IFD", $tip, 0);
|
3848
|
+
}
|
3849
|
+
|
3850
|
+
# patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
|
3851
|
+
# (must do this before parsing directory or CameraSettings offset will be suspicious)
|
3852
|
+
if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D') {
|
3853
|
+
my $entry = $dirStart + 2 + 12 * ($numEntries - 1);
|
3854
|
+
my $fmt = Get16u($dataPt, $entry + 2);
|
3855
|
+
if ($fmt < 1 or $fmt > 13) {
|
3856
|
+
$et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
|
3857
|
+
"Bad format type: $fmt", 1);
|
3858
|
+
# adjust the number of directory entries
|
3859
|
+
--$numEntries;
|
3860
|
+
$dirEnd -= 12;
|
3861
|
+
}
|
3862
|
+
}
|
3863
|
+
|
3864
|
+
# loop through all entries in an EXIF directory (IFD)
|
3865
|
+
my ($index, $valEnd, $offList, $offHash);
|
3866
|
+
my $warnCount = 0;
|
3867
|
+
for ($index=0; $index<$numEntries; ++$index) {
|
3868
|
+
if ($warnCount > 10) {
|
3869
|
+
$et->Warn("Too many warnings -- $name parsing aborted", 2) and return 0;
|
3870
|
+
}
|
3871
|
+
my $entry = $dirStart + 2 + 12 * $index;
|
3872
|
+
my $tagID = Get16u($dataPt, $entry);
|
3873
|
+
my $format = Get16u($dataPt, $entry+2);
|
3874
|
+
my $count = Get32u($dataPt, $entry+4);
|
3875
|
+
if ($format < 1 or $format > 13) {
|
3876
|
+
$et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
|
3877
|
+
"Bad format type: $format", 1);
|
3878
|
+
# warn unless the IFD was just padded with zeros
|
3879
|
+
if ($format) {
|
3880
|
+
$et->Warn("Bad format ($format) for $name entry $index", $inMakerNotes);
|
3881
|
+
++$warnCount;
|
3882
|
+
}
|
3883
|
+
return 0 unless $index; # assume corrupted IFD if this is our first entry
|
3884
|
+
next;
|
3885
|
+
}
|
3886
|
+
my $formatStr = $formatName[$format]; # get name of this format
|
3887
|
+
my $valueDataPt = $dataPt;
|
3888
|
+
my $valueDataPos = $dataPos;
|
3889
|
+
my $valueDataLen = $dataLen;
|
3890
|
+
my $valuePtr = $entry + 8; # pointer to value within $$dataPt
|
3891
|
+
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
|
3892
|
+
my ($origFormStr, $bad, $rational);
|
3893
|
+
# hack to patch incorrect count in Kodak SubIFD3 tags
|
3894
|
+
if ($count < 2 and ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount}) {
|
3895
|
+
$offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos,
|
3896
|
+
$numEntries, $tagTablePtr);
|
3897
|
+
my $i = $$offHash{Get32u($dataPt, $valuePtr)};
|
3898
|
+
if (defined $i and $i < $#$offList) {
|
3899
|
+
my $oldCount = $count;
|
3900
|
+
$count = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$format]);
|
3901
|
+
$origFormStr = $formatName[$format] . '[' . $oldCount . ']' if $oldCount != $count;
|
3902
|
+
}
|
3903
|
+
}
|
3904
|
+
my $size = $count * $formatSize[$format];
|
3905
|
+
my $readSize = $size;
|
3906
|
+
if ($size > 4) {
|
3907
|
+
if ($size > 0x7fffffff) {
|
3908
|
+
$et->Warn(sprintf("Invalid size (%u) for %s tag 0x%.4x", $size, $name, $tagID));
|
3909
|
+
++$warnCount;
|
3910
|
+
next;
|
3911
|
+
}
|
3912
|
+
$valuePtr = Get32u($dataPt, $valuePtr);
|
3913
|
+
# fix valuePtr if necessary
|
3914
|
+
if ($$dirInfo{FixOffsets}) {
|
3915
|
+
my $wFlag;
|
3916
|
+
$valEnd or $valEnd = $dataPos + $dirEnd + 4;
|
3917
|
+
#### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag)
|
3918
|
+
eval $$dirInfo{FixOffsets};
|
3919
|
+
}
|
3920
|
+
my $suspect;
|
3921
|
+
# offset shouldn't point into TIFF header
|
3922
|
+
$valuePtr < 8 and not $$dirInfo{ZeroOffsetOK} and $suspect = $warnCount;
|
3923
|
+
# convert offset to pointer in $$dataPt
|
3924
|
+
if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$tagID} eq 'HASH' and
|
3925
|
+
$$tagTablePtr{$tagID}{EntryBased}))
|
3926
|
+
{
|
3927
|
+
$valuePtr += $entry;
|
3928
|
+
} else {
|
3929
|
+
$valuePtr -= $dataPos;
|
3930
|
+
}
|
3931
|
+
# value shouldn't overlap our directory
|
3932
|
+
$suspect = $warnCount if $valuePtr < $dirEnd and $valuePtr+$size > $dirStart;
|
3933
|
+
# load value from file if necessary
|
3934
|
+
if ($valuePtr < 0 or $valuePtr+$size > $dataLen) {
|
3935
|
+
# get value by seeking in file if we are allowed
|
3936
|
+
my $buff;
|
3937
|
+
if ($raf) {
|
3938
|
+
# avoid loading large binary data unless necessary
|
3939
|
+
# (ie. ImageSourceData -- layers in Photoshop TIFF image)
|
3940
|
+
while ($size > BINARY_DATA_LIMIT) {
|
3941
|
+
if ($tagInfo) {
|
3942
|
+
# make large unknown blocks binary data
|
3943
|
+
$$tagInfo{Binary} = 1 if $$tagInfo{Unknown};
|
3944
|
+
last unless $$tagInfo{Binary}; # must read non-binary data
|
3945
|
+
last if $$tagInfo{SubDirectory}; # must read SubDirectory data
|
3946
|
+
my $lcTag = lc($$tagInfo{Name});
|
3947
|
+
if ($$et{OPTIONS}{Binary} and
|
3948
|
+
not $$et{EXCL_TAG_LOOKUP}{$lcTag})
|
3949
|
+
{
|
3950
|
+
# read binary data if specified unless tagsFromFile won't use it
|
3951
|
+
last unless $$et{TAGS_FROM_FILE} and $$tagInfo{Protected};
|
3952
|
+
}
|
3953
|
+
# must read if tag is specified by name
|
3954
|
+
last if $$et{REQ_TAG_LOOKUP}{$lcTag};
|
3955
|
+
} else {
|
3956
|
+
# must read value if needed for a condition
|
3957
|
+
last if defined $tagInfo;
|
3958
|
+
}
|
3959
|
+
# (note: changing the value without changing $size will cause
|
3960
|
+
# a warning in the verbose output, but we need to maintain the
|
3961
|
+
# proper size for the htmlDump, so we can't change this)
|
3962
|
+
$buff = "Binary data $size bytes";
|
3963
|
+
$readSize = length $buff;
|
3964
|
+
last;
|
3965
|
+
}
|
3966
|
+
# read from file if necessary
|
3967
|
+
unless (defined $buff or
|
3968
|
+
($raf->Seek($base + $valuePtr + $dataPos,0) and
|
3969
|
+
$raf->Read($buff,$size) == $size))
|
3970
|
+
{
|
3971
|
+
$et->Warn("Error reading value for $name entry $index", $inMakerNotes);
|
3972
|
+
return 0 unless $inMakerNotes or $htmlDump;
|
3973
|
+
++$warnCount;
|
3974
|
+
$buff = '' unless defined $buff;
|
3975
|
+
$readSize = length $buff;
|
3976
|
+
$bad = 1;
|
3977
|
+
}
|
3978
|
+
$valueDataLen = length $buff;
|
3979
|
+
$valueDataPt = \$buff;
|
3980
|
+
$valueDataPos = $valuePtr + $dataPos;
|
3981
|
+
$valuePtr = 0;
|
3982
|
+
} else {
|
3983
|
+
my ($tagStr, $tmpInfo, $leicaTrailer);
|
3984
|
+
if ($tagInfo) {
|
3985
|
+
$tagStr = $$tagInfo{Name};
|
3986
|
+
$leicaTrailer = $$tagInfo{LeicaTrailer};
|
3987
|
+
} elsif (defined $tagInfo) {
|
3988
|
+
$tmpInfo = $et->GetTagInfo($tagTablePtr, $tagID, \ '', $formatStr, $count);
|
3989
|
+
if ($tmpInfo) {
|
3990
|
+
$tagStr = $$tmpInfo{Name};
|
3991
|
+
$leicaTrailer = $$tmpInfo{LeicaTrailer};
|
3992
|
+
}
|
3993
|
+
}
|
3994
|
+
if ($tagInfo and $$tagInfo{ChangeBase}) {
|
3995
|
+
# adjust base offset for this tag only
|
3996
|
+
#### eval ChangeBase ($dirStart,$dataPos)
|
3997
|
+
my $newBase = eval $$tagInfo{ChangeBase};
|
3998
|
+
$valuePtr += $newBase;
|
3999
|
+
}
|
4000
|
+
$tagStr or $tagStr = sprintf("tag 0x%.4x",$tagID);
|
4001
|
+
# allow PreviewImage to run outside EXIF data
|
4002
|
+
if ($tagStr eq 'PreviewImage' and $$et{RAF}) {
|
4003
|
+
my $pos = $$et{RAF}->Tell();
|
4004
|
+
$buff = $et->ExtractBinary($base + $valuePtr + $dataPos, $size, 'PreviewImage');
|
4005
|
+
$$et{RAF}->Seek($pos, 0);
|
4006
|
+
$valueDataPt = \$buff;
|
4007
|
+
$valueDataPos = $valuePtr + $dataPos;
|
4008
|
+
$valueDataLen = $size;
|
4009
|
+
$valuePtr = 0;
|
4010
|
+
} elsif ($leicaTrailer and $$et{RAF}) {
|
4011
|
+
if ($verbose > 0) {
|
4012
|
+
$et->VPrint(0, "$$et{INDENT}$index) $tagStr --> (outside APP1 segment)\n");
|
4013
|
+
}
|
4014
|
+
if ($et->Options('FastScan')) {
|
4015
|
+
$et->Warn('Ignored Leica MakerNote trailer');
|
4016
|
+
} else {
|
4017
|
+
require Image::ExifTool::Fixup;
|
4018
|
+
$$et{LeicaTrailer} = {
|
4019
|
+
TagInfo => $tagInfo || $tmpInfo,
|
4020
|
+
Offset => $base + $valuePtr + $dataPos,
|
4021
|
+
Size => $size,
|
4022
|
+
Fixup => new Image::ExifTool::Fixup,
|
4023
|
+
};
|
4024
|
+
}
|
4025
|
+
} else {
|
4026
|
+
$et->Warn("Bad $name offset for $tagStr");
|
4027
|
+
++$warnCount;
|
4028
|
+
}
|
4029
|
+
unless (defined $buff) {
|
4030
|
+
$valueDataPt = '';
|
4031
|
+
$valueDataPos = $valuePtr + $dataPos;
|
4032
|
+
$valueDataLen = 0;
|
4033
|
+
$valuePtr = 0;
|
4034
|
+
$bad = 1;
|
4035
|
+
}
|
4036
|
+
}
|
4037
|
+
}
|
4038
|
+
# warn about suspect offsets if they didn't already cause another warning
|
4039
|
+
if (defined $suspect and $suspect == $warnCount) {
|
4040
|
+
my $tagStr = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
|
4041
|
+
if ($et->Warn("Suspicious $name offset for $tagStr", $inMakerNotes)) {
|
4042
|
+
++$warnCount;
|
4043
|
+
next unless $verbose;
|
4044
|
+
}
|
4045
|
+
}
|
4046
|
+
}
|
4047
|
+
# treat single unknown byte as int8u
|
4048
|
+
$formatStr = 'int8u' if $format == 7 and $count == 1;
|
4049
|
+
|
4050
|
+
my ($val, $subdir, $wrongFormat);
|
4051
|
+
if ($tagID > 0xf000 and $tagTablePtr eq \%Image::ExifTool::Exif::Main) {
|
4052
|
+
my $oldInfo = $$tagTablePtr{$tagID};
|
4053
|
+
if ((not $oldInfo or (ref $oldInfo eq 'HASH' and $$oldInfo{Condition} and
|
4054
|
+
not $$oldInfo{PSRaw})) and not $bad)
|
4055
|
+
{
|
4056
|
+
# handle special case of Photoshop RAW tags (0xfde8-0xfe58)
|
4057
|
+
# --> generate tags from the value if possible
|
4058
|
+
$val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize);
|
4059
|
+
if (defined $val and $val =~ /(.*): (.*)/) {
|
4060
|
+
my $tag = $1;
|
4061
|
+
$val = $2;
|
4062
|
+
$tag =~ s/'s//; # remove 's (so "Owner's Name" becomes "OwnerName")
|
4063
|
+
$tag =~ tr/a-zA-Z0-9_//cd; # remove unknown characters
|
4064
|
+
if ($tag) {
|
4065
|
+
$tagInfo = {
|
4066
|
+
Name => $tag,
|
4067
|
+
Condition => '$$self{TIFF_TYPE} ne "DCR"',
|
4068
|
+
ValueConv => '$_=$val;s/^.*: //;$_', # remove descr
|
4069
|
+
PSRaw => 1, # (just as flag to avoid adding this again)
|
4070
|
+
};
|
4071
|
+
AddTagToTable($tagTablePtr, $tagID, $tagInfo);
|
4072
|
+
# generate conditional list if a conditional tag already existed
|
4073
|
+
$$tagTablePtr{$tagID} = [ $oldInfo, $tagInfo ] if $oldInfo;
|
4074
|
+
}
|
4075
|
+
}
|
4076
|
+
}
|
4077
|
+
}
|
4078
|
+
if (defined $tagInfo and not $tagInfo) {
|
4079
|
+
if ($bad) {
|
4080
|
+
undef $tagInfo;
|
4081
|
+
} else {
|
4082
|
+
# GetTagInfo() required the value for a Condition
|
4083
|
+
my $tmpVal = substr($$valueDataPt, $valuePtr, $readSize < 128 ? $readSize : 128);
|
4084
|
+
# (use original format name in this call -- $formatStr may have been changed to int8u)
|
4085
|
+
$tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$tmpVal,
|
4086
|
+
$formatName[$format], $count);
|
4087
|
+
}
|
4088
|
+
}
|
4089
|
+
# make sure we are handling the 'ifd' format properly
|
4090
|
+
if (($format == 13 or $format == 18) and (not $tagInfo or not $$tagInfo{SubIFD})) {
|
4091
|
+
my $str = sprintf('%s tag 0x%.4x IFD format not handled', $dirName, $tagID);
|
4092
|
+
$et->Warn($str, $inMakerNotes);
|
4093
|
+
}
|
4094
|
+
if (defined $tagInfo) {
|
4095
|
+
my $readFormat = $$tagInfo{Format};
|
4096
|
+
$subdir = $$tagInfo{SubDirectory};
|
4097
|
+
# unless otherwise specified, all SubDirectory data except
|
4098
|
+
# EXIF SubIFD offsets should be unformatted
|
4099
|
+
$readFormat = 'undef' if $subdir and not $$tagInfo{SubIFD} and not $readFormat;
|
4100
|
+
# override EXIF format if specified
|
4101
|
+
if ($readFormat) {
|
4102
|
+
$formatStr = $readFormat;
|
4103
|
+
my $newNum = $formatNumber{$formatStr};
|
4104
|
+
if ($newNum and $newNum != $format) {
|
4105
|
+
$origFormStr = $formatName[$format] . '[' . $count . ']';
|
4106
|
+
$format = $newNum;
|
4107
|
+
# adjust number of items for new format size
|
4108
|
+
$count = int($size / $formatSize[$format]);
|
4109
|
+
}
|
4110
|
+
}
|
4111
|
+
# verify that offset-type values are integral
|
4112
|
+
if (($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) and not $intFormat{$formatStr}) {
|
4113
|
+
$et->Warn("Wrong format ($formatStr) for $name $$tagInfo{Name}");
|
4114
|
+
next unless $verbose;
|
4115
|
+
$wrongFormat = 1;
|
4116
|
+
}
|
4117
|
+
} else {
|
4118
|
+
next unless $verbose;
|
4119
|
+
}
|
4120
|
+
unless ($bad) {
|
4121
|
+
# limit maximum length of data to reformat
|
4122
|
+
# (avoids long delays when processing some corrupted files)
|
4123
|
+
if ($count > 100000 and $formatStr !~ /^(undef|string|binary)$/) {
|
4124
|
+
my $tagName = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
|
4125
|
+
my $minor = $count > 2000000 ? 0 : 2;
|
4126
|
+
next if $et->Warn("Ignoring $dirName $tagName with excessive count", $minor);
|
4127
|
+
}
|
4128
|
+
# convert according to specified format
|
4129
|
+
$val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational);
|
4130
|
+
# re-code if necessary
|
4131
|
+
if ($strEnc and $formatStr eq 'string' and defined $val) {
|
4132
|
+
$val = $et->Decode($val, $strEnc);
|
4133
|
+
}
|
4134
|
+
}
|
4135
|
+
|
4136
|
+
if ($verbose) {
|
4137
|
+
my $tval = $val;
|
4138
|
+
# also show as a rational
|
4139
|
+
$tval .= " ($rational)" if defined $rational;
|
4140
|
+
if ($htmlDump) {
|
4141
|
+
my ($tagName, $colName);
|
4142
|
+
if ($tagID == 0x927c and $dirName eq 'ExifIFD') {
|
4143
|
+
$tagName = 'MakerNotes';
|
4144
|
+
} elsif ($tagInfo) {
|
4145
|
+
$tagName = $$tagInfo{Name};
|
4146
|
+
} else {
|
4147
|
+
$tagName = sprintf("Tag 0x%.4x",$tagID);
|
4148
|
+
}
|
4149
|
+
my $dname = sprintf("${name}-%.2d", $index);
|
4150
|
+
# build our tool tip
|
4151
|
+
$size < 0 and $size = $count * $formatSize[$format];
|
4152
|
+
my $fstr = "$formatName[$format]\[$count]";
|
4153
|
+
$fstr = "$origFormStr read as $fstr" if $origFormStr and $origFormStr ne $fstr;
|
4154
|
+
$fstr .= ' <-- WRONG' if $wrongFormat;
|
4155
|
+
my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) .
|
4156
|
+
"Format: $fstr\nSize: $size bytes\n";
|
4157
|
+
if ($size > 4) {
|
4158
|
+
my $offPt = Get32u($dataPt,$entry+8);
|
4159
|
+
my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0);
|
4160
|
+
$tip .= sprintf("Value offset: 0x%.4x\n", $offPt);
|
4161
|
+
# highlight tag name (red for bad size)
|
4162
|
+
my $style = ($bad or not defined $tval) ? 'V' : 'H';
|
4163
|
+
if ($actPt != $offPt) {
|
4164
|
+
$tip .= sprintf("Actual offset: 0x%.4x\n", $actPt);
|
4165
|
+
my $sign = $actPt < $offPt ? '-' : '';
|
4166
|
+
$tip .= sprintf("Offset base: ${sign}0x%.4x\n", abs($actPt - $offPt));
|
4167
|
+
$style = 'F' if $style eq 'H'; # purple for different offsets
|
4168
|
+
}
|
4169
|
+
$colName = "<span class=$style>$tagName</span>";
|
4170
|
+
$colName .= ' <span class=V>(odd)</span>' if $offPt & 0x01;
|
4171
|
+
} else {
|
4172
|
+
$colName = $tagName;
|
4173
|
+
}
|
4174
|
+
$colName .= ' <span class=V>(err)</span>' if $wrongFormat;
|
4175
|
+
if (not defined $tval) {
|
4176
|
+
$tval = '<bad size/offset>';
|
4177
|
+
} else {
|
4178
|
+
$tval = substr($tval,0,28) . '[...]' if length($tval) > 32;
|
4179
|
+
if ($formatStr =~ /^(string|undef|binary)/) {
|
4180
|
+
# translate non-printable characters
|
4181
|
+
$tval =~ tr/\x00-\x1f\x7f-\xff/./;
|
4182
|
+
} elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
|
4183
|
+
if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) {
|
4184
|
+
$tval = sprintf('0x%.4x', $tval);
|
4185
|
+
my $actPt = $val + $base - ($$et{EXIF_POS} || 0);
|
4186
|
+
if ($actPt != $val) {
|
4187
|
+
$tval .= sprintf("\nActual offset: 0x%.4x", $actPt);
|
4188
|
+
my $sign = $actPt < $val ? '-' : '';
|
4189
|
+
$tval .= sprintf("\nOffset base: ${sign}0x%.4x", abs($actPt - $val));
|
4190
|
+
}
|
4191
|
+
} elsif ($$tagInfo{PrintHex}) {
|
4192
|
+
$tval = sprintf('0x%x', $tval);
|
4193
|
+
}
|
4194
|
+
}
|
4195
|
+
}
|
4196
|
+
$tip .= "Value: $tval";
|
4197
|
+
$et->HDump($entry+$dataPos+$base, 12, "$dname $colName", $tip, 1);
|
4198
|
+
next if $valueDataLen < 0; # don't process bad pointer entry
|
4199
|
+
if ($size > 4) {
|
4200
|
+
my $exifDumpPos = $valuePtr + $valueDataPos + $base;
|
4201
|
+
my $flag = 0;
|
4202
|
+
if ($subdir) {
|
4203
|
+
if ($$tagInfo{MakerNotes}) {
|
4204
|
+
$flag = 0x04;
|
4205
|
+
} elsif ($$tagInfo{NestedHtmlDump}) {
|
4206
|
+
$flag = $$tagInfo{NestedHtmlDump} == 2 ? 0x10 : 0x04;
|
4207
|
+
}
|
4208
|
+
}
|
4209
|
+
# add value data block (underlining maker notes data)
|
4210
|
+
$et->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag);
|
4211
|
+
}
|
4212
|
+
} else {
|
4213
|
+
my $fstr = $formatName[$format];
|
4214
|
+
$fstr = "$origFormStr read as $fstr" if $origFormStr;
|
4215
|
+
$et->VerboseInfo($tagID, $tagInfo,
|
4216
|
+
Table => $tagTablePtr,
|
4217
|
+
Index => $index,
|
4218
|
+
Value => $tval,
|
4219
|
+
DataPt => $valueDataPt,
|
4220
|
+
DataPos => $valueDataPos + $base,
|
4221
|
+
Size => $size,
|
4222
|
+
Start => $valuePtr,
|
4223
|
+
Format => $fstr,
|
4224
|
+
Count => $count,
|
4225
|
+
);
|
4226
|
+
}
|
4227
|
+
next if not $tagInfo or $wrongFormat;
|
4228
|
+
}
|
4229
|
+
next unless defined $val;
|
4230
|
+
#..............................................................................
|
4231
|
+
# Handle SubDirectory tag types
|
4232
|
+
#
|
4233
|
+
if ($subdir) {
|
4234
|
+
# don't process empty subdirectories
|
4235
|
+
unless ($size) {
|
4236
|
+
unless ($$tagInfo{MakerNotes} or $inMakerNotes) {
|
4237
|
+
$et->Warn("Empty $$tagInfo{Name} data", 1);
|
4238
|
+
}
|
4239
|
+
next;
|
4240
|
+
}
|
4241
|
+
my (@values, $newTagTable, $dirNum, $newByteOrder, $invalid);
|
4242
|
+
my $tagStr = $$tagInfo{Name};
|
4243
|
+
if ($$subdir{MaxSubdirs}) {
|
4244
|
+
@values = split ' ', $val;
|
4245
|
+
# limit the number of subdirectories we parse
|
4246
|
+
my $over = @values - $$subdir{MaxSubdirs};
|
4247
|
+
if ($over > 0) {
|
4248
|
+
$et->Warn("Ignoring $over $tagStr directories");
|
4249
|
+
splice @values, $$subdir{MaxSubdirs};
|
4250
|
+
}
|
4251
|
+
$val = shift @values;
|
4252
|
+
}
|
4253
|
+
if ($$subdir{TagTable}) {
|
4254
|
+
$newTagTable = GetTagTable($$subdir{TagTable});
|
4255
|
+
$newTagTable or warn("Unknown tag table $$subdir{TagTable}"), next;
|
4256
|
+
} else {
|
4257
|
+
$newTagTable = $tagTablePtr; # use existing table
|
4258
|
+
}
|
4259
|
+
# loop through all sub-directories specified by this tag
|
4260
|
+
for ($dirNum=0; ; ++$dirNum) {
|
4261
|
+
my $subdirBase = $base;
|
4262
|
+
my $subdirDataPt = $valueDataPt;
|
4263
|
+
my $subdirDataPos = $valueDataPos;
|
4264
|
+
my $subdirDataLen = $valueDataLen;
|
4265
|
+
my $subdirStart = $valuePtr;
|
4266
|
+
if (defined $$subdir{Start}) {
|
4267
|
+
# set local $valuePtr relative to file $base for eval
|
4268
|
+
my $valuePtr = $subdirStart + $subdirDataPos;
|
4269
|
+
#### eval Start ($valuePtr, $val)
|
4270
|
+
my $newStart = eval($$subdir{Start});
|
4271
|
+
unless (Image::ExifTool::IsInt($newStart)) {
|
4272
|
+
$et->Warn("Bad value for $tagStr");
|
4273
|
+
last;
|
4274
|
+
}
|
4275
|
+
# convert back to relative to $subdirDataPt
|
4276
|
+
$newStart -= $subdirDataPos;
|
4277
|
+
# adjust directory size if necessary
|
4278
|
+
unless ($$tagInfo{SubIFD} or $$subdir{BadOffset}) {
|
4279
|
+
$size -= $newStart - $subdirStart;
|
4280
|
+
}
|
4281
|
+
$subdirStart = $newStart;
|
4282
|
+
}
|
4283
|
+
# this is a pain, but some maker notes are always a specific
|
4284
|
+
# byte order, regardless of the byte order of the file
|
4285
|
+
my $oldByteOrder = GetByteOrder();
|
4286
|
+
$newByteOrder = $$subdir{ByteOrder};
|
4287
|
+
if ($newByteOrder) {
|
4288
|
+
if ($newByteOrder =~ /^Little/i) {
|
4289
|
+
$newByteOrder = 'II';
|
4290
|
+
} elsif ($newByteOrder =~ /^Big/i) {
|
4291
|
+
$newByteOrder = 'MM';
|
4292
|
+
} elsif ($$subdir{OffsetPt}) {
|
4293
|
+
undef $newByteOrder;
|
4294
|
+
warn "Can't have variable byte ordering for SubDirectories using OffsetPt";
|
4295
|
+
last;
|
4296
|
+
} elsif ($subdirStart + 2 <= $subdirDataLen) {
|
4297
|
+
# attempt to determine the byte ordering by checking
|
4298
|
+
# at the number of directory entries. This is an int16u
|
4299
|
+
# that should be a reasonable value.
|
4300
|
+
my $num = Get16u($subdirDataPt, $subdirStart);
|
4301
|
+
if ($num & 0xff00 and ($num>>8) > ($num&0xff)) {
|
4302
|
+
# This looks wrong, we shouldn't have this many entries
|
4303
|
+
my %otherOrder = ( II=>'MM', MM=>'II' );
|
4304
|
+
$newByteOrder = $otherOrder{$oldByteOrder};
|
4305
|
+
} else {
|
4306
|
+
$newByteOrder = $oldByteOrder;
|
4307
|
+
}
|
4308
|
+
}
|
4309
|
+
} else {
|
4310
|
+
$newByteOrder = $oldByteOrder;
|
4311
|
+
}
|
4312
|
+
# set base offset if necessary
|
4313
|
+
if ($$subdir{Base}) {
|
4314
|
+
# calculate subdirectory start relative to $base for eval
|
4315
|
+
my $start = $subdirStart + $subdirDataPos;
|
4316
|
+
#### eval Base ($start,$base)
|
4317
|
+
$subdirBase = eval($$subdir{Base}) + $base;
|
4318
|
+
}
|
4319
|
+
# add offset to the start of the directory if necessary
|
4320
|
+
if ($$subdir{OffsetPt}) {
|
4321
|
+
#### eval OffsetPt ($valuePtr)
|
4322
|
+
my $pos = eval $$subdir{OffsetPt};
|
4323
|
+
if ($pos + 4 > $subdirDataLen) {
|
4324
|
+
$et->Warn("Bad $tagStr OffsetPt");
|
4325
|
+
last;
|
4326
|
+
}
|
4327
|
+
SetByteOrder($newByteOrder);
|
4328
|
+
$subdirStart += Get32u($subdirDataPt, $pos);
|
4329
|
+
SetByteOrder($oldByteOrder);
|
4330
|
+
}
|
4331
|
+
if ($subdirStart < 0 or $subdirStart + 2 > $subdirDataLen) {
|
4332
|
+
# convert $subdirStart back to a file offset
|
4333
|
+
if ($raf) {
|
4334
|
+
# reset SubDirectory buffer (we will load it later)
|
4335
|
+
my $buff = '';
|
4336
|
+
$subdirDataPt = \$buff;
|
4337
|
+
$subdirDataLen = $size = length $buff;
|
4338
|
+
} else {
|
4339
|
+
my $msg = "Bad $tagStr SubDirectory start";
|
4340
|
+
if ($verbose > 0) {
|
4341
|
+
if ($subdirStart < 0) {
|
4342
|
+
$msg .= " (directory start $subdirStart is before EXIF start)";
|
4343
|
+
} else {
|
4344
|
+
my $end = $subdirStart + $size;
|
4345
|
+
$msg .= " (directory end is $end but EXIF size is only $subdirDataLen)";
|
4346
|
+
}
|
4347
|
+
}
|
4348
|
+
$et->Warn($msg);
|
4349
|
+
last;
|
4350
|
+
}
|
4351
|
+
}
|
4352
|
+
|
4353
|
+
# must update subdirDataPos if $base changes for this subdirectory
|
4354
|
+
$subdirDataPos += $base - $subdirBase;
|
4355
|
+
|
4356
|
+
# build information hash for new directory
|
4357
|
+
my %subdirInfo = (
|
4358
|
+
Name => $tagStr,
|
4359
|
+
Base => $subdirBase,
|
4360
|
+
DataPt => $subdirDataPt,
|
4361
|
+
DataPos => $subdirDataPos,
|
4362
|
+
DataLen => $subdirDataLen,
|
4363
|
+
DirStart => $subdirStart,
|
4364
|
+
DirLen => $size,
|
4365
|
+
RAF => $raf,
|
4366
|
+
Parent => $dirName,
|
4367
|
+
DirName => $$subdir{DirName},
|
4368
|
+
FixBase => $$subdir{FixBase},
|
4369
|
+
FixOffsets => $$subdir{FixOffsets},
|
4370
|
+
EntryBased => $$subdir{EntryBased},
|
4371
|
+
TagInfo => $tagInfo,
|
4372
|
+
SubIFD => $$tagInfo{SubIFD},
|
4373
|
+
Subdir => $subdir,
|
4374
|
+
);
|
4375
|
+
# (remember: some cameras incorrectly write maker notes in IFD0)
|
4376
|
+
if ($$tagInfo{MakerNotes}) {
|
4377
|
+
# don't parse makernotes if FastScan > 1
|
4378
|
+
my $fast = $et->Options('FastScan');
|
4379
|
+
last if $fast and $fast > 1;
|
4380
|
+
$subdirInfo{MakerNoteAddr} = $valuePtr + $valueDataPos + $base;
|
4381
|
+
$subdirInfo{NoFixBase} = 1 if defined $$subdir{Base};
|
4382
|
+
}
|
4383
|
+
# set directory IFD name from group name of family 1 if it exists,
|
4384
|
+
# unless the tag is writable as a block in which case group 1 may
|
4385
|
+
# have been set automatically
|
4386
|
+
if ($$tagInfo{Groups} and not $$tagInfo{Writable}) {
|
4387
|
+
$subdirInfo{DirName} = $$tagInfo{Groups}{1};
|
4388
|
+
# number multiple subdirectories
|
4389
|
+
$subdirInfo{DirName} =~ s/\d*$/$dirNum/ if $dirNum;
|
4390
|
+
}
|
4391
|
+
SetByteOrder($newByteOrder); # set byte order for this subdir
|
4392
|
+
# validate the subdirectory if necessary
|
4393
|
+
my $dirData = $subdirDataPt; # set data pointer to be used in eval
|
4394
|
+
#### eval Validate ($val, $dirData, $subdirStart, $size)
|
4395
|
+
my $ok = 0;
|
4396
|
+
if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
|
4397
|
+
$et->Warn("Invalid $tagStr data");
|
4398
|
+
$invalid = 1;
|
4399
|
+
} else {
|
4400
|
+
if (not $subdirInfo{DirName} and $inMakerNotes) {
|
4401
|
+
$subdirInfo{DirName} = $$tagInfo{Name};
|
4402
|
+
}
|
4403
|
+
# process the subdirectory
|
4404
|
+
$ok = $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
|
4405
|
+
}
|
4406
|
+
# print debugging information if there were errors
|
4407
|
+
if (not $ok and $verbose > 1 and $subdirStart != $valuePtr) {
|
4408
|
+
my $out = $et->Options('TextOut');
|
4409
|
+
printf $out "%s (SubDirectory start = 0x%x)\n", $$et{INDENT}, $subdirStart;
|
4410
|
+
}
|
4411
|
+
SetByteOrder($oldByteOrder); # restore original byte swapping
|
4412
|
+
|
4413
|
+
@values or last;
|
4414
|
+
$val = shift @values; # continue with next subdir
|
4415
|
+
}
|
4416
|
+
my $doMaker = $et->Options('MakerNotes');
|
4417
|
+
next unless $doMaker or $$et{REQ_TAG_LOOKUP}{lc($tagStr)} or
|
4418
|
+
$$tagInfo{BlockExtract};
|
4419
|
+
# extract as a block if specified
|
4420
|
+
if ($$tagInfo{MakerNotes}) {
|
4421
|
+
# save maker note byte order (if it was significant and valid)
|
4422
|
+
if ($$subdir{ByteOrder} and not $invalid) {
|
4423
|
+
$$et{MAKER_NOTE_BYTE_ORDER} =
|
4424
|
+
defined ($$et{UnknownByteOrder}) ?
|
4425
|
+
$$et{UnknownByteOrder} : $newByteOrder;
|
4426
|
+
}
|
4427
|
+
if ($doMaker and $doMaker eq '2') {
|
4428
|
+
# extract maker notes without rebuilding (no fixup information)
|
4429
|
+
delete $$et{MAKER_NOTE_FIXUP};
|
4430
|
+
} elsif (not $$tagInfo{NotIFD}) {
|
4431
|
+
# this is a pain, but we must rebuild EXIF-typemaker notes to
|
4432
|
+
# include all the value data if data was outside the maker notes
|
4433
|
+
my %makerDirInfo = (
|
4434
|
+
Name => $tagStr,
|
4435
|
+
Base => $base,
|
4436
|
+
DataPt => $valueDataPt,
|
4437
|
+
DataPos => $valueDataPos,
|
4438
|
+
DataLen => $valueDataLen,
|
4439
|
+
DirStart => $valuePtr,
|
4440
|
+
DirLen => $size,
|
4441
|
+
RAF => $raf,
|
4442
|
+
Parent => $dirName,
|
4443
|
+
DirName => 'MakerNotes',
|
4444
|
+
FixOffsets => $$subdir{FixOffsets},
|
4445
|
+
TagInfo => $tagInfo,
|
4446
|
+
);
|
4447
|
+
$makerDirInfo{FixBase} = 1 if $$subdir{FixBase};
|
4448
|
+
# rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP})
|
4449
|
+
my $val2 = RebuildMakerNotes($et, $newTagTable, \%makerDirInfo);
|
4450
|
+
if (defined $val2) {
|
4451
|
+
$val = $val2;
|
4452
|
+
} elsif ($size > 4) {
|
4453
|
+
$et->Warn('Error rebuilding maker notes (may be corrupt)');
|
4454
|
+
}
|
4455
|
+
}
|
4456
|
+
} else {
|
4457
|
+
# extract this directory as a block if specified
|
4458
|
+
next unless $$tagInfo{Writable};
|
4459
|
+
}
|
4460
|
+
}
|
4461
|
+
#..............................................................................
|
4462
|
+
# convert to absolute offsets if this tag is an offset
|
4463
|
+
#### eval IsOffset ($val, $et)
|
4464
|
+
if ($$tagInfo{IsOffset} and eval $$tagInfo{IsOffset}) {
|
4465
|
+
my $offsetBase = $$tagInfo{IsOffset} eq '2' ? $firstBase : $base;
|
4466
|
+
$offsetBase += $$et{BASE};
|
4467
|
+
# handle offsets which use a wrong base (Minolta A200)
|
4468
|
+
if ($$tagInfo{WrongBase}) {
|
4469
|
+
my $self = $et;
|
4470
|
+
#### eval WrongBase ($self)
|
4471
|
+
$offsetBase += eval $$tagInfo{WrongBase} || 0;
|
4472
|
+
}
|
4473
|
+
my @vals = split(' ',$val);
|
4474
|
+
foreach $val (@vals) {
|
4475
|
+
$val += $offsetBase;
|
4476
|
+
}
|
4477
|
+
$val = join(' ', @vals);
|
4478
|
+
}
|
4479
|
+
# save the value of this tag
|
4480
|
+
$tagKey = $et->FoundTag($tagInfo, $val);
|
4481
|
+
if (defined $tagKey) {
|
4482
|
+
# set the group 1 name for tags in specified tables
|
4483
|
+
$et->SetGroup($tagKey, $dirName) if $$tagTablePtr{SET_GROUP1};
|
4484
|
+
# save original components of rational numbers (used when copying)
|
4485
|
+
$$et{RATIONAL}{$tagKey} = $rational if defined $rational;
|
4486
|
+
}
|
4487
|
+
}
|
4488
|
+
|
4489
|
+
# scan for subsequent IFD's if specified
|
4490
|
+
if ($$dirInfo{Multi} and $bytesFromEnd >= 4) {
|
4491
|
+
my $offset = Get32u($dataPt, $dirEnd);
|
4492
|
+
if ($offset) {
|
4493
|
+
my $subdirStart = $offset - $dataPos;
|
4494
|
+
# use same directory information for trailing directory,
|
4495
|
+
# but change the start location (ProcessDirectory will
|
4496
|
+
# test to make sure we don't reprocess the same dir twice)
|
4497
|
+
my %newDirInfo = %$dirInfo;
|
4498
|
+
$newDirInfo{DirStart} = $subdirStart;
|
4499
|
+
# increment IFD number
|
4500
|
+
my $ifdNum = $newDirInfo{DirName} =~ s/(\d+)$// ? $1 : 0;
|
4501
|
+
$newDirInfo{DirName} .= $ifdNum + 1;
|
4502
|
+
# must validate SubIFD1 because the nextIFD pointer is invalid for some RAW formats
|
4503
|
+
if ($newDirInfo{DirName} ne 'SubIFD1' or ValidateIFD(\%newDirInfo)) {
|
4504
|
+
$$et{INDENT} =~ s/..$//; # keep indent the same
|
4505
|
+
my $cur = pop @{$$et{PATH}};
|
4506
|
+
$et->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0;
|
4507
|
+
push @{$$et{PATH}}, $cur;
|
4508
|
+
} elsif ($verbose or $$et{TIFF_TYPE} eq 'TIFF') {
|
4509
|
+
$et->Warn('Ignored bad IFD linked from SubIFD');
|
4510
|
+
}
|
4511
|
+
}
|
4512
|
+
}
|
4513
|
+
return $success;
|
4514
|
+
}
|
4515
|
+
|
4516
|
+
1; # end
|
4517
|
+
|
4518
|
+
__END__
|
4519
|
+
|
4520
|
+
=head1 NAME
|
4521
|
+
|
4522
|
+
Image::ExifTool::Exif - Read EXIF/TIFF meta information
|
4523
|
+
|
4524
|
+
=head1 SYNOPSIS
|
4525
|
+
|
4526
|
+
This module is required by Image::ExifTool.
|
4527
|
+
|
4528
|
+
=head1 DESCRIPTION
|
4529
|
+
|
4530
|
+
This module contains routines required by Image::ExifTool for processing
|
4531
|
+
EXIF and TIFF meta information.
|
4532
|
+
|
4533
|
+
=head1 AUTHOR
|
4534
|
+
|
4535
|
+
Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
|
4536
|
+
|
4537
|
+
This library is free software; you can redistribute it and/or modify it
|
4538
|
+
under the same terms as Perl itself.
|
4539
|
+
|
4540
|
+
=head1 REFERENCES
|
4541
|
+
|
4542
|
+
=over 4
|
4543
|
+
|
4544
|
+
=item L<http://www.exif.org/Exif2-2.PDF>
|
4545
|
+
|
4546
|
+
=item L<http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf>
|
4547
|
+
|
4548
|
+
=item L<http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf>
|
4549
|
+
|
4550
|
+
=item L<http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf>
|
4551
|
+
|
4552
|
+
=item L<http://www.adobe.com/products/dng/pdfs/dng_spec.pdf>
|
4553
|
+
|
4554
|
+
=item L<http://www.awaresystems.be/imaging/tiff/tifftags.html>
|
4555
|
+
|
4556
|
+
=item L<http://www.remotesensing.org/libtiff/TIFFTechNote2.html>
|
4557
|
+
|
4558
|
+
=item L<http://www.exif.org/dcf.PDF>
|
4559
|
+
|
4560
|
+
=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
|
4561
|
+
|
4562
|
+
=item L<http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf>
|
4563
|
+
|
4564
|
+
=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html>
|
4565
|
+
|
4566
|
+
=item L<http://hul.harvard.edu/jhove/tiff-tags.html>
|
4567
|
+
|
4568
|
+
=item L<http://www.microsoft.com/whdc/xps/wmphoto.mspx>
|
4569
|
+
|
4570
|
+
=item L<http://www.asmail.be/msg0054681802.html>
|
4571
|
+
|
4572
|
+
=item L<http://crousseau.free.fr/imgfmt_raw.htm>
|
4573
|
+
|
4574
|
+
=item L<http://www.cybercom.net/~dcoffin/dcraw/>
|
4575
|
+
|
4576
|
+
=item L<http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml>
|
4577
|
+
|
4578
|
+
=item L<http://community.roxen.com/developers/idocs/rfc/rfc3949.html>
|
4579
|
+
|
4580
|
+
=item L<http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01>
|
4581
|
+
|
4582
|
+
=item L<http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf>
|
4583
|
+
|
4584
|
+
=back
|
4585
|
+
|
4586
|
+
=head1 ACKNOWLEDGEMENTS
|
4587
|
+
|
4588
|
+
Thanks to Jeremy Brown for the 35efl tags, and Matt Madrid for his help with
|
4589
|
+
the XP character code conversions.
|
4590
|
+
|
4591
|
+
=head1 SEE ALSO
|
4592
|
+
|
4593
|
+
L<Image::ExifTool::TagNames/EXIF Tags>,
|
4594
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
4595
|
+
|
4596
|
+
=cut
|