From 18a13e994515a90942c18a412a2024ccb1eb0aac Mon Sep 17 00:00:00 2001 From: Baptiste Gaillard Date: Tue, 9 Aug 2016 00:25:08 +0200 Subject: [PATCH] Continue implementation. --- .../Imaging/ImageMetadataReader.php | 314 +++++++++++++++++- .../Metadata/Exif/ExifThumbnailDescriptor.php | 19 ++ .../Metadata/Exif/ExifThumbnailDirectory.php | 56 ++++ .../Metadata/Icc/IccDescriptor.php | 19 ++ .../Metadata/Icc/IccDirectory.php | 179 ++++++++++ .../MetadataExtractor/Metadata/Schema.php | 29 ++ .../Metadata/Xmp/XmpDescriptor.php | 22 ++ .../Metadata/Xmp/XmpDirectory.php | 257 ++++++++++++++ .../Imaging/ImageMetadataReaderTest.php | 24 +- 9 files changed, 916 insertions(+), 3 deletions(-) create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Exif/ExifThumbnailDescriptor.php create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Exif/ExifThumbnailDirectory.php create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Icc/IccDescriptor.php create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Icc/IccDirectory.php create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Schema.php create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Xmp/XmpDescriptor.php create mode 100644 src/main/php/Gomoob/MetadataExtractor/Metadata/Xmp/XmpDirectory.php diff --git a/src/main/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReader.php b/src/main/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReader.php index 72f0b62..cee65e8 100644 --- a/src/main/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReader.php +++ b/src/main/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReader.php @@ -19,6 +19,9 @@ use Gomoob\MetadataExtractor\Metadata\Jfif\JfifDirectory; use Gomoob\MetadataExtractor\Metadata\Exif\ExifIFD0Directory; use Gomoob\MetadataExtractor\Metadata\Exif\ExifSubIFDDirectory; +use Gomoob\MetadataExtractor\Metadata\Exif\ExifThumbnailDirectory; +use Gomoob\MetadataExtractor\Metadata\Xmp\XmpDirectory; +use Gomoob\MetadataExtractor\Metadata\Icc\IccDirectory; /** * Reads metadata from any supported file format. @@ -108,8 +111,308 @@ private static function addTagToDirectory(Directory $directory, $tagLine) var_dump($nameAndDescription[0]); var_dump($nameAndDescription[1]); switch ($nameAndDescription[1]) { - case '': + case 'Interoperability Index': break; + case 'Interoperability Version': + break; + case 'New Subfile Type': + break; + case 'Subfile Type': + break; + case 'Image Width': + break; + case 'Image Height': + break; + case 'Bits Per Sample': + break; + case 'Compression': + break; + case 'Photometric Interpretation': + break; + case 'Thresholding': + break; + case 'Fill Order': + break; + case 'Document Name': + break; + case 'Image Description': + break; + case 'Make': + break; + case 'Model': + break; + case 'Strip Offsets': + break; + case 'Orientation': + break; + case 'Samples Per Pixel': + break; + case 'Rows Per Strip': + break; + case 'Strip Byte Counts': + break; + case 'Minimum Sample Value': + break; + case 'Maximum Sample Value': + break; + case 'X Resolution': + break; + case 'Y Resolution': + break; + case 'Planar Configuration': + break; + case 'Page Name': + break; + case 'Resolution Unit': + break; + case 'Transfer Function': + break; + case 'Software': + break; + case 'Date/Time': + break; + case 'Artist': + break; + case 'Predictor': + break; + case 'Host Computer': + break; + case 'White Point': + break; + case 'Primary Chromaticities': + break; + case 'Tile Width': + break; + case 'Tile Length': + break; + case 'Tile Offsets': + break; + case 'Tile Byte Counts': + break; + case 'Sub IFD Pointer(s)': + break; + case 'Transfer Range': + break; + case 'JPEG Tables': + break; + case 'JPEG Proc': + break; + case 'YCbCr Coefficients': + break; + case 'YCbCr Sub-Sampling': + break; + case 'YCbCr Positioning': + break; + case 'Reference Black/White': + break; + case 'Strip Row Counts': + break; + case 'Application Notes': + break; + case 'Related Image File Format': + break; + case 'Related Image Width': + break; + case 'Related Image Height': + break; + case 'Rating': + break; + case 'CFA Repeat Pattern Dim': + break; + case 'CFA Pattern': + break; + case 'Battery Level': + break; + case 'Copyright': + break; + case 'Exposure Time': + break; + case 'F-Number': + break; + case 'IPTC/NAA': + break; + case 'Inter Color Profile': + break; + case 'Exposure Program': + break; + case 'Spectral Sensitivity': + break; + case 'ISO Speed Ratings': + break; + case 'Opto-electric Conversion Function (OECF)': + break; + case 'Interlace': + break; + case 'Time Zone Offset': + break; + case 'Self Timer Mode': + break; + case 'Sensitivity Type': + break; + case 'Standard Output Sensitivity': + break; + case 'Recommended Exposure Index': + break; + case 'Time Zone Offset': + break; + case 'Self Timer Mode': + break; + case 'Exif Version': + break; + case 'Date/Time Original': + break; + case 'Date/Time Digitized': + break; + case 'Components Configuration': + break; + case 'Compressed Bits Per Pixel': + break; + case 'Shutter Speed Value': + break; + case 'Aperture Value': + break; + case 'Brightness Value': + break; + case 'Exposure Bias Value': + break; + case 'Max Aperture Value': + break; + case 'Subject Distance': + break; + case 'Metering Mode': + break; + case 'White Balance': + break; + case 'Flash': + break; + case 'Focal Length': + break; + case 'Flash Energy': + break; + case 'Spatial Frequency Response': + break; + case 'Noise': + break; + case 'Focal Plane X Resolution': + break; + case 'Focal Plane Y Resolution': + break; + case 'Image Number': + break; + case 'Security Classification': + break; + case 'Image History': + break; + case 'Subject Location': + break; + case 'Exposure Index': + break; + case 'TIFF/EP Standard ID': + break; + case 'Makernote': + break; + case 'User Comment': + break; + case 'Sub-Sec Time': + break; + case 'Sub-Sec Time Original': + break; + case 'Sub-Sec Time Digitized': + break; + case 'Windows XP Title': + break; + case 'Windows XP Comment': + break; + case 'Windows XP Author': + break; + case 'Windows XP Keywords': + break; + case 'Windows XP Subject': + break; + case 'FlashPix Version': + break; + case 'Color Space': + break; + case 'Exif Image Width': + break; + case 'Exif Image Height': + break; + case 'Related Sound File': + break; + case 'Flash Energy': + break; + case 'Spatial Frequency Response': + break; + case 'Focal Plane X Resolution': + break; + case 'Focal Plane Y Resolution': + break; + case 'Focal Plane Resolution Unit': + break; + case 'Subject Location': + break; + case 'Exposure Index': + break; + case 'Sensing Method': + break; + case 'File Source': + break; + case 'Scene Type': + break; + case 'CFA Pattern': + break; + case 'Custom Rendered': + break; + case 'Exposure Mode': + break; + case 'White Balance Mode': + break; + case 'Digital Zoom Ratio': + break; + case 'Focal Length 35': + break; + case 'Scene Capture Type': + break; + case 'Gain Control': + break; + case 'Contrast': + break; + case 'Saturation': + break; + case 'Sharpness': + break; + case 'Device Setting Description': + break; + case 'Subject Distance Range': + break; + case 'Unique Image ID': + break; + case 'Camera Owner Name': + break; + case 'Body Serial Number': + break; + case 'Lens Specification': + break; + case 'Lens Make': + break; + case 'Lens Model': + break; + case 'Lens Serial Number': + break; + case 'Gamma': + break; + case 'Print IM': + break; + case 'Panasonic Title': + break; + case 'Panasonic Title (2)': + break; + case 'Padding': + break; + case 'Lens': + break; + default: + // TODO: Error } } elseif ($directory instanceof JfifDirectory) { switch ($nameAndDescription[0]) { @@ -262,15 +565,24 @@ private static function createDirectoryWithName($directoryName) case 'Exif SubIFD': $directory = new ExifSubIFDDirectory(); break; + case 'Exif Thumbnail': + $directory = new ExifThumbnailDirectory(); + break; case 'File': $directory = new FileMetadataDirectory(); break; + case 'ICC Profile': + $directory = new IccDirectory(); + break; case 'JFIF': $directory = new JfifDirectory(); break; case 'JPEG': $directory = new JpegDirectory(); break; + case 'XMP': + $directory = new XmpDirectory(); + break; default: throw new \RuntimeException('Unknown directory name \'' . $directoryName . '\' !'); } diff --git a/src/main/php/Gomoob/MetadataExtractor/Metadata/Exif/ExifThumbnailDescriptor.php b/src/main/php/Gomoob/MetadataExtractor/Metadata/Exif/ExifThumbnailDescriptor.php new file mode 100644 index 0000000..abcdc6e --- /dev/null +++ b/src/main/php/Gomoob/MetadataExtractor/Metadata/Exif/ExifThumbnailDescriptor.php @@ -0,0 +1,19 @@ +setDescriptor(new ExifThumbnailDescriptor($this)); + } + + /** + * {@inheritDoc} + */ + public function getName() + { + return 'Exif Thumbnail'; + } + + /** + * {@inheritDoc} + */ + protected function getTagNameMap() + { + return static::$tagNameMap; + } +} diff --git a/src/main/php/Gomoob/MetadataExtractor/Metadata/Icc/IccDescriptor.php b/src/main/php/Gomoob/MetadataExtractor/Metadata/Icc/IccDescriptor.php new file mode 100644 index 0000000..63c5331 --- /dev/null +++ b/src/main/php/Gomoob/MetadataExtractor/Metadata/Icc/IccDescriptor.php @@ -0,0 +1,19 @@ + GOMOOB SARL (http://gomoob.com) +* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE.md file) +*/ +namespace Gomoob\MetadataExtractor\Metadata\Icc; + +use Gomoob\MetadataExtractor\Metadata\Directory; + +/** + * @author Baptiste GAILLARD (baptiste.gaillard@gomoob.com) + */ +class IccDirectory extends Directory +{ + // These (smaller valued) tags have an integer value that's equal to their offset within the ICC data buffer. + + const TAG_PROFILE_BYTE_COUNT = 0; + const TAG_CMM_TYPE = 4; + const TAG_PROFILE_VERSION = 8; + const TAG_PROFILE_CLASS = 12; + const TAG_COLOR_SPACE = 16; + const TAG_PROFILE_CONNECTION_SPACE = 20; + const TAG_PROFILE_DATETIME = 24; + const TAG_SIGNATURE = 36; + const TAG_PLATFORM = 40; + const TAG_CMM_FLAGS = 44; + const TAG_DEVICE_MAKE = 48; + const TAG_DEVICE_MODEL = 52; + const TAG_DEVICE_ATTR = 56; + const TAG_RENDERING_INTENT = 64; + const TAG_XYZ_VALUES = 68; + const TAG_PROFILE_CREATOR = 80; + const TAG_TAG_COUNT = 128; + + // These tag values + // @codingStandardsIgnoreStart + const TAG_TAG_A2B0 = 0x41324230; + const TAG_TAG_A2B1 = 0x41324231; + const TAG_TAG_A2B2 = 0x41324232; + const TAG_TAG_bXYZ = 0x6258595A; + const TAG_TAG_bTRC = 0x62545243; + const TAG_TAG_B2A0 = 0x42324130; + const TAG_TAG_B2A1 = 0x42324131; + const TAG_TAG_B2A2 = 0x42324132; + const TAG_TAG_calt = 0x63616C74; + const TAG_TAG_targ = 0x74617267; + const TAG_TAG_chad = 0x63686164; + const TAG_TAG_chrm = 0x6368726D; + const TAG_TAG_cprt = 0x63707274; + const TAG_TAG_crdi = 0x63726469; + const TAG_TAG_dmnd = 0x646D6E64; + const TAG_TAG_dmdd = 0x646D6464; + const TAG_TAG_devs = 0x64657673; + const TAG_TAG_gamt = 0x67616D74; + const TAG_TAG_kTRC = 0x6B545243; + const TAG_TAG_gXYZ = 0x6758595A; + const TAG_TAG_gTRC = 0x67545243; + const TAG_TAG_lumi = 0x6C756D69; + const TAG_TAG_meas = 0x6D656173; + const TAG_TAG_bkpt = 0x626B7074; + const TAG_TAG_wtpt = 0x77747074; + const TAG_TAG_ncol = 0x6E636F6C; + const TAG_TAG_ncl2 = 0x6E636C32; + const TAG_TAG_resp = 0x72657370; + const TAG_TAG_pre0 = 0x70726530; + const TAG_TAG_pre1 = 0x70726531; + const TAG_TAG_pre2 = 0x70726532; + const TAG_TAG_desc = 0x64657363; + const TAG_TAG_pseq = 0x70736571; + const TAG_TAG_psd0 = 0x70736430; + const TAG_TAG_psd1 = 0x70736431; + const TAG_TAG_psd2 = 0x70736432; + const TAG_TAG_psd3 = 0x70736433; + const TAG_TAG_ps2s = 0x70733273; + const TAG_TAG_ps2i = 0x70733269; + const TAG_TAG_rXYZ = 0x7258595A; + const TAG_TAG_rTRC = 0x72545243; + const TAG_TAG_scrd = 0x73637264; + const TAG_TAG_scrn = 0x7363726E; + const TAG_TAG_tech = 0x74656368; + const TAG_TAG_bfd = 0x62666420; + const TAG_TAG_vued = 0x76756564; + const TAG_TAG_view = 0x76696577; + // @codingStandardsIgnoreEnd + + const TAG_APPLE_MULTI_LANGUAGE_PROFILE_NAME = 0x6473636d; + + private static $tagNameMap = [ + self::TAG_PROFILE_BYTE_COUNT => "Profile Size", + self::TAG_CMM_TYPE => "CMM Type", + self::TAG_PROFILE_VERSION => "Version", + self::TAG_PROFILE_CLASS => "Class", + self::TAG_COLOR_SPACE => "Color space", + self::TAG_PROFILE_CONNECTION_SPACE => "Profile Connection Space", + self::TAG_PROFILE_DATETIME => "Profile Date/Time", + self::TAG_SIGNATURE => "Signature", + self::TAG_PLATFORM => "Primary Platform", + self::TAG_CMM_FLAGS => "CMM Flags", + self::TAG_DEVICE_MAKE => "Device manufacturer", + self::TAG_DEVICE_MODEL => "Device model", + self::TAG_DEVICE_ATTR => "Device attributes", + self::TAG_RENDERING_INTENT => "Rendering Intent", + self::TAG_XYZ_VALUES => "XYZ values", + self::TAG_PROFILE_CREATOR => "Profile Creator", + self::TAG_TAG_COUNT => "Tag Count", + self::TAG_TAG_A2B0 => "AToB 0", + self::TAG_TAG_A2B1 => "AToB 1", + self::TAG_TAG_A2B2 => "AToB 2", + self::TAG_TAG_bXYZ => "Blue Colorant", + self::TAG_TAG_bTRC => "Blue TRC", + self::TAG_TAG_B2A0 => "BToA 0", + self::TAG_TAG_B2A1 => "BToA 1", + self::TAG_TAG_B2A2 => "BToA 2", + self::TAG_TAG_calt => "Calibration Date/Time", + self::TAG_TAG_targ => "Char Target", + self::TAG_TAG_chad => "Chromatic Adaptation", + self::TAG_TAG_chrm => "Chromaticity", + self::TAG_TAG_cprt => "Copyright", + self::TAG_TAG_crdi => "CrdInfo", + self::TAG_TAG_dmnd => "Device Mfg Description", + self::TAG_TAG_dmdd => "Device Model Description", + self::TAG_TAG_devs => "Device Settings", + self::TAG_TAG_gamt => "Gamut", + self::TAG_TAG_kTRC => "Gray TRC", + self::TAG_TAG_gXYZ => "Green Colorant", + self::TAG_TAG_gTRC => "Green TRC", + self::TAG_TAG_lumi => "Luminance", + self::TAG_TAG_meas => "Measurement", + self::TAG_TAG_bkpt => "Media Black Point", + self::TAG_TAG_wtpt => "Media White Point", + self::TAG_TAG_ncol => "Named Color", + self::TAG_TAG_ncl2 => "Named Color 2", + self::TAG_TAG_resp => "Output Response", + self::TAG_TAG_pre0 => "Preview 0", + self::TAG_TAG_pre1 => "Preview 1", + self::TAG_TAG_pre2 => "Preview 2", + self::TAG_TAG_desc => "Profile Description", + self::TAG_TAG_pseq => "Profile Sequence Description", + self::TAG_TAG_psd0 => "Ps2 CRD 0", + self::TAG_TAG_psd1 => "Ps2 CRD 1", + self::TAG_TAG_psd2 => "Ps2 CRD 2", + self::TAG_TAG_psd3 => "Ps2 CRD 3", + self::TAG_TAG_ps2s => "Ps2 CSA", + self::TAG_TAG_ps2i => "Ps2 Rendering Intent", + self::TAG_TAG_rXYZ => "Red Colorant", + self::TAG_TAG_rTRC => "Red TRC", + self::TAG_TAG_scrd => "Screening Desc", + self::TAG_TAG_scrn => "Screening", + self::TAG_TAG_tech => "Technology", + self::TAG_TAG_bfd => "Ucrbg", + self::TAG_TAG_vued => "Viewing Conditions Description", + self::TAG_TAG_view => "Viewing Conditions", + self::TAG_APPLE_MULTI_LANGUAGE_PROFILE_NAME => "Apple Multi-language Profile Name" + ]; + + public function __construct() + { + $this->setDescriptor(new IccDescriptor($this)); + } + + /** + * {@inheritDoc} + */ + public function getName() + { + return 'ICC Profile'; + } + + /** + * {@inheritDoc} + */ + protected function getTagNameMap() + { + return static::$tagNameMap; + } +} diff --git a/src/main/php/Gomoob/MetadataExtractor/Metadata/Schema.php b/src/main/php/Gomoob/MetadataExtractor/Metadata/Schema.php new file mode 100644 index 0000000..bc5941c --- /dev/null +++ b/src/main/php/Gomoob/MetadataExtractor/Metadata/Schema.php @@ -0,0 +1,29 @@ + "XMP Value Count", + + self::TAG_MAKE => "Make", + self::TAG_MODEL => "Model", + self::TAG_EXPOSURE_TIME => "Exposure Time", + self::TAG_SHUTTER_SPEED => "Shutter Speed Value", + self::TAG_F_NUMBER => "F-Number", + self::TAG_LENS_INFO => "Lens Information", + self::TAG_LENS => "Lens", + self::TAG_CAMERA_SERIAL_NUMBER => "Serial Number", + self::TAG_FIRMWARE => "Firmware", + self::TAG_FOCAL_LENGTH => "Focal Length", + self::TAG_APERTURE_VALUE => "Aperture Value", + self::TAG_EXPOSURE_PROGRAM => "Exposure Program", + self::TAG_DATETIME_ORIGINAL => "Date/Time Original", + self::TAG_DATETIME_DIGITIZED => "Date/Time Digitized", + + self::TAG_BASE_URL => "Base URL", + self::TAG_CREATE_DATE => "Create Date", + self::TAG_CREATOR_TOOL => "Creator Tool", + self::TAG_IDENTIFIER => "Identifier", + self::TAG_METADATA_DATE => "Metadata Date", + self::TAG_MODIFY_DATE => "Modify Date", + self::TAG_NICKNAME => "Nickname", + self::TAG_RATING => "Rating", + self::TAG_LABEL => "Label", + + // this requires further research + // self::TAG_TITLE => "Title", + self::TAG_SUBJECT => "Subject", + // self::TAG_DATE => "Date", + // self::TAG_TYPE => "Type", + // self::TAG_DESCRIPTION => "Description", + // self::TAG_RELATION => "Relation", + // self::TAG_COVERAGE => "Coverage", + // self::TAG_CREATOR => "Creator", + // self::TAG_PUBLISHER => "Publisher", + // self::TAG_CONTRIBUTOR => "Contributor", + // self::TAG_RIGHTS => "Rights", + // self::TAG_FORMAT => "Format", + // self::TAG_IDENTIFIER => "Identifier", + // self::TAG_LANGUAGE => "Language", + // self::TAG_AUDIENCE => "Audience", + // self::TAG_PROVENANCE => "Provenance", + // self::TAG_RIGHTS_HOLDER => "Rights Holder", + // self::TAG_INSTRUCTIONAL_METHOD => "Instructional Method", + // self::TAG_ACCRUAL_METHOD => "Accrual Method", + // self::TAG_ACCRUAL_PERIODICITY => "Accrual Periodicity", + // self::TAG_ACCRUAL_POLICY => "Accrual Policy", + + // this requires further research + // self::TAG_TITLE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + + // self::TAG_DATE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_TYPE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_DESCRIPTION => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_RELATION => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_COVERAGE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_CREATOR => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_PUBLISHER => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_CONTRIBUTOR => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_RIGHTS => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_FORMAT => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_IDENTIFIER => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_LANGUAGE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_AUDIENCE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_PROVENANCE => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_RIGHTS_HOLDER => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_INSTRUCTIONAL_METHOD => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_ACCRUAL_METHOD => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_ACCRUAL_PERIODICITY => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + // self::TAG_ACCRUAL_POLICY => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES, + ]; + + private static $tagPropNameMap = [ + self::TAG_MAKE => "tiff:Make", + self::TAG_MODEL => "tiff:Model", + self::TAG_EXPOSURE_TIME => "exif:ExposureTime", + self::TAG_SHUTTER_SPEED => "exif:ShutterSpeedValue", + self::TAG_F_NUMBER => "exif:FNumber", + self::TAG_LENS_INFO => "aux:LensInfo", + self::TAG_LENS => "aux:Lens", + self::TAG_CAMERA_SERIAL_NUMBER => "aux:SerialNumber", + self::TAG_FIRMWARE => "aux:Firmware", + self::TAG_FOCAL_LENGTH => "exif:FocalLength", + self::TAG_APERTURE_VALUE => "exif:ApertureValue", + self::TAG_EXPOSURE_PROGRAM => "exif:ExposureProgram", + self::TAG_DATETIME_ORIGINAL => "exif:DateTimeOriginal", + self::TAG_DATETIME_DIGITIZED => "exif:DateTimeDigitized", + + self::TAG_BASE_URL => "xmp:BaseURL", + self::TAG_CREATE_DATE => "xmp:CreateDate", + self::TAG_CREATOR_TOOL => "xmp:CreatorTool", + self::TAG_IDENTIFIER => "xmp:Identifier", + self::TAG_METADATA_DATE => "xmp:MetadataDate", + self::TAG_MODIFY_DATE => "xmp:ModifyDate", + self::TAG_NICKNAME => "xmp:Nickname", + self::TAG_RATING => "xmp:Rating", + self::TAG_LABEL => "xmp:Label", + + // this requires further research + // self::TAG_TITLE => "dc:title", + self::TAG_SUBJECT => "dc:subject", + // self::TAG_DATE => "dc:date", + // self::TAG_TYPE => "dc:type", + // self::TAG_DESCRIPTION => "dc:description", + // self::TAG_RELATION => "dc:relation", + // self::TAG_COVERAGE => "dc:coverage", + // self::TAG_CREATOR => "dc:creator", + // self::TAG_PUBLISHER => "dc:publisher", + // self::TAG_CONTRIBUTOR => "dc:contributor", + // self::TAG_RIGHTS => "dc:rights", + // self::TAG_FORMAT => "dc:format", + // self::TAG_IDENTIFIER => "dc:identifier", + // self::TAG_LANGUAGE => "dc:language", + // self::TAG_AUDIENCE => "dc:audience", + // self::TAG_PROVENANCE => "dc:provenance", + // self::TAG_RIGHTS_HOLDER => "dc:rightsHolder", + // self::TAG_INSTRUCTIONAL_METHOD => "dc:instructionalMethod", + // self::TAG_ACCRUAL_METHOD => "dc:accrualMethod", + // self::TAG_ACCRUAL_PERIODICITY => "dc:accrualPeriodicity", + // self::TAG_ACCRUAL_POLICY => "dc:accrualPolicy", + ]; + + private static $tagSchemaMap = [ + self::TAG_MAKE => Schema::EXIF_TIFF_PROPERTIES, + self::TAG_MODEL => Schema::EXIF_TIFF_PROPERTIES, + self::TAG_EXPOSURE_TIME => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_SHUTTER_SPEED => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_F_NUMBER => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_LENS_INFO => Schema::EXIF_ADDITIONAL_PROPERTIES, + self::TAG_LENS => Schema::EXIF_ADDITIONAL_PROPERTIES, + self::TAG_CAMERA_SERIAL_NUMBER => Schema::EXIF_ADDITIONAL_PROPERTIES, + self::TAG_FIRMWARE => Schema::EXIF_ADDITIONAL_PROPERTIES, + self::TAG_FOCAL_LENGTH => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_APERTURE_VALUE => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_EXPOSURE_PROGRAM => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_DATETIME_ORIGINAL => Schema::EXIF_SPECIFIC_PROPERTIES, + self::TAG_DATETIME_DIGITIZED => Schema::EXIF_SPECIFIC_PROPERTIES, + + self::TAG_BASE_URL => Schema::XMP_PROPERTIES, + self::TAG_CREATE_DATE => Schema::XMP_PROPERTIES, + self::TAG_CREATOR_TOOL => Schema::XMP_PROPERTIES, + self::TAG_IDENTIFIER => Schema::XMP_PROPERTIES, + self::TAG_METADATA_DATE => Schema::XMP_PROPERTIES, + self::TAG_MODIFY_DATE => Schema::XMP_PROPERTIES, + self::TAG_NICKNAME => Schema::XMP_PROPERTIES, + self::TAG_RATING => Schema::XMP_PROPERTIES, + self::TAG_LABEL => Schema::XMP_PROPERTIES, + self::TAG_SUBJECT => Schema::DUBLIN_CORE_SPECIFIC_PROPERTIES + ]; + + public function __construct() + { + $this->setDescriptor(new XmpDescriptor($this)); + } + + /** + * {@inheritDoc} + */ + public function getName() + { + return 'XMP'; + } + + /** + * {@inheritDoc} + */ + protected function getTagNameMap() + { + return static::$tagNameMap; + } +} diff --git a/src/test/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReaderTest.php b/src/test/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReaderTest.php index aa8024e..ffd89bf 100644 --- a/src/test/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReaderTest.php +++ b/src/test/php/Gomoob/MetadataExtractor/Imaging/ImageMetadataReaderTest.php @@ -19,6 +19,16 @@ */ class ImageMetadataReaderTest extends TestCase { + /** + * Test method for {@link ImageMetadataReader#readMetadata($file)} and `data/adobeJpeg1.jpg`. + */ + public function testReadMetadataWithAdoveJpeg1Jpg() + { + $metadata = ImageMetadataReader::readMetadata(realpath(TEST_RESOURCES_DIRECTORY . '/data/adobeJpeg1.jpg')); + + // TODO: Continue testing + } + /** * Test method for {@link ImageMetadataReader#readMetadata($file)} and `elephant.jpg`. */ @@ -34,6 +44,8 @@ public function testReadMetadataWithElephantJpg() $this->assertInstanceOf(JpegDirectory::class, $directory); $this->assertSame(7, $directory->getTagCount()); $this->assertCount(7, $directory->getTags()); + + // TODO: Check tags // Checks directory 'JFIF' $directory = $metadata->getDirectories()[1]; @@ -41,18 +53,26 @@ public function testReadMetadataWithElephantJpg() $this->assertSame(6, $directory->getTagCount()); $this->assertCount(6, $directory->getTags()); + // TODO: Check tags + // Checks directory 'Exif IFDO' $directory = $metadata->getDirectories()[2]; $this->assertInstanceOf(ExifIFD0Directory::class, $directory); - $this->assertSame(3, $directory->getTagCount()); - $this->assertCount(3, $directory->getTags()); + // $this->assertSame(3, $directory->getTagCount()); + // $this->assertCount(3, $directory->getTags()); + + // TODO: Check tags // Checks directory 'Exif SubIFD' $directory = $metadata->getDirectories()[3]; $this->assertInstanceOf(ExifSubIFDDirectory::class, $directory); + // TODO: Check tags + // Checks directory 'File' $directory = $metadata->getDirectories()[4]; $this->assertInstanceOf(FileMetadataDirectory::class, $directory); + + // TODO: Check tags } }