* @version $Revision: 472 $ * @date $Date: 2006-11-19 21:29:14 +0100 (Sun, 19 Nov 2006) $ * @license http://www.gnu.org/licenses/gpl.html GNU General Public * License (GPL) * @package PEL */ /**#@+ Required class definitions. */ require_once('Pel.php'); require_once('PelIfd.php'); /**#@-*/ /** * Class with static methods for Exif tags. * * This class defines the constants that represents the Exif tags * known to PEL. They are supposed to be used whenever one needs to * specify an Exif tag, and they will be denoted by the pseudo-type * {@link PelTag} throughout the documentation. * * Please note that the constrains on the format and number of * components given here are advisory only. To follow the Exif * specification one should obey them, but there is nothing that * prevents you from creating an {@link IMAGE_LENGTH} entry with two * or more components, even though the standard says that there should * be exactly one component. * * All the methods in this class are static and should be called with * the Exif tag on which they should operate. * * @author Martin Geisler * @package PEL */ class PelTag { /** * Interoperability index. * * Format: {@link PelFormat::ASCII}. * * Components: 4. */ const INTEROPERABILITY_INDEX = 0x0001; /** * Interoperability version. * * Format: {@link PelFormat::UNDEFINED}. * * Components: 4. */ const INTEROPERABILITY_VERSION = 0x0002; /** * Image width. * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: 1. */ const IMAGE_WIDTH = 0x0100; /** * Image length. * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: 1. */ const IMAGE_LENGTH = 0x0101; /** * Number of bits per component. * * Format: {@link PelFormat::SHORT}. * * Components: 3. */ const BITS_PER_SAMPLE = 0x0102; /** * Compression scheme. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const COMPRESSION = 0x0103; /** * Pixel composition. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const PHOTOMETRIC_INTERPRETATION = 0x0106; /** * Fill Orde * * Format: Unknown. * * Components: Unknown. */ const FILL_ORDER = 0x010A; /** * Document Name * * Format: Unknown. * * Components: Unknown. */ const DOCUMENT_NAME = 0x010D; /** * Image Description * * Format: {@link PelEntryAscii}. * * Components: any number. */ const IMAGE_DESCRIPTION = 0x010E; /** * Manufacturer * * Format: {@link PelEntryAscii}. * * Components: any number. */ const MAKE = 0x010F; /** * Model * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const MODEL = 0x0110; /** * Strip Offsets * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: any number. */ const STRIP_OFFSETS = 0x0111; /** * Orientation of image. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const ORIENTATION = 0x0112; /** * Number of components. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SAMPLES_PER_PIXEL = 0x0115; /** * Rows per Strip * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: 1. */ const ROWS_PER_STRIP = 0x0116; /** * Strip Byte Count * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: any number. */ const STRIP_BYTE_COUNTS = 0x0117; /** * Image resolution in width direction. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const X_RESOLUTION = 0x011A; /** * Image resolution in height direction. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const Y_RESOLUTION = 0x011B; /** * Image data arrangement. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const PLANAR_CONFIGURATION = 0x011C; /** * Unit of X and Y resolution. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const RESOLUTION_UNIT = 0x0128; /** * Transfer function. * * Format: {@link PelFormat::SHORT}. * * Components: 3. */ const TRANSFER_FUNCTION = 0x012D; /** * Software used. * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const SOFTWARE = 0x0131; /** * File change date and time. * * Format: {@link PelFormat::ASCII}, modelled by the {@link * PelEntryTime} class. * * Components: 20. */ const DATE_TIME = 0x0132; /** * Person who created the image. * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const ARTIST = 0x013B; /** * White point chromaticity. * * Format: {@link PelFormat::RATIONAL}. * * Components: 2. */ const WHITE_POINT = 0x013E; /** * Chromaticities of primaries. * * Format: {@link PelFormat::RATIONAL}. * * Components: 6. */ const PRIMARY_CHROMATICITIES = 0x013F; /** * Transfer Range * * Format: Unknown. * * Components: Unknown. */ const TRANSFER_RANGE = 0x0156; /** * JPEGProc * * Format: Unknown. * * Components: Unknown. */ const JPEG_PROC = 0x0200; /** * Offset to JPEG SOI. * * Format: {@link PelFormat::LONG}. * * Components: 1. */ const JPEG_INTERCHANGE_FORMAT = 0x0201; /** * Bytes of JPEG data. * * Format: {@link PelFormat::LONG}. * * Components: 1. */ const JPEG_INTERCHANGE_FORMAT_LENGTH = 0x0202; /** * Color space transformation matrix coefficients. * * Format: {@link PelFormat::RATIONAL}. * * Components: 3. */ const YCBCR_COEFFICIENTS = 0x0211; /** * Subsampling ratio of Y to C. * * Format: {@link PelFormat::SHORT}. * * Components: 2. */ const YCBCR_SUB_SAMPLING = 0x0212; /** * Y and C positioning. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const YCBCR_POSITIONING = 0x0213; /** * Pair of black and white reference values. * * Format: {@link PelFormat::RATIONAL}. * * Components: 6. */ const REFERENCE_BLACK_WHITE = 0x0214; /** * Related Image File Format * * Format: Unknown. * * Components: Unknown. */ const RELATED_IMAGE_FILE_FORMAT = 0x1000; /** * Related Image Width * * Format: Unknown, probably {@link PelFormat::SHORT}? * * Components: Unknown, probably 1. */ const RELATED_IMAGE_WIDTH = 0x1001; /** Related Image Length * * Format: Unknown, probably {@link PelFormat::SHORT}? * * Components: Unknown, probably 1. */ const RELATED_IMAGE_LENGTH = 0x1002; /** * CFA Repeat Pattern Dim. * * Format: {@link PelFormat::SHORT}. * * Components: 2. */ const CFA_REPEAT_PATTERN_DIM = 0x828D; /** * Battery level. * * Format: Unknown. * * Components: Unknown. */ const BATTERY_LEVEL = 0x828F; /** * Copyright holder. * * Format: {@link PelFormat::ASCII}, modelled by the {@link * PelEntryCopyright} class. * * Components: any number. */ const COPYRIGHT = 0x8298; /** * Exposure Time * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const EXPOSURE_TIME = 0x829A; /** * FNumber * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const FNUMBER = 0x829D; /** * IPTC/NAA * * Format: {@link PelFormat::LONG}. * * Components: any number. */ const IPTC_NAA = 0x83BB; /** * Exif IFD Pointer * * Format: {@link PelFormat::LONG}. * * Components: 1. */ const EXIF_IFD_POINTER = 0x8769; /** * Inter Color Profile * * Format: {@link PelFormat::UNDEFINED}. * * Components: any number. */ const INTER_COLOR_PROFILE = 0x8773; /** * Exposure Program * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const EXPOSURE_PROGRAM = 0x8822; /** * Spectral Sensitivity * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const SPECTRAL_SENSITIVITY = 0x8824; /** * GPS Info IFD Pointer * * Format: {@link PelFormat::LONG}. * * Components: 1. */ const GPS_INFO_IFD_POINTER = 0x8825; /** * ISO Speed Ratings * * Format: {@link PelFormat::SHORT}. * * Components: 2. */ const ISO_SPEED_RATINGS = 0x8827; /** * OECF * * Format: {@link PelFormat::UNDEFINED}. * * Components: any number. */ const OECF = 0x8828; /** * Exif version. * * Format: {@link PelFormat::UNDEFINED}, modelled by the {@link * PelEntryVersion} class. * * Components: 4. */ const EXIF_VERSION = 0x9000; /** * Date and time of original data generation. * * Format: {@link PelFormat::ASCII}, modelled by the {@link * PelEntryTime} class. * * Components: 20. */ const DATE_TIME_ORIGINAL = 0x9003; /** * Date and time of digital data generation. * * Format: {@link PelFormat::ASCII}, modelled by the {@link * PelEntryTime} class. * * Components: 20. */ const DATE_TIME_DIGITIZED = 0x9004; /** * Meaning of each component. * * Format: {@link PelFormat::UNDEFINED}. * * Components: 4. */ const COMPONENTS_CONFIGURATION = 0x9101; /** * Image compression mode. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const COMPRESSED_BITS_PER_PIXEL = 0x9102; /** * Shutter speed * * Format: {@link PelFormat::SRATIONAL}. * * Components: 1. */ const SHUTTER_SPEED_VALUE = 0x9201; /** * Aperture * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const APERTURE_VALUE = 0x9202; /** * Brightness * * Format: {@link PelFormat::SRATIONAL}. * * Components: 1. */ const BRIGHTNESS_VALUE = 0x9203; /** * Exposure Bias * * Format: {@link PelFormat::SRATIONAL}. * * Components: 1. */ const EXPOSURE_BIAS_VALUE = 0x9204; /** * Max Aperture Value * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const MAX_APERTURE_VALUE = 0x9205; /** * Subject Distance * * Format: {@link PelFormat::SRATIONAL}. * * Components: 1. */ const SUBJECT_DISTANCE = 0x9206; /** * Metering Mode * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const METERING_MODE = 0x9207; /** * Light Source * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const LIGHT_SOURCE = 0x9208; /** * Flash * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const FLASH = 0x9209; /** * Focal Length * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const FOCAL_LENGTH = 0x920A; /** * Subject Area * * Format: {@link PelFormat::SHORT}. * * Components: 4. */ const SUBJECT_AREA = 0x9214; /** * Maker Note * * Format: {@link PelFormat::UNDEFINED}. * * Components: any number. */ const MAKER_NOTE = 0x927C; /** * User Comment * * Format: {@link PelFormat::UNDEFINED}, modelled by the {@link * PelEntryUserComment} class. * * Components: any number. */ const USER_COMMENT = 0x9286; /** * SubSec Time * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const SUB_SEC_TIME = 0x9290; /** * SubSec Time Original * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const SUB_SEC_TIME_ORIGINAL = 0x9291; /** * SubSec Time Digitized * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const SUB_SEC_TIME_DIGITIZED = 0x9292; /** * Windows XP Title * * Format: {@link PelFormat::BYTE}. * * Components: any number. */ const XP_TITLE = 0x9C9B; /** * Windows XP Comment * * Format: {@link PelFormat::BYTE}. * * Components: any number. */ const XP_COMMENT = 0x9C9C; /** * Windows XP Author * * Format: {@link PelFormat::BYTE}. * * Components: any number. */ const XP_AUTHOR = 0x9C9D; /** * Windows XP Keywords * * Format: {@link PelFormat::BYTE}. * * Components: any number. */ const XP_KEYWORDS = 0x9C9E; /** * Windows XP Subject * * Format: {@link PelFormat::BYTE}. * * Components: any number. */ const XP_SUBJECT = 0x9C9F; /** * Supported Flashpix version * * Format: {@link PelFormat::UNDEFINED}, modelled by the {@link * PelEntryVersion} class. * * Components: 4. */ const FLASH_PIX_VERSION = 0xA000; /** * Color space information. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const COLOR_SPACE = 0xA001; /** * Valid image width. * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: 1. */ const PIXEL_X_DIMENSION = 0xA002; /** * Valid image height. * * Format: {@link PelFormat::SHORT} or {@link PelFormat::LONG}. * * Components: 1. */ const PIXEL_Y_DIMENSION = 0xA003; /** * Related audio file. * * Format: {@link PelFormat::ASCII}. * * Components: any number. */ const RELATED_SOUND_FILE = 0xA004; /** * Interoperability IFD Pointer * * Format: {@link PelFormat::LONG}. * * Components: 1. */ const INTEROPERABILITY_IFD_POINTER = 0xA005; /** * Flash energy. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const FLASH_ENERGY = 0xA20B; /** * Spatial frequency response. * * Format: {@link PelFormat::UNDEFINED}. * * Components: any number. */ const SPATIAL_FREQUENCY_RESPONSE = 0xA20C; /** * Focal plane X resolution. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const FOCAL_PLANE_X_RESOLUTION = 0xA20E; /** * Focal plane Y resolution. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const FOCAL_PLANE_Y_RESOLUTION = 0xA20F; /** * Focal plane resolution unit. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const FOCAL_PLANE_RESOLUTION_UNIT = 0xA210; /** * Subject location. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SUBJECT_LOCATION = 0xA214; /** * Exposure index. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const EXPOSURE_INDEX = 0xA215; /** * Sensing method. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SENSING_METHOD = 0xA217; /** * File source. * * Format: {@link PelFormat::UNDEFINED}. * * Components: 1. */ const FILE_SOURCE = 0xA300; /** * Scene type. * * Format: {@link PelFormat::UNDEFINED}. * * Components: 1. */ const SCENE_TYPE = 0xA301; /** * CFA pattern. * * Format: {@link PelFormat::UNDEFINED}. * * Components: any number. */ const CFA_PATTERN = 0xA302; /** * Custom image processing. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const CUSTOM_RENDERED = 0xA401; /** * Exposure mode. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const EXPOSURE_MODE = 0xA402; /** * White balance. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const WHITE_BALANCE = 0xA403; /** * Digital zoom ratio. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const DIGITAL_ZOOM_RATIO = 0xA404; /** * Focal length in 35mm film. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const FOCAL_LENGTH_IN_35MM_FILM = 0xA405; /** * Scene capture type. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SCENE_CAPTURE_TYPE = 0xA406; /** * Gain control. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const GAIN_CONTROL = 0xA407; /** * Contrast. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const CONTRAST = 0xA408; /** * Saturation. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SATURATION = 0xA409; /** * Sharpness. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SHARPNESS = 0xA40A; /** * Device settings description. * * This tag indicates information on the picture-taking conditions * of a particular camera model. The tag is used only to indicate * the picture-taking conditions in the reader. */ const DEVICE_SETTING_DESCRIPTION = 0xA40B; /** * Subject distance range. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const SUBJECT_DISTANCE_RANGE = 0xA40C; /** * Image unique ID. * * Format: {@link PelFormat::ASCII}. * * Components: 32. */ const IMAGE_UNIQUE_ID = 0xA420; /** * Gamma. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GAMMA = 0xA500; /** * PrintIM * * Format: {@link PelFormat::UNDEFINED}. * * Components: unknown. */ const PRINT_IM = 0xC4A5; /** * GPS tag version. * * Format: {@link PelFormat::BYTE}. * * Components: 4. */ const GPS_VERSION_ID = 0x0000; /** * North or South Latitude. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_LATITUDE_REF = 0x0001; /** * Latitude. * * Format: {@link PelFormat::RATIONAL}. * * Components: 3. */ const GPS_LATITUDE = 0x0002; /** * East or West Longitude. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_LONGITUDE_REF = 0x0003; /** * Longitude. * * Format: {@link PelFormat::RATIONAL}. * * Components: 3. */ const GPS_LONGITUDE = 0x0004; /** * Altitude reference. * * Format: {@link PelFormat::BYTE}. * * Components: 1. */ const GPS_ALTITUDE_REF = 0x0005; /** * Altitude. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_ALTITUDE = 0x0006; /** * GPS time (atomic clock). * * Format: {@link PelFormat::RATIONAL}. * * Components: 3. */ const GPS_TIME_STAMP = 0x0007; /** * GPS satellites used for measurement. * * Format: {@link PelFormat::ASCII}. * * Components: Any. */ const GPS_SATELLITES = 0x0008; /** * GPS receiver status. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_STATUS = 0x0009; /** * GPS measurement mode. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_MEASURE_MODE = 0x000A; /** * Measurement precision. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_DOP = 0x000B; /** * Speed unit. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_SPEED_REF = 0x000C; /** * Speed of GPS receiver. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_SPEED = 0x000D; /** * Reference for direction of movement. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_TRACK_REF = 0x000E; /** * Direction of movement. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_TRACK = 0x000F; /** * Reference for direction of image. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_IMG_DIRECTION_REF = 0x0010; /** * Direction of image. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_IMG_DIRECTION = 0x0011; /** * Geodetic survey data used. * * Format: {@link PelFormat::ASCII}. * * Components: Any. */ const GPS_MAP_DATUM = 0x0012; /** * Reference for latitude of destination. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_DEST_LATITUDE_REF = 0x0013; /** * Latitude of destination. * * Format: {@link PelFormat::RATIONAL}. * * Components: 3. */ const GPS_DEST_LATITUDE = 0x0014; /** * Reference for longitude of destination. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_DEST_LONGITUDE_REF = 0x0015; /** * Longitude of destination. * * Format: {@link PelFormat::RATIONAL}. * * Components: 3. */ const GPS_DEST_LONGITUDE = 0x0016; /** * Reference for bearing of destination. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_DEST_BEARING_REF = 0x0017; /** * Bearing of destination. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_DEST_BEARING = 0x0018; /** * Reference for distance to destination. * * Format: {@link PelFormat::ASCII}. * * Components: 2. */ const GPS_DEST_DISTANCE_REF = 0x0019; /** * Distance to destination. * * Format: {@link PelFormat::RATIONAL}. * * Components: 1. */ const GPS_DEST_DISTANCE = 0x001A; /** * Name of GPS processing method. * * Format: {@link PelFormat::UNDEFINED}. * * Components: Any. */ const GPS_PROCESSING_METHOD = 0x001B; /** * Name of GPS area. * * Format: {@link PelFormat::UNDEFINED}. * * Components: Any. */ const GPS_AREA_INFORMATION = 0x001C; /** * GPS date. * * Format: {@link PelFormat::ASCII}. * * Components: 11. */ const GPS_DATE_STAMP = 0x001D; /** * GPS differential correction. * * Format: {@link PelFormat::SHORT}. * * Components: 1. */ const GPS_DIFFERENTIAL = 0x001E; /** * Returns a short name for an Exif tag. * * @param int the IFD type of the tag, one of {@link PelIfd::IFD0}, * {@link PelIfd::IFD1}, {@link PelIfd::EXIF}, {@link PelIfd::GPS}, * or {@link PelIfd::INTEROPERABILITY}. * * @param PelTag the tag. * * @return string the short name of the tag, e.g., 'ImageWidth' for * the {@link IMAGE_WIDTH} tag. If the tag is not known, the string * 'Unknown:0xTTTT' will be returned where 'TTTT' is the hexadecimal * representation of the tag. */ static function getName($type, $tag) { switch ($type) { case PelIfd::IFD0: case PelIfd::IFD1: case PelIfd::EXIF: case PelIfd::INTEROPERABILITY: switch ($tag) { case self::INTEROPERABILITY_INDEX: return 'InteroperabilityIndex'; case self::INTEROPERABILITY_VERSION: return 'InteroperabilityVersion'; case self::IMAGE_WIDTH: return 'ImageWidth'; case self::IMAGE_LENGTH: return 'ImageLength'; case self::BITS_PER_SAMPLE: return 'BitsPerSample'; case self::COMPRESSION: return 'Compression'; case self::PHOTOMETRIC_INTERPRETATION: return 'PhotometricInterpretation'; case self::FILL_ORDER: return 'FillOrder'; case self::DOCUMENT_NAME: return 'DocumentName'; case self::IMAGE_DESCRIPTION: return 'ImageDescription'; case self::MAKE: return 'Make'; case self::MODEL: return 'Model'; case self::STRIP_OFFSETS: return 'StripOffsets'; case self::ORIENTATION: return 'Orientation'; case self::SAMPLES_PER_PIXEL: return 'SamplesPerPixel'; case self::ROWS_PER_STRIP: return 'RowsPerStrip'; case self::STRIP_BYTE_COUNTS: return 'StripByteCounts'; case self::X_RESOLUTION: return 'XResolution'; case self::Y_RESOLUTION: return 'YResolution'; case self::PLANAR_CONFIGURATION: return 'PlanarConfiguration'; case self::RESOLUTION_UNIT: return 'ResolutionUnit'; case self::TRANSFER_FUNCTION: return 'TransferFunction'; case self::SOFTWARE: return 'Software'; case self::DATE_TIME: return 'DateTime'; case self::ARTIST: return 'Artist'; case self::WHITE_POINT: return 'WhitePoint'; case self::PRIMARY_CHROMATICITIES: return 'PrimaryChromaticities'; case self::TRANSFER_RANGE: return 'TransferRange'; case self::JPEG_PROC: return 'JPEGProc'; case self::JPEG_INTERCHANGE_FORMAT: return 'JPEGInterchangeFormat'; case self::JPEG_INTERCHANGE_FORMAT_LENGTH: return 'JPEGInterchangeFormatLength'; case self::YCBCR_COEFFICIENTS: return 'YCbCrCoefficients'; case self::YCBCR_SUB_SAMPLING: return 'YCbCrSubSampling'; case self::YCBCR_POSITIONING: return 'YCbCrPositioning'; case self::REFERENCE_BLACK_WHITE: return 'ReferenceBlackWhite'; case self::RELATED_IMAGE_FILE_FORMAT: return 'RelatedImageFileFormat'; case self::RELATED_IMAGE_WIDTH: return 'RelatedImageWidth'; case self::RELATED_IMAGE_LENGTH: return 'RelatedImageLength'; case self::CFA_REPEAT_PATTERN_DIM: return 'CFARepeatPatternDim'; case self::CFA_PATTERN: return 'CFAPattern'; case self::BATTERY_LEVEL: return 'BatteryLevel'; case self::COPYRIGHT: return 'Copyright'; case self::EXPOSURE_TIME: return 'ExposureTime'; case self::FNUMBER: return 'FNumber'; case self::IPTC_NAA: return 'IPTC/NAA'; case self::EXIF_IFD_POINTER: return 'ExifIFDPointer'; case self::INTER_COLOR_PROFILE: return 'InterColorProfile'; case self::EXPOSURE_PROGRAM: return 'ExposureProgram'; case self::SPECTRAL_SENSITIVITY: return 'SpectralSensitivity'; case self::GPS_INFO_IFD_POINTER: return 'GPSInfoIFDPointer'; case self::ISO_SPEED_RATINGS: return 'ISOSpeedRatings'; case self::OECF: return 'OECF'; case self::EXIF_VERSION: return 'ExifVersion'; case self::DATE_TIME_ORIGINAL: return 'DateTimeOriginal'; case self::DATE_TIME_DIGITIZED: return 'DateTimeDigitized'; case self::COMPONENTS_CONFIGURATION: return 'ComponentsConfiguration'; case self::COMPRESSED_BITS_PER_PIXEL: return 'CompressedBitsPerPixel'; case self::SHUTTER_SPEED_VALUE: return 'ShutterSpeedValue'; case self::APERTURE_VALUE: return 'ApertureValue'; case self::BRIGHTNESS_VALUE: return 'BrightnessValue'; case self::EXPOSURE_BIAS_VALUE: return 'ExposureBiasValue'; case self::MAX_APERTURE_VALUE: return 'MaxApertureValue'; case self::SUBJECT_DISTANCE: return 'SubjectDistance'; case self::METERING_MODE: return 'MeteringMode'; case self::LIGHT_SOURCE: return 'LightSource'; case self::FLASH: return 'Flash'; case self::FOCAL_LENGTH: return 'FocalLength'; case self::MAKER_NOTE: return 'MakerNote'; case self::USER_COMMENT: return 'UserComment'; case self::SUB_SEC_TIME: return 'SubSecTime'; case self::SUB_SEC_TIME_ORIGINAL: return 'SubSecTimeOriginal'; case self::SUB_SEC_TIME_DIGITIZED: return 'SubSecTimeDigitized'; case self::XP_TITLE: return 'WindowsXPTitle'; case self::XP_COMMENT: return 'WindowsXPComment'; case self::XP_AUTHOR: return 'WindowsXPAuthor'; case self::XP_KEYWORDS: return 'WindowsXPKeywords'; case self::XP_SUBJECT: return 'WindowsXPSubject'; case self::FLASH_PIX_VERSION: return 'FlashPixVersion'; case self::COLOR_SPACE: return 'ColorSpace'; case self::PIXEL_X_DIMENSION: return 'PixelXDimension'; case self::PIXEL_Y_DIMENSION: return 'PixelYDimension'; case self::RELATED_SOUND_FILE: return 'RelatedSoundFile'; case self::INTEROPERABILITY_IFD_POINTER: return 'InteroperabilityIFDPointer'; case self::FLASH_ENERGY: return 'FlashEnergy'; case self::SPATIAL_FREQUENCY_RESPONSE: return 'SpatialFrequencyResponse'; case self::FOCAL_PLANE_X_RESOLUTION: return 'FocalPlaneXResolution'; case self::FOCAL_PLANE_Y_RESOLUTION: return 'FocalPlaneYResolution'; case self::FOCAL_PLANE_RESOLUTION_UNIT: return 'FocalPlaneResolutionUnit'; case self::SUBJECT_LOCATION: return 'SubjectLocation'; case self::EXPOSURE_INDEX: return 'ExposureIndex'; case self::SENSING_METHOD: return 'SensingMethod'; case self::FILE_SOURCE: return 'FileSource'; case self::SCENE_TYPE: return 'SceneType'; case self::SUBJECT_AREA: return 'SubjectArea'; case self::CUSTOM_RENDERED: return 'CustomRendered'; case self::EXPOSURE_MODE: return 'ExposureMode'; case self::WHITE_BALANCE: return 'WhiteBalance'; case self::DIGITAL_ZOOM_RATIO: return 'DigitalZoomRatio'; case self::FOCAL_LENGTH_IN_35MM_FILM: return 'FocalLengthIn35mmFilm'; case self::SCENE_CAPTURE_TYPE: return 'SceneCaptureType'; case self::GAIN_CONTROL: return 'GainControl'; case self::CONTRAST: return 'Contrast'; case self::SATURATION: return 'Saturation'; case self::SHARPNESS: return 'Sharpness'; case self::DEVICE_SETTING_DESCRIPTION: return 'DeviceSettingDescription'; case self::SUBJECT_DISTANCE_RANGE: return 'SubjectDistanceRange'; case self::IMAGE_UNIQUE_ID: return 'ImageUniqueID'; case self::GAMMA: return 'Gamma'; case self::PRINT_IM: return 'PrintIM'; } case PelIfd::GPS: switch ($tag) { case self::GPS_VERSION_ID: return 'GPSVersionID'; case self::GPS_LATITUDE_REF: return 'GPSLatitudeRef'; case self::GPS_LATITUDE: return 'GPSLatitude'; case self::GPS_LONGITUDE_REF: return 'GPSLongitudeRef'; case self::GPS_LONGITUDE: return 'GPSLongitude'; case self::GPS_ALTITUDE_REF: return 'GPSAltitudeRef'; case self::GPS_ALTITUDE: return 'GPSAltitude'; case self::GPS_TIME_STAMP: return 'GPSTimeStamp'; case self::GPS_SATELLITES: return 'GPSSatellites'; case self::GPS_STATUS: return 'GPSStatus'; case self::GPS_MEASURE_MODE: return 'GPSMeasureMode'; case self::GPS_DOP: return 'GPSDOP'; case self::GPS_SPEED_REF: return 'GPSSpeedRef'; case self::GPS_SPEED: return 'GPSSpeed'; case self::GPS_TRACK_REF: return 'GPSTrackRef'; case self::GPS_TRACK: return 'GPSTrack'; case self::GPS_IMG_DIRECTION_REF: return 'GPSImgDirectionRef'; case self::GPS_IMG_DIRECTION: return 'GPSImgDirection'; case self::GPS_MAP_DATUM: return 'GPSMapDatum'; case self::GPS_DEST_LATITUDE_REF: return 'GPSDestLatitudeRef'; case self::GPS_DEST_LATITUDE: return 'GPSDestLatitude'; case self::GPS_DEST_LONGITUDE_REF: return 'GPSDestLongitudeRef'; case self::GPS_DEST_LONGITUDE: return 'GPSDestLongitude'; case self::GPS_DEST_BEARING_REF: return 'GPSDestBearingRef'; case self::GPS_DEST_BEARING: return 'GPSDestBearing'; case self::GPS_DEST_DISTANCE_REF: return 'GPSDestDistanceRef'; case self::GPS_DEST_DISTANCE: return 'GPSDestDistance'; case self::GPS_PROCESSING_METHOD: return 'GPSProcessingMethod'; case self::GPS_AREA_INFORMATION: return 'GPSAreaInformation'; case self::GPS_DATE_STAMP: return 'GPSDateStamp'; case self::GPS_DIFFERENTIAL: return 'GPSDifferential'; } default: return Pel::fmt('Unknown: 0x%04X', $tag); } } /** * Returns a title for an Exif tag. * * @param int the IFD type of the tag, one of {@link PelIfd::IFD0}, * {@link PelIfd::IFD1}, {@link PelIfd::EXIF}, {@link PelIfd::GPS}, * or {@link PelIfd::INTEROPERABILITY}. * * @param PelTag the tag. * * @return string the title of the tag, e.g., 'Image Width' for the * {@link IMAGE_WIDTH} tag. If the tag isn't known, the string * 'Unknown Tag: 0xTT' will be returned where 'TT' is the * hexadecimal representation of the tag. */ function getTitle($type, $tag) { switch ($type) { case PelIfd::IFD0: case PelIfd::IFD1: case PelIfd::EXIF: case PelIfd::INTEROPERABILITY: switch ($tag) { case self::INTEROPERABILITY_INDEX: return Pel::tra('Interoperability Index'); case self::INTEROPERABILITY_VERSION: return Pel::tra('Interoperability Version'); case self::IMAGE_WIDTH: return Pel::tra('Image Width'); case self::IMAGE_LENGTH: return Pel::tra('Image Length'); case self::BITS_PER_SAMPLE: return Pel::tra('Bits per Sample'); case self::COMPRESSION: return Pel::tra('Compression'); case self::PHOTOMETRIC_INTERPRETATION: return Pel::tra('Photometric Interpretation'); case self::FILL_ORDER: return Pel::tra('Fill Order'); case self::DOCUMENT_NAME: return Pel::tra('Document Name'); case self::IMAGE_DESCRIPTION: return Pel::tra('Image Description'); case self::MAKE: return Pel::tra('Manufacturer'); case self::MODEL: return Pel::tra('Model'); case self::STRIP_OFFSETS: return Pel::tra('Strip Offsets'); case self::ORIENTATION: return Pel::tra('Orientation'); case self::SAMPLES_PER_PIXEL: return Pel::tra('Samples per Pixel'); case self::ROWS_PER_STRIP: return Pel::tra('Rows per Strip'); case self::STRIP_BYTE_COUNTS: return Pel::tra('Strip Byte Count'); case self::X_RESOLUTION: return Pel::tra('x-Resolution'); case self::Y_RESOLUTION: return Pel::tra('y-Resolution'); case self::PLANAR_CONFIGURATION: return Pel::tra('Planar Configuration'); case self::RESOLUTION_UNIT: return Pel::tra('Resolution Unit'); case self::TRANSFER_FUNCTION: return Pel::tra('Transfer Function'); case self::SOFTWARE: return Pel::tra('Software'); case self::DATE_TIME: return Pel::tra('Date and Time'); case self::ARTIST: return Pel::tra('Artist'); case self::WHITE_POINT: return Pel::tra('White Point'); case self::PRIMARY_CHROMATICITIES: return Pel::tra('Primary Chromaticities'); case self::TRANSFER_RANGE: return Pel::tra('Transfer Range'); case self::JPEG_PROC: return Pel::tra('JPEG Process'); case self::JPEG_INTERCHANGE_FORMAT: return Pel::tra('JPEG Interchange Format'); case self::JPEG_INTERCHANGE_FORMAT_LENGTH: return Pel::tra('JPEG Interchange Format Length'); case self::YCBCR_COEFFICIENTS: return Pel::tra('YCbCr Coefficients'); case self::YCBCR_SUB_SAMPLING: return Pel::tra('YCbCr Sub-Sampling'); case self::YCBCR_POSITIONING: return Pel::tra('YCbCr Positioning'); case self::REFERENCE_BLACK_WHITE: return Pel::tra('Reference Black/White'); case self::RELATED_IMAGE_FILE_FORMAT: return Pel::tra('Related Image File Format'); case self::RELATED_IMAGE_WIDTH: return Pel::tra('Related Image Width'); case self::RELATED_IMAGE_LENGTH: return Pel::tra('Related Image Length'); case self::CFA_REPEAT_PATTERN_DIM: return Pel::tra('CFA Repeat Pattern Dim'); case self::CFA_PATTERN: return Pel::tra('CFA Pattern'); case self::BATTERY_LEVEL: return Pel::tra('Battery Level'); case self::COPYRIGHT: return Pel::tra('Copyright'); case self::EXPOSURE_TIME: return Pel::tra('Exposure Time'); case self::FNUMBER: return Pel::tra('FNumber'); case self::IPTC_NAA: return Pel::tra('IPTC/NAA'); case self::EXIF_IFD_POINTER: return Pel::tra('Exif IFD Pointer'); case self::INTER_COLOR_PROFILE: return Pel::tra('Inter Color Profile'); case self::EXPOSURE_PROGRAM: return Pel::tra('Exposure Program'); case self::SPECTRAL_SENSITIVITY: return Pel::tra('Spectral Sensitivity'); case self::GPS_INFO_IFD_POINTER: return Pel::tra('GPS Info IFD Pointer'); case self::ISO_SPEED_RATINGS: return Pel::tra('ISO Speed Ratings'); case self::OECF: return Pel::tra('OECF'); case self::EXIF_VERSION: return Pel::tra('Exif Version'); case self::DATE_TIME_ORIGINAL: return Pel::tra('Date and Time (original)'); case self::DATE_TIME_DIGITIZED: return Pel::tra('Date and Time (digitized)'); case self::COMPONENTS_CONFIGURATION: return Pel::tra('Components Configuration'); case self::COMPRESSED_BITS_PER_PIXEL: return Pel::tra('Compressed Bits per Pixel'); case self::SHUTTER_SPEED_VALUE: return Pel::tra('Shutter speed'); case self::APERTURE_VALUE: return Pel::tra('Aperture'); case self::BRIGHTNESS_VALUE: return Pel::tra('Brightness'); case self::EXPOSURE_BIAS_VALUE: return Pel::tra('Exposure Bias'); case self::MAX_APERTURE_VALUE: return Pel::tra('Max Aperture Value'); case self::SUBJECT_DISTANCE: return Pel::tra('Subject Distance'); case self::METERING_MODE: return Pel::tra('Metering Mode'); case self::LIGHT_SOURCE: return Pel::tra('Light Source'); case self::FLASH: return Pel::tra('Flash'); case self::FOCAL_LENGTH: return Pel::tra('Focal Length'); case self::MAKER_NOTE: return Pel::tra('Maker Note'); case self::USER_COMMENT: return Pel::tra('User Comment'); case self::SUB_SEC_TIME: return Pel::tra('SubSec Time'); case self::SUB_SEC_TIME_ORIGINAL: return Pel::tra('SubSec Time Original'); case self::SUB_SEC_TIME_DIGITIZED: return Pel::tra('SubSec Time Digitized'); case self::XP_TITLE: return 'Windows XP Title'; case self::XP_COMMENT: return 'Windows XP Comment'; case self::XP_AUTHOR: return 'Windows XP Author'; case self::XP_KEYWORDS: return 'Windows XP Keywords'; case self::XP_SUBJECT: return 'Windows XP Subject'; case self::FLASH_PIX_VERSION: return Pel::tra('FlashPix Version'); case self::COLOR_SPACE: return Pel::tra('Color Space'); case self::PIXEL_X_DIMENSION: return Pel::tra('Pixel x-Dimension'); case self::PIXEL_Y_DIMENSION: return Pel::tra('Pixel y-Dimension'); case self::RELATED_SOUND_FILE: return Pel::tra('Related Sound File'); case self::INTEROPERABILITY_IFD_POINTER: return Pel::tra('Interoperability IFD Pointer'); case self::FLASH_ENERGY: return Pel::tra('Flash Energy'); case self::SPATIAL_FREQUENCY_RESPONSE: return Pel::tra('Spatial Frequency Response'); case self::FOCAL_PLANE_X_RESOLUTION: return Pel::tra('Focal Plane x-Resolution'); case self::FOCAL_PLANE_Y_RESOLUTION: return Pel::tra('Focal Plane y-Resolution'); case self::FOCAL_PLANE_RESOLUTION_UNIT: return Pel::tra('Focal Plane Resolution Unit'); case self::SUBJECT_LOCATION: return Pel::tra('Subject Location'); case self::EXPOSURE_INDEX: return Pel::tra('Exposure index'); case self::SENSING_METHOD: return Pel::tra('Sensing Method'); case self::FILE_SOURCE: return Pel::tra('File Source'); case self::SCENE_TYPE: return Pel::tra('Scene Type'); case self::SUBJECT_AREA: return Pel::tra('Subject Area'); case self::CUSTOM_RENDERED: return Pel::tra('Custom Rendered'); case self::EXPOSURE_MODE: return Pel::tra('Exposure Mode'); case self::WHITE_BALANCE: return Pel::tra('White Balance'); case self::DIGITAL_ZOOM_RATIO: return Pel::tra('Digital Zoom Ratio'); case self::FOCAL_LENGTH_IN_35MM_FILM: return Pel::tra('Focal Length In 35mm Film'); case self::SCENE_CAPTURE_TYPE: return Pel::tra('Scene Capture Type'); case self::GAIN_CONTROL: return Pel::tra('Gain Control'); case self::CONTRAST: return Pel::tra('Contrast'); case self::SATURATION: return Pel::tra('Saturation'); case self::SHARPNESS: return Pel::tra('Sharpness'); case self::DEVICE_SETTING_DESCRIPTION: return Pel::tra('Device Setting Description'); case self::SUBJECT_DISTANCE_RANGE: return Pel::tra('Subject Distance Range'); case self::IMAGE_UNIQUE_ID: return Pel::tra('Image Unique ID'); case self::GAMMA: return Pel::tra('Gamma'); case self::PRINT_IM: return Pel::tra('Print IM'); } case PelIfd::GPS: switch ($tag) { case self::GPS_VERSION_ID: return 'GPSVersionID'; case self::GPS_LATITUDE_REF: return 'GPSLatitudeRef'; case self::GPS_LATITUDE: return 'GPSLatitude'; case self::GPS_LONGITUDE_REF: return 'GPSLongitudeRef'; case self::GPS_LONGITUDE: return 'GPSLongitude'; case self::GPS_ALTITUDE_REF: return 'GPSAltitudeRef'; case self::GPS_ALTITUDE: return 'GPSAltitude'; case self::GPS_TIME_STAMP: return 'GPSTimeStamp'; case self::GPS_SATELLITES: return 'GPSSatellites'; case self::GPS_STATUS: return 'GPSStatus'; case self::GPS_MEASURE_MODE: return 'GPSMeasureMode'; case self::GPS_DOP: return 'GPSDOP'; case self::GPS_SPEED_REF: return 'GPSSpeedRef'; case self::GPS_SPEED: return 'GPSSpeed'; case self::GPS_TRACK_REF: return 'GPSTrackRef'; case self::GPS_TRACK: return 'GPSTrack'; case self::GPS_IMG_DIRECTION_REF: return 'GPSImgDirectionRef'; case self::GPS_IMG_DIRECTION: return 'GPSImgDirection'; case self::GPS_MAP_DATUM: return 'GPSMapDatum'; case self::GPS_DEST_LATITUDE_REF: return 'GPSDestLatitudeRef'; case self::GPS_DEST_LATITUDE: return 'GPSDestLatitude'; case self::GPS_DEST_LONGITUDE_REF: return 'GPSDestLongitudeRef'; case self::GPS_DEST_LONGITUDE: return 'GPSDestLongitude'; case self::GPS_DEST_BEARING_REF: return 'GPSDestBearingRef'; case self::GPS_DEST_BEARING: return 'GPSDestBearing'; case self::GPS_DEST_DISTANCE_REF: return 'GPSDestDistanceRef'; case self::GPS_DEST_DISTANCE: return 'GPSDestDistance'; case self::GPS_PROCESSING_METHOD: return 'GPSProcessingMethod'; case self::GPS_AREA_INFORMATION: return 'GPSAreaInformation'; case self::GPS_DATE_STAMP: return 'GPSDateStamp'; case self::GPS_DIFFERENTIAL: return 'GPSDifferential'; } default: return Pel::fmt('Unknown Tag: 0x%04X', $tag); } } } ?>