function formatData($type, $tag, $intel, $data) { switch ($type) { case 'ASCII': if (($pos = strpos($data, chr(0))) !== false) { // Search for a null byte and stop there. $data = substr($data, 0, $pos); } if ($tag == '010f') { $data = ucwords(strtolower(trim($data))); } // Format certain kinds of strings nicely (Camera make etc.) break; case 'URATIONAL': case 'SRATIONAL': switch ($tag) { case '011a': // XResolution // XResolution case '011b': // YResolution $data = round(unRational($data, $type, $intel)) . ' dots per ResolutionUnit'; break; case '829a': // Exposure Time $data = formatExposure(unRational($data, $type, $intel)); break; case '829d': // FNumber $data = 'f/' . unRational($data, $type, $intel); break; case '9204': // ExposureBiasValue $data = round(unRational($data, $type, $intel), 2) . ' EV'; break; case '9205': // ApertureValue // ApertureValue case '9202': // MaxApertureValue // ApertureValue is given in the APEX Mode. Many thanks to Matthieu Froment for this code // The formula is : Aperture = 2*log2(FNumber) <=> FNumber = e((Aperture.ln(2))/2) $datum = exp(unRational($data, $type, $intel) * log(2) / 2); $data = round($datum, 1); // Focal is given with a precision of 1 digit. $data = 'f/' . $datum; break; case '920a': // FocalLength $data = unRational($data, $type, $intel) . ' mm'; break; case '9201': // ShutterSpeedValue // The ShutterSpeedValue is given in the APEX mode. Many thanks to Matthieu Froment for this code // The formula is : Shutter = - log2(exposureTime) (Appendix C of EXIF spec.) // Where shutter is in APEX, log2(exposure) = ln(exposure)/ln(2) // So final formula is : exposure = exp(-ln(2).shutter) // The formula can be developed : exposure = 1/(exp(ln(2).shutter)) $datum = exp(unRational($data, $type, $intel) * log(2)); if ($datum != 0) { $datum = 1 / $datum; } $data = formatExposure($datum); break; default: $data = unRational($data, $type, $intel); break; } break; case 'USHORT': case 'SSHORT': case 'ULONG': case 'SLONG': case 'FLOAT': case 'DOUBLE': $data = rational($data, $type, $intel); switch ($tag) { case '0112': // Orientation // Example of how all of these tag formatters should be... switch ($data) { case 0: // not set, presume normal // not set, presume normal case 1: $data = gettext('1: Normal (0 deg)'); break; case 2: $data = gettext('2: Mirrored'); break; case 3: $data = gettext('3: Upside-down'); break; case 4: $data = gettext('4: Upside-down Mirrored'); break; case 5: $data = gettext('5: 90 deg CW Mirrored'); break; case 6: $data = gettext('6: 90 deg CCW'); break; case 7: $data = gettext('7: 90 deg CCW Mirrored'); break; case 8: $data = gettext('8: 90 deg CW'); break; default: $data = sprintf(gettext('%d: Unknown'), $data); break; } break; case '0128': // ResolutionUnit // ResolutionUnit case 'a210': // FocalPlaneResolutionUnit // FocalPlaneResolutionUnit case '0128': // ThumbnailResolutionUnit switch ($data) { case 1: $data = gettext('No Unit'); break; case 2: $data = gettext('Inch'); break; case 3: $data = gettext('Centimeter'); break; } break; case '0213': // YCbCrPositioning switch ($data) { case 1: $data = gettext('Center of Pixel Array'); break; case 2: $data = gettext('Datum Point'); break; } break; case '8822': // ExposureProgram switch ($data) { case 1: $data = gettext('Manual'); break; case 2: $data = gettext('Program'); break; case 3: $data = gettext('Aperture Priority'); break; case 4: $data = gettext('Shutter Priority'); break; case 5: $data = gettext('Program Creative'); break; case 6: $data = gettext('Program Action'); break; case 7: $data = gettext('Portrait'); break; case 8: $data = gettext('Landscape'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; case '9207': // MeteringMode switch ($data) { case 1: $data = gettext('Average'); break; case 2: $data = gettext('Center Weighted Average'); break; case 3: $data = gettext('Spot'); break; case 4: $data = gettext('Multi-Spot'); break; case 5: $data = gettext('Pattern'); break; case 6: $data = gettext('Partial'); break; case 255: $data = gettext('Other'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; case '9208': // LightSource switch ($data) { case 1: $data = gettext('Daylight'); break; case 2: $data = gettext('Fluorescent'); break; case 3: $data = gettext('Tungsten'); break; // 3 Tungsten (Incandescent light) // 4 Flash // 9 Fine Weather // 3 Tungsten (Incandescent light) // 4 Flash // 9 Fine Weather case 10: $data = gettext('Flash'); break; // 10 Cloudy Weather // 11 Shade // 12 Daylight Fluorescent (D 5700 - 7100K) // 13 Day White Fluorescent (N 4600 - 5400K) // 14 Cool White Fluorescent (W 3900 -4500K) // 15 White Fluorescent (WW 3200 - 3700K) // 10 Flash // 10 Cloudy Weather // 11 Shade // 12 Daylight Fluorescent (D 5700 - 7100K) // 13 Day White Fluorescent (N 4600 - 5400K) // 14 Cool White Fluorescent (W 3900 -4500K) // 15 White Fluorescent (WW 3200 - 3700K) // 10 Flash case 17: $data = gettext('Standard Light A'); break; case 18: $data = gettext('Standard Light B'); break; case 19: $data = gettext('Standard Light C'); break; case 20: $data = gettext('D55'); break; case 21: $data = gettext('D65'); break; case 22: $data = gettext('D75'); break; case 23: $data = gettext('D50'); break; case 24: $data = gettext('ISO Studio Tungsten'); break; case 255: $data = gettext('Other'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; case '9209': // Flash switch ($data) { case 0: $data = gettext('No Flash'); break; case 1: $data = gettext('Flash'); break; case 5: $data = gettext('Flash, strobe return light not detected'); break; case 7: $data = gettext('Flash, strobe return light detected'); break; case 9: $data = gettext('Compulsory Flash'); break; case 13: $data = gettext('Compulsory Flash, Return light not detected'); break; case 15: $data = gettext('Compulsory Flash, Return light detected'); break; case 16: $data = gettext('No Flash'); break; case 24: $data = gettext('No Flash'); break; case 25: $data = gettext('Flash, Auto-Mode'); break; case 29: $data = gettext('Flash, Auto-Mode, Return light not detected'); break; case 31: $data = gettext('Flash, Auto-Mode, Return light detected'); break; case 32: $data = gettext('No Flash'); break; case 65: $data = gettext('Red Eye'); break; case 69: $data = gettext('Red Eye, Return light not detected'); break; case 71: $data = gettext('Red Eye, Return light detected'); break; case 73: $data = gettext('Red Eye, Compulsory Flash'); break; case 77: $data = gettext('Red Eye, Compulsory Flash, Return light not detected'); break; case 79: $data = gettext('Red Eye, Compulsory Flash, Return light detected'); break; case 89: $data = gettext('Red Eye, Auto-Mode'); break; case 93: $data = gettext('Red Eye, Auto-Mode, Return light not detected'); break; case 95: $data = gettext('Red Eye, Auto-Mode, Return light detected'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; case 'a001': // ColorSpace if ($data == 1) { $data = gettext('sRGB'); } else { $data = gettext('Uncalibrated'); } break; case 'a002': // ExifImageWidth // ExifImageWidth case 'a003': // ExifImageHeight $data = $data . ' ' . gettext('pixels'); break; case '0103': // Compression switch ($data) { case 1: $data = gettext('No Compression'); break; case 6: $data = gettext('Jpeg Compression'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; case 'a217': // SensingMethod switch ($data) { case 1: $data = gettext('Not defined'); break; case 2: $data = gettext('One Chip Color Area Sensor'); break; case 3: $data = gettext('Two Chip Color Area Sensor'); break; case 4: $data = gettext('Three Chip Color Area Sensor'); break; case 5: $data = gettext('Color Sequential Area Sensor'); break; case 7: $data = gettext('Trilinear Sensor'); break; case 8: $data = gettext('Color Sequential Linear Sensor'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; case '0106': // PhotometricInterpretation switch ($data) { case 1: $data = gettext('Monochrome'); break; case 2: $data = gettext('RGB'); break; case 6: $data = gettext('YCbCr'); break; default: $data = gettext('Unknown') . ': ' . $data; break; } break; //case "a408": // Contrast //case "a40a": //Sharpness // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Soft"; break; // case 2: $data="Hard"; break; // default: $data="Unknown"; break; // } // break; //case "a409": // Saturation // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Low saturation"; break; // case 2: $data="High saturation"; break; // default: $data="Unknown"; break; // } // break; //case "a402": // Exposure Mode // switch($data) { // case 0: $data="Auto exposure"; break; // case 1: $data="Manual exposure"; break; // case 2: $data="Auto bracket"; break; // default: $data="Unknown"; break; // } // break; } break; case 'UNDEFINED': switch ($tag) { case '9000': // ExifVersion // ExifVersion case 'a000': // FlashPixVersion // FlashPixVersion case '0002': // InteroperabilityVersion $data = gettext('version') . ' ' . $data / 100; break; case 'a300': // FileSource $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace('03', gettext('Digital Still Camera'), $data); break; case 'a301': // SceneType $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace('01', gettext('Directly Photographed'), $data); break; case '9101': // ComponentsConfiguration $data = bin2hex($data); $data = str_replace('01', 'Y', $data); $data = str_replace('02', 'Cb', $data); $data = str_replace('03', 'Cr', $data); $data = str_replace('04', 'R', $data); $data = str_replace('05', 'G', $data); $data = str_replace('06', 'B', $data); $data = str_replace('00', '', $data); break; //case "9286": //UserComment // $encoding = rtrim(substr($data, 0, 8)); // $data = rtrim(substr($data, 8)); // break; } break; default: $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } break; } return $data; }
function formatData($type, $tag, $intel, $data) { if ($type == 'ASCII') { // Search for a null byte and stop there. if (($pos = strpos($data, chr(0))) !== false) { $data = substr($data, 0, $pos); } // Format certain kinds of strings nicely (Camera make etc.) if ($tag == '010f') { $data = ucwords(strtolower(trim($data))); } } else { if ($type == 'URATIONAL' || $type == 'SRATIONAL') { $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } if ($intel == 1) { $top = hexdec(substr($data, 8, 8)); } else { $top = hexdec(substr($data, 0, 8)); } // motorola stores them top-bottom if ($intel == 1) { $bottom = hexdec(substr($data, 0, 8)); } else { $bottom = hexdec(substr($data, 8, 8)); } // motorola stores them top-bottom if ($type == 'SRATIONAL' && $top > 2147483647) { $top = $top - 4294967296.0; } // this makes the number signed instead of unsigned if ($bottom != 0) { $data = $top / $bottom; } else { if ($top == 0) { $data = 0; } else { $data = $top . '/' . $bottom; } } if (($tag == '011a' || $tag == '011b') && $bottom == 1) { // XResolution YResolution $data = $top . ' dots per ResolutionUnit'; } else { if ($tag == '829a') { // Exposure Time if ($bottom != 0) { $data = $top / $bottom; } else { $data = 0; } $data = formatExposure($data); } else { if ($tag == '829d') { // FNumber $data = 'f/' . $data; } else { if ($tag == '9204') { // ExposureBiasValue $data = round($data, 2) . ' EV'; } else { if ($tag == '9205' || $tag == '9202') { // ApertureValue and MaxApertureValue // ApertureValue is given in the APEX Mode. Many thanks to Matthieu Froment for this code // The formula is : Aperture = 2*log2(FNumber) <=> FNumber = e((Aperture.ln(2))/2) $data = exp($data * log(2) / 2); $data = round($data, 1); // Focal is given with a precision of 1 digit. $data = 'f/' . $data; } else { if ($tag == '920a') { // FocalLength $data = $data . ' mm'; } else { if ($tag == '9201') { // ShutterSpeedValue // The ShutterSpeedValue is given in the APEX mode. Many thanks to Matthieu Froment for this code // The formula is : Shutter = - log2(exposureTime) (Appendix C of EXIF spec.) // Where shutter is in APEX, log2(exposure) = ln(exposure)/ln(2) // So final formula is : exposure = exp(-ln(2).shutter) // The formula can be developed : exposure = 1/(exp(ln(2).shutter)) $data = exp($data * log(2)); if ($data != 0) { $data = 1 / $data; } $data = formatExposure($data); } } } } } } } } else { if ($type == 'USHORT' || $type == 'SSHORT' || $type == 'ULONG' || $type == 'SLONG' || $type == 'FLOAT' || $type == 'DOUBLE') { $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } if ($intel == 0 && ($type == 'USHORT' || $type == 'SSHORT')) { $data = substr($data, 0, 4); } $data = hexdec($data); if ($type == 'SSHORT' && $data > 32767) { $data = $data - 65536; } // this makes the number signed instead of unsigned if ($type == 'SLONG' && $data > 2147483647) { $data = $data - 4294967296.0; } // this makes the number signed instead of unsigned if ($tag == '0112') { // Orientation // Example of how all of these tag formatters should be... switch ($data) { case 1: $data = gettext('1: Normal (0 deg)'); break; case 2: $data = gettext('2: Mirrored'); break; case 3: $data = gettext('3: Upsidedown'); break; case 4: $data = gettext('4: Upsidedown Mirrored'); break; case 5: $data = gettext('5: 90 deg CW Mirrored'); break; case 6: $data = gettext('6: 90 deg CCW'); break; case 7: $data = gettext('7: 90 deg CCW Mirrored'); break; case 8: $data = gettext('8: 90 deg CW'); break; default: $data = gettext('Unknown') . ': ' . $data; } } else { if ($tag == '0128' || $tag == 'a210' || $tag == '0128') { // ResolutionUnit and FocalPlaneResolutionUnit and ThumbnailResolutionUnit if ($data == 1) { $data = gettext('No Unit'); } else { if ($data == 2) { $data = gettext('Inch'); } else { if ($data == 3) { $data = gettext('Centimeter'); } } } } else { if ($tag == '0213') { // YCbCrPositioning if ($data == 1) { $data = gettext('Center of Pixel Array'); } else { if ($data == 2) { $data = gettext('Datum Point'); } } } else { if ($tag == '8822') { // ExposureProgram if ($data == 1) { $data = gettext('Manual'); } else { if ($data == 2) { $data = gettext('Program'); } else { if ($data == 3) { $data = gettext('Aperture Priority'); } else { if ($data == 4) { $data = gettext('Shutter Priority'); } else { if ($data == 5) { $data = gettext('Program Creative'); } else { if ($data == 6) { $data = gettext('Program Action'); } else { if ($data == 7) { $data = gettext('Portrat'); } else { if ($data == 8) { $data = gettext('Landscape'); } else { $data = gettext('Unknown') . ': ' . $data; } } } } } } } } } else { if ($tag == '9207') { // MeteringMode if ($data == 0) { $data = gettext('Unknown'); } else { if ($data == 1) { $data = gettext('Average'); } else { if ($data == 2) { $data = gettext('Center Weighted Average'); } else { if ($data == 3) { $data = gettext('Spot'); } else { if ($data == 4) { $data = gettext('Multi-Spot'); } else { if ($data == 5) { $data = gettext('Multi-Segment'); } else { if ($data == 6) { $data = gettext('Partial'); } else { if ($data == 255) { $data = gettext('Other'); } else { $data = gettext('Unknown') . ': ' . $data; } } } } } } } } } else { if ($tag == '9208') { // LightSource if ($data == 0) { $data = gettext('Unknown or Auto'); } else { if ($data == 1) { $data = gettext('Daylight'); } else { if ($data == 2) { $data = gettext('Flourescent'); } else { if ($data == 3) { $data = gettext('Tungsten'); } else { if ($data == 10) { $data = gettext('Flash'); } else { if ($data == 17) { $data = gettext('Standard Light A'); } else { if ($data == 18) { $data = gettext('Standard Light B'); } else { if ($data == 19) { $data = gettext('Standard Light C'); } else { if ($data == 20) { $data = gettext('D55'); } else { if ($data == 21) { $data = gettext('D65'); } else { if ($data == 22) { $data = gettext('D75'); } else { if ($data == 23) { $data = gettext('D50'); } else { if ($data == 24) { $data = gettext('ISO Studio Tungsten'); } else { if ($data == 255) { $data = gettext('Other'); } else { $data = gettext('Unknown') . ': ' . $data; } } } } } } } } } } } } } } } else { if ($tag == '9209') { // Flash if ($data == 0) { $data = gettext('No Flash'); } else { if ($data == 1) { $data = gettext('Flash'); } else { if ($data == 5) { $data = gettext('Flash, strobe return light not detected'); } else { if ($data == 7) { $data = gettext('Flash, strobe return light detected'); } else { if ($data == 9) { $data = gettext('Compulsory Flash'); } else { if ($data == 13) { $data = gettext('Compulsory Flash, Return light not detected'); } else { if ($data == 15) { $data = gettext('Compulsory Flash, Return light detected'); } else { if ($data == 16) { $data = gettext('No Flash'); } else { if ($data == 24) { $data = gettext('No Flash'); } else { if ($data == 25) { $data = gettext('Flash, Auto-Mode'); } else { if ($data == 29) { $data = gettext('Flash, Auto-Mode, Return light not detected'); } else { if ($data == 31) { $data = gettext('Flash, Auto-Mode, Return light detected'); } else { if ($data == 32) { $data = gettext('No Flash'); } else { if ($data == 65) { $data = gettext('Red Eye'); } else { if ($data == 69) { $data = gettext('Red Eye, Return light not detected'); } else { if ($data == 71) { $data = gettext('Red Eye, Return light detected'); } else { if ($data == 73) { $data = gettext('Red Eye, Compulsory Flash'); } else { if ($data == 77) { $data = gettext('Red Eye, Compulsory Flash, Return light not detected'); } else { if ($data == 79) { $data = gettext('Red Eye, Compulsory Flash, Return light detected'); } else { if ($data == 89) { $data = gettext('Red Eye, Auto-Mode'); } else { if ($data == 93) { $data = gettext('Red Eye, Auto-Mode, Return light not detected'); } else { if ($data == 95) { $data = gettext('Red Eye, Auto-Mode, Return light detected'); } else { $data = gettext('Unknown') . ': ' . $data; } } } } } } } } } } } } } } } } } } } } } } } else { if ($tag == 'a001') { // ColorSpace if ($data == 1) { $data = gettext('sRGB'); } else { $data = gettext('Uncalibrated'); } } else { if ($tag == 'a002' || $tag == 'a003') { // ExifImageWidth/Height $data = $data . ' ' . gettext('pixels'); } else { if ($tag == '0103') { // Compression if ($data == 1) { $data = gettext('No Compression'); } else { if ($data == 6) { $data = gettext('Jpeg Compression'); } else { $data = gettext('Unknown') . ': ' . $data; } } } else { if ($tag == 'a217') { // SensingMethod if ($data == 1) { $data = gettext('Not defined'); } if ($data == 2) { $data = gettext('One Chip Color Area Sensor'); } if ($data == 3) { $data = gettext('Two Chip Color Area Sensor'); } if ($data == 4) { $data = gettext('Three Chip Color Area Sensor'); } if ($data == 5) { $data = gettext('Color Sequential Area Sensor'); } if ($data == 7) { $data = gettext('Trilinear Sensor'); } if ($data == 8) { $data = gettext('Color Sequential Linear Sensor'); } else { $data = gettext('Unknown') . ': ' . $data; } } else { if ($tag == '0106') { // PhotometricInterpretation if ($data == 1) { $data = gettext('Monochrome'); } else { if ($data == 2) { $data = gettext('RGB'); } else { if ($data == 6) { $data = gettext('YCbCr'); } else { $data = gettext('Unknown') . ': ' . $data; } } } } } } } } } } } } } } } //} else if($tag=="a408" || $tag=="a40a") { // Contrast, Sharpness // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Soft"; break; // case 2: $data="Hard"; break; // default: $data="Unknown"; break; // } //} else if($tag=="a409") { // Saturation // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Low saturation"; break; // case 2: $data="High saturation"; break; // default: $data="Unknown"; break; // } //} else if($tag=="a402") { // Exposure Mode // switch($data) { // case 0: $data="Auto exposure"; break; // case 1: $data="Manual exposure"; break; // case 2: $data="Auto bracket"; break; // default: $data="Unknown"; break; // } } else { if ($type == 'UNDEFINED') { if ($tag == '9000' || $tag == 'a000' || $tag == '0002') { // ExifVersion,FlashPixVersion,InteroperabilityVersion $data = gettext('version') . ' ' . $data / 100; } if ($tag == 'a300') { // FileSource $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace('03', gettext('Digital Still Camera'), $data); } if ($tag == 'a301') { // SceneType $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace('01', gettext('Directly Photographed'), $data); } if ($tag == '9101') { // ComponentsConfiguration $data = bin2hex($data); $data = str_replace('01', 'Y', $data); $data = str_replace('02', 'Cb', $data); $data = str_replace('03', 'Cr', $data); $data = str_replace('04', 'R', $data); $data = str_replace('05', 'G', $data); $data = str_replace('06', 'B', $data); $data = str_replace('00', '', $data); } //if($tag=="9286") { //UserComment // $encoding = rtrim(substr($data, 0, 8)); // $data = rtrim(substr($data, 8)); //} } else { $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } } } } } return $data; }
function formatData($type, $tag, $intel, $data) { global $LANG_MG04; if ($type == 'ASCII') { // Search for a null byte and stop there. if (($pos = strpos($data, chr(0))) !== false) { $data = substr($data, 0, $pos); } // Format certain kinds of strings nicely (Camera make etc.) if ($tag == '010f') { $data = ucwords(strtolower(trim($data))); } } else { if ($type == 'URATIONAL' || $type == 'SRATIONAL') { $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } if ($intel == 1) { $top = hexdec(substr($data, 8, 8)); } else { $top = hexdec(substr($data, 0, 8)); } // motorola stores them top-bottom if ($intel == 1) { $bottom = hexdec(substr($data, 0, 8)); } else { $bottom = hexdec(substr($data, 8, 8)); } // motorola stores them top-bottom if ($type == 'SRATIONAL' && $top > 2147483647) { $top = $top - 4294967296; } // this makes the number signed instead of unsigned if ($bottom != 0) { $data = $top / $bottom; } else { if ($top == 0) { $data = 0; } else { $data = $top . '/' . $bottom; } } if (($tag == '011a' || $tag == '011b') && $bottom == 1) { // XResolution YResolution $data = $top . ' dots per ResolutionUnit'; } else { if ($tag == '829a') { // Exposure Time if ($bottom != 0) { $data = $top / $bottom; } else { $data = 0; } $data = formatExposure($data); } else { if ($tag == '829d') { // FNumber $data = 'f/' . $data; } else { if ($tag == '9204') { // ExposureBiasValue $data = round($data, 2) . ' EV'; } else { if ($tag == '9205' || $tag == '9202') { // ApertureValue and MaxApertureValue // ApertureValue is given in the APEX Mode. Many thanks to Matthieu Froment for this code // The formula is : Aperture = 2*log2(FNumber) <=> FNumber = e((Aperture.ln(2))/2) $data = exp($data * log(2) / 2); $data = round($data, 1); // Focal is given with a precision of 1 digit. $data = 'f/' . $data; } else { if ($tag == '920a') { // FocalLength $data = $data . ' mm'; } else { if ($tag == '9201') { // ShutterSpeedValue // The ShutterSpeedValue is given in the APEX mode. Many thanks to Matthieu Froment for this code // The formula is : Shutter = - log2(exposureTime) (Appendix C of EXIF spec.) // Where shutter is in APEX, log2(exposure) = ln(exposure)/ln(2) // So final formula is : exposure = exp(-ln(2).shutter) // The formula can be developed : exposure = 1/(exp(ln(2).shutter)) $data = exp($data * log(2)); if ($data != 0) { $data = 1 / $data; } $data = formatExposure($data); } } } } } } } } else { if ($type == 'USHORT' || $type == 'SSHORT' || $type == 'ULONG' || $type == 'SLONG' || $type == 'FLOAT' || $type == 'DOUBLE') { $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } if ($intel == 0 && ($type == 'USHORT' || $type == 'SSHORT')) { $data = substr($data, 0, 4); } $data = hexdec($data); if ($type == 'SSHORT' && $data > 32767) { $data = $data - 65536; } // this makes the number signed instead of unsigned if ($type == 'SLONG' && $data > 2147483647) { $data = $data - 4294967296; } // this makes the number signed instead of unsigned if ($tag == '0112') { // Orientation // Example of how all of these tag formatters should be... switch ($data) { case 1: $data = $LANG_MG04['normal']; break; case 2: $data = $LANG_MG04['mirrored']; break; case 3: $data = $LANG_MG04['upsidedown']; break; case 4: $data = $LANG_MG04['upsidedown_mirrored']; break; case 5: $data = $LANG_MG04['cw_mirrored']; break; case 6: $data = $LANG_MG04['ccw']; break; case 7: $data = $LANG_MG04['ccw_mirrored']; break; case 8: $data = $LANG_MG04['cw']; break; default: $data = $LANG_MG04['unknown'] . ': ' . $data; } } else { if ($tag == '0128' || $tag == 'a210' || $tag == '0128') { // ResolutionUnit and FocalPlaneResolutionUnit and ThumbnailResolutionUnit if ($data == 1) { $data = $LANG_MG04['no_unit']; } else { if ($data == 2) { $data = $LANG_MG04['inch']; } else { if ($data == 3) { $data = $LANG_MG04['centimeter']; } } } } else { if ($tag == '0213') { // YCbCrPositioning if ($data == 1) { $data = $LANG_MG04['center_of_pixel_array']; } if ($data == 2) { $data = $LANG_MG04['datum_point']; } } else { if ($tag == '8822') { // ExposureProgram if ($data == 1) { $data = $LANG_MG04['manual']; } else { if ($data == 2) { $data = $LANG_MG04['program']; } else { if ($data == 3) { $data = $LANG_MG04['aperature_priority']; } else { if ($data == 4) { $data = $LANG_MG04['shutter_priority']; } else { if ($data == 5) { $data = $LANG_MG04['program_creative']; } else { if ($data == 6) { $data = $LANG_MG04['program_action']; } else { if ($data == 7) { $data = $LANG_MG04['portrait']; } else { if ($data == 8) { $data = $LANG_MG04['landscape']; } else { $data = "Unknown: " . $data; } } } } } } } } } else { if ($tag == '9207') { // MeteringMode if ($data == 0) { $data = $LANG_MG04['unknown']; } else { if ($data == 1) { $data = $LANG_MG04['average']; } else { if ($data == 2) { $data = $LANG_MG04['center_weighted_average']; } else { if ($data == 3) { $data = $LANG_MG04['spot']; } else { if ($data == 4) { $data = $LANG_MG04['multi_spot']; } else { if ($data == 5) { $data = $LANG_MG04['multi_segment']; } else { if ($data == 6) { $data = $LANG_MG04['partial']; } else { if ($data == 255) { $data = $LANG_MG04['other']; } else { $data = "Unknown: " . $data; } } } } } } } } } else { if ($tag == '9208') { // LightSource if ($data == 0) { $data = $LANG_MG04['unknown_or_auto']; } else { if ($data == 1) { $data = $LANG_MG04['daylight']; } else { if ($data == 2) { $data = $LANG_MG04['flourescent']; } else { if ($data == 3) { $data = $LANG_MG04['tungsten']; } else { if ($data == 10) { $data = $LANG_MG04['flash']; } else { if ($data == 17) { $data = $LANG_MG04['standard_a']; } else { if ($data == 18) { $data = $LANG_MG04['standard_b']; } else { if ($data == 19) { $data = $LANG_MG04['standard_c']; } else { if ($data == 20) { $data = $LANG_MG04['d55']; } else { if ($data == 21) { $data = $LANG_MG04['d65']; } else { if ($data == 22) { $data = $LANG_MG04['d75']; } else { if ($data == 23) { $data = 'D50'; } else { if ($data == 24) { $data = 'ISO Studio Tungsten'; } else { if ($data == 255) { $data = $LANG_MG04['other']; } else { $data = 'Unknown' . ': ' . $data; } } } } } } } } } } } } } } } else { if ($tag == '9209') { // Flash if ($data == 0) { $data = $LANG_MG04['flash_00']; } else { if ($data == 1) { $data = $LANG_MG04['flash_01']; } else { if ($data == 5) { $data = $LANG_MG04['flash_05']; } else { if ($data == 7) { $data = $LANG_MG04['flash_07']; } else { if ($data == 9) { $data = $LANG_MG04['flash_09']; } else { if ($data == 13) { $data = $LANG_MG04['flash_13']; } else { if ($data == 15) { $data = $LANG_MG04['flash_15']; } else { if ($data == 16) { $data = $LANG_MG04['flash_16']; } else { if ($data == 24) { $data = $LANG_MG04['flash_24']; } else { if ($data == 25) { $data = $LANG_MG04['flash_25']; } else { if ($data == 29) { $data = $LANG_MG04['flash_29']; } else { if ($data == 31) { $data = $LANG_MG04['flash_31']; } else { if ($data == 32) { $data = $LANG_MG04['flash_32']; } else { if ($data == 65) { $data = $LANG_MG04['flash_65']; } else { if ($data == 69) { $data = $LANG_MG04['flash_69']; } else { if ($data == 71) { $data = $LANG_MG04['flash_71']; } else { if ($data == 73) { $data = $LANG_MG04['flash_73']; } else { if ($data == 77) { $data = $LANG_MG04['flash_77']; } else { if ($data == 79) { $data = $LANG_MG04['flash_79']; } else { if ($data == 89) { $data = $LANG_MG04['flash_89']; } else { if ($data == 93) { $data = $LANG_MG04['flash_93']; } else { if ($data == 95) { $data = $LANG_MG04['flash_95']; } else { $data = $LANG_MG04['unknown'] . ": " . $data; } } } } } } } } } } } } } } } } } } } } } } } else { if ($tag == 'a001') { // ColorSpace if ($data == 1) { $data = $LANG_MG04['srgb']; } else { $data = $LANG_MG04['uncalibrated']; } } else { if ($tag == 'a002' || $tag == 'a003') { // ExifImageWidth/Height $data = $data . $LANG_MG04['pixels']; } else { if ($tag == '0103') { // Compression if ($data == 1) { $data = $LANG_MG04['no_compression']; } else { if ($data == 6) { $data = $LANG_MG04['jpeg_compression']; } else { $data = $LANG_MG04['unknown'] . ": " . $data; } } } else { if ($tag == 'a217') { // SensingMethod if ($data == 1) { $data = $LANG_MG04['not_defined']; } if ($data == 2) { $data = $LANG_MG04['one_chip_color_area_sensor']; } if ($data == 3) { $data = $LANG_MG04['two_chip_color_area_sensor']; } if ($data == 4) { $data = $LANG_MG04['three_chip_color_area_sensor']; } if ($data == 5) { $data = $LANG_MG04['color_sequential_area_sensor']; } if ($data == 7) { $data = $LANG_MG04['trilinear_sensor']; } if ($data == 8) { $data = $LANG_MG04['color_sequential_linear_sensor']; } else { $data = $LANG_MG04['unknown'] . ": " . $data; } } else { if ($tag == '0106') { // PhotometricInterpretation if ($data == 1) { $data = $LANG_MG04['monochrome']; } else { if ($data == 2) { $data = $LANG_MG04['rgb']; } else { if ($data == 6) { $data = $LANG_MG04['ycbcr']; } else { $data = $LANG_MG04['unknown'] . ": " . $data; } } } } } } } } } } } } } } } //} else if($tag=="a408" || $tag=="a40a") { // Contrast, Sharpness // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Soft"; break; // case 2: $data="Hard"; break; // default: $data="Unknown"; break; // } //} else if($tag=="a409") { // Saturation // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Low saturation"; break; // case 2: $data="High saturation"; break; // default: $data="Unknown"; break; // } //} else if($tag=="a402") { // Exposure Mode // switch($data) { // case 0: $data="Auto exposure"; break; // case 1: $data="Manual exposure"; break; // case 2: $data="Auto bracket"; break; // default: $data="Unknown"; break; // } } else { if ($type == 'UNDEFINED') { if ($tag == '9000' || $tag == 'a000' || $tag == '0002') { // ExifVersion,FlashPixVersion,InteroperabilityVersion $data = 'version' . ' ' . $data / 100; } if ($tag == 'a300') { // FileSource $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace("03", $LANG_MG04['digital_still_camera'], $data); } if ($tag == 'a301') { // SceneType $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace("01", $LANG_MG04['directly_photographed'], $data); } if ($tag == '9101') { // ComponentsConfiguration $data = bin2hex($data); $data = str_replace('01', 'Y', $data); $data = str_replace('02', 'Cb', $data); $data = str_replace('03', 'Cr', $data); $data = str_replace('04', 'R', $data); $data = str_replace('05', 'G', $data); $data = str_replace('06', 'B', $data); $data = str_replace('00', '', $data); } //if($tag=="9286") { //UserComment // $encoding = rtrim(substr($data, 0, 8)); // $data = rtrim(substr($data, 8)); //} } else { $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } } } } } return $data; }
/** * Filter for handling image objects * * @param object $image * @return object */ static function new_image($image) { global $_zp_exifvars; $source = ''; $metadata_path = ''; $files = safe_glob(substr($image->localpath, 0, strrpos($image->localpath, '.')) . '.*'); if (count($files) > 0) { foreach ($files as $file) { if (strtolower(getSuffix($file)) == XMP_EXTENSION) { $metadata_path = $file; break; } } } if (!empty($metadata_path)) { $source = self::extractXMP(file_get_contents($metadata_path)); } else { if (getOption('xmpMetadata_examine_images_' . strtolower(substr(strrchr($image->localpath, "."), 1)))) { $f = file_get_contents($image->localpath); $l = filesize($image->localpath); $abort = 0; $i = 0; while ($i < $l && $abort < 200 && !$source) { $tag = bin2hex(substr($f, $i, 2)); $size = hexdec(bin2hex(substr($f, $i + 2, 2))); switch ($tag) { case 'ffe1': // EXIF // EXIF case 'ffe2': // EXIF extension // EXIF extension case 'fffe': // COM // COM case 'ffe0': // IPTC marker $source = self::extractXMP($f); $i = $i + $size + 2; $abort = 0; break; default: if ($f[$i] == '<') { $source = self::extractXMP($f); } $i = $i + 1; $abort++; break; } } } } if (!empty($source)) { $metadata = self::extract($source); $image->set('hasMetadata', count($metadata > 0)); foreach ($metadata as $field => $element) { if (array_key_exists($field, $_zp_exifvars)) { if (!$_zp_exifvars[$field][5]) { continue; // the field has been disabled } } $v = self::to_string($element); switch ($field) { case 'EXIFDateTimeOriginal': $image->setDateTime($element); break; case 'IPTCImageCaption': $image->setDesc($v); break; case 'IPTCCity': $image->setCity($v); break; case 'IPTCState': $image->setState($v); break; case 'IPTCLocationName': $image->setCountry($v); break; case 'IPTCSubLocation': $image->setLocation($v); break; case 'EXIFExposureTime': $v = formatExposure(self::rationalNum($element)); break; case 'EXIFFocalLength': $v = self::rationalNum($element) . ' mm'; break; case 'EXIFAperatureValue': case 'EXIFFNumber': $v = 'f/' . self::rationalNum($element); break; case 'EXIFExposureBiasValue': case 'EXIFGPSAltitude': $v = self::rationalNum($element); break; case 'EXIFGPSLatitude': case 'EXIFGPSLongitude': $ref = substr($element, -1, 1); $image->set($field . 'Ref', $ref); $element = substr($element, 0, -1); $n = explode(',', $element); if (count($n) == 3) { $v = $n[0] + ($n[1] + $n[2] / 60 / 60); } else { $v = $n[0] + $n[1] / 60; } break; case 'rating': $v = min(getoption('rating_stars_count'), $v) * min(1, getOption('rating_split_stars')); $image->set('total_value', $v); $image->set('total_votes', 1); break; case 'watermark': case 'watermark_use': case 'custom_data': case 'codeblock': case 'owner': $image->set($field, $v); break; case 'IPTCKeywords': if (!is_array($element)) { $element = explode(',', $element); } $image->setTags($element); break; } if (array_key_exists($field, $_zp_exifvars)) { $image->set($field, $v); } } $image->save(); } return $image; }
function formatData($type, $tag, $intel, $data) { switch ($type) { case 'ASCII': if (($pos = strpos($data, chr(0))) !== false) { // Search for a null byte and stop there. $data = substr($data, 0, $pos); } if ($tag == '010f') { $data = ucwords(strtolower(trim($data))); } // Format certain kinds of strings nicely (Camera make etc.) break; case 'URATIONAL': case 'SRATIONAL': switch ($tag) { case '011a': // XResolution // XResolution case '011b': // YResolution $data = round(unRational($data, $type, $intel)) . ' dots per ResolutionUnit'; break; case '829a': // Exposure Time $data = formatExposure(unRational($data, $type, $intel)); break; case '829d': // FNumber $data = 'f/' . round(unRational($data, $type, $intel), 2); break; case '9204': // ExposureBiasValue (assume signed!) $data = round(unRational($data, 'SRATIONAL', $intel), 2) . ' EV'; break; case '9205': // ApertureValue // ApertureValue case '9202': // MaxApertureValue // ApertureValue is given in the APEX Mode. Many thanks to Matthieu Froment for this code // The formula is : Aperture = 2*log2(FNumber) <=> FNumber = e((Aperture.ln(2))/2) $datum = exp(unRational($data, $type, $intel) * log(2) / 2); $data = 'f/' . round($datum, 1); // Focal is given with a precision of 1 digit. break; case '920a': // FocalLength $data = unRational($data, $type, $intel) . ' mm'; break; case '9201': // ShutterSpeedValue // The ShutterSpeedValue is given in the APEX mode. Many thanks to Matthieu Froment for this code // The formula is : Shutter = - log2(exposureTime) (Appendix C of EXIF spec.) // Where shutter is in APEX, log2(exposure) = ln(exposure)/ln(2) // So final formula is : exposure = exp(-ln(2).shutter) // The formula can be developed : exposure = 1/(exp(ln(2).shutter)) $datum = exp(unRational($data, $type, $intel) * log(2)); if ($datum != 0) { $datum = 1 / $datum; } $data = formatExposure($datum); break; default: $data = unRational($data, $type, $intel); break; } break; case 'USHORT': case 'SSHORT': case 'ULONG': case 'SLONG': case 'FLOAT': case 'DOUBLE': $data = rational($data, $type, $intel); switch ($tag) { case '0112': // Orientation // Example of how all of these tag formatters should be... switch ($data) { case 0: // not set, presume normal // not set, presume normal case 1: $data = '!1: normal (0 deg)!'; break; case 2: $data = '!2: mirrored!'; break; case 3: $data = '!3: upside-down!'; break; case 4: $data = '!4: upside-down mirrored!'; break; case 5: $data = '!5: 90 deg ccw mirrored!'; break; case 6: $data = '!6: 90 deg cw!'; break; case 7: $data = '!7: 90 deg cw mirrored!'; break; case 8: $data = '!8: 90 deg ccw!'; break; default: $data = sprintf('%d: ' . '!unknown!', $data); break; } break; case '0128': // ResolutionUnit // ResolutionUnit case 'a210': // FocalPlaneResolutionUnit // FocalPlaneResolutionUnit case '0128': // ThumbnailResolutionUnit switch ($data) { case 1: $data = '!no unit!'; break; case 2: $data = '!inch!'; break; case 3: $data = '!centimeter!'; break; } break; case '0213': // YCbCrPositioning switch ($data) { case 1: $data = '!center of pixel array!'; break; case 2: $data = '!datum point!'; break; } break; case '8822': // ExposureProgram switch ($data) { case 1: $data = '!manual!'; break; case 2: $data = '!program!'; break; case 3: $data = '!aperture priority!'; break; case 4: $data = '!shutter priority!'; break; case 5: $data = '!program creative!'; break; case 6: $data = '!program action!'; break; case 7: $data = '!portrait!'; break; case 8: $data = '!landscape!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case '8830': // SensitivityType switch ($data) { case 1: $data = '!standard output sensitivity!'; break; case 2: $data = '!recommended exposure index!'; break; case 3: $data = '!iso speed!'; break; case 4: $data = '!standard output sensitivity and recommended exposure index!'; break; case 5: $data = '!standard output sensitivity and iso speed!'; break; case 6: $data = '!recommended exposure index and iso speed!'; break; case 7: $data = '!standard output sensitivity, recommended exposure index and iso speed!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case '9207': // MeteringMode switch ($data) { case 1: $data = '!average!'; break; case 2: $data = '!center weighted average!'; break; case 3: $data = '!spot!'; break; case 4: $data = '!multi-spot!'; break; case 5: $data = '!pattern!'; break; case 6: $data = '!partial!'; break; case 255: $data = '!other!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case '9208': // LightSource switch ($data) { case 1: $data = '!daylight!'; break; case 2: $data = '!fluorescent!'; break; case 3: $data = '!tungsten!'; break; // 3 Tungsten (Incandescent light) // 4 Flash // 9 Fine Weather // 3 Tungsten (Incandescent light) // 4 Flash // 9 Fine Weather case 10: $data = '!flash!'; break; // 10 Cloudy Weather // 11 Shade // 12 Daylight Fluorescent (D 5700 - 7100K) // 13 Day White Fluorescent (N 4600 - 5400K) // 14 Cool White Fluorescent (W 3900 -4500K) // 15 White Fluorescent (WW 3200 - 3700K) // 10 Flash // 10 Cloudy Weather // 11 Shade // 12 Daylight Fluorescent (D 5700 - 7100K) // 13 Day White Fluorescent (N 4600 - 5400K) // 14 Cool White Fluorescent (W 3900 -4500K) // 15 White Fluorescent (WW 3200 - 3700K) // 10 Flash case 17: $data = '!standard light a!'; break; case 18: $data = '!standard light b!'; break; case 19: $data = '!standard light c!'; break; case 20: $data = 'D55'; break; case 21: $data = 'D65'; break; case 22: $data = 'D75'; break; case 23: $data = 'D50'; break; case 24: $data = '!iso studio tungsten!'; break; case 255: $data = '!other!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case '9209': // Flash switch ($data) { case 0: case 16: case 24: case 32: case 64: case 80: $data = '!no flash!'; break; case 1: $data = '!flash!'; break; case 5: $data = '!flash, strobe return light not detected!'; break; case 7: $data = '!flash, strobe return light detected!'; break; case 9: $data = '!compulsory flash!'; break; case 13: $data = '!compulsory flash, return light not detected!'; break; case 15: $data = '!compulsory flash, return light detected!'; break; case 25: $data = '!flash, auto-mode!'; break; case 29: $data = '!flash, auto-mode, return light not detected!'; break; case 31: $data = '!flash, auto-mode, return light detected!'; break; case 65: $data = '!red eye!'; break; case 69: $data = '!red eye, return light not detected!'; break; case 71: $data = '!red eye, return light detected!'; break; case 73: $data = '!red eye, compulsory flash!'; break; case 77: $data = '!red eye, compulsory flash, return light not detected!'; break; case 79: $data = '!red eye, compulsory flash, return light detected!'; break; case 89: $data = '!red eye, auto-mode!'; break; case 93: $data = '!red eye, auto-mode, return light not detected!'; break; case 95: $data = '!red eye, auto-mode, return light detected!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case 'a001': // ColorSpace if ($data == 1) { $data = '!srgb!'; } else { $data = '!uncalibrated!'; } break; case 'a002': // ExifImageWidth // ExifImageWidth case 'a003': // ExifImageHeight $data = $data . ' ' . '!pixels!'; break; case '0103': // Compression switch ($data) { case 1: $data = '!no compression!'; break; case 6: $data = '!jpeg compression!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case 'a217': // SensingMethod switch ($data) { case 1: $data = '!not defined!'; break; case 2: $data = '!one chip color area sensor!'; break; case 3: $data = '!two chip color area sensor!'; break; case 4: $data = '!three chip color area sensor!'; break; case 5: $data = '!color sequential area sensor!'; break; case 7: $data = '!trilinear sensor!'; break; case 8: $data = '!color sequential linear sensor!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; case '0106': // PhotometricInterpretation switch ($data) { case 1: $data = '!monochrome!'; break; case 2: $data = '!rgb!'; break; case 6: $data = '!ycbcr!'; break; default: $data = '!unknown!' . ': ' . $data; break; } break; //case "a408": // Contrast //case "a40a": //Sharpness // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Soft"; break; // case 2: $data="Hard"; break; // default: $data="Unknown"; break; // } // break; //case "a409": // Saturation // switch($data) { // case 0: $data="Normal"; break; // case 1: $data="Low saturation"; break; // case 2: $data="High saturation"; break; // default: $data="Unknown"; break; // } // break; //case "a402": // Exposure Mode // switch($data) { // case 0: $data="Auto exposure"; break; // case 1: $data="Manual exposure"; break; // case 2: $data="Auto bracket"; break; // default: $data="Unknown"; break; // } // break; } break; case 'UNDEFINED': switch ($tag) { case '9000': // ExifVersion // ExifVersion case 'a000': // FlashPixVersion // FlashPixVersion case '0002': // InteroperabilityVersion $data = '!version!' . ' ' . $data / 100; break; case 'a300': // FileSource $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace('03', '!digital still camera!', $data); break; case 'a301': // SceneType $data = bin2hex($data); $data = str_replace('00', '', $data); $data = str_replace('01', '!directly photographed!', $data); break; case '9101': // ComponentsConfiguration $data = bin2hex($data); $data = str_replace('01', 'Y', $data); $data = str_replace('02', 'Cb', $data); $data = str_replace('03', 'Cr', $data); $data = str_replace('04', 'R', $data); $data = str_replace('05', 'G', $data); $data = str_replace('06', 'B', $data); $data = str_replace('00', '', $data); break; //case "9286": //UserComment // $encoding = rtrim(substr($data, 0, 8)); // $data = rtrim(substr($data, 8)); // break; } break; default: $data = bin2hex($data); if ($intel == 1) { $data = intel2Moto($data); } break; } return $data; }
/** * Filter for handling image objects * * @param object $image * @return object */ static function new_image($image) { $source = ''; $metadata_path = ''; $files = safe_glob(substr($image->localpath, 0, strrpos($image->localpath, '.')) . '.*'); if (count($files) > 0) { foreach ($files as $file) { if (strtolower(getSuffix($file)) == XMP_EXTENSION) { $metadata_path = $file; break; } } } if (!empty($metadata_path)) { $source = self::extractXMP(file_get_contents($metadata_path)); } else { if (getOption('xmpMetadata_examine_images_' . strtolower(substr(strrchr($image->localpath, "."), 1)))) { $f = file_get_contents($image->localpath); $l = filesize($image->localpath); $abort = 0; $i = 0; while ($i < $l && $abort < 200 && !$source) { $tag = bin2hex(substr($f, $i, 2)); $size = hexdec(bin2hex(substr($f, $i + 2, 2))); switch ($tag) { case 'ffe1': // EXIF // EXIF case 'ffe2': // EXIF extension // EXIF extension case 'fffe': // COM // COM case 'ffe0': // IPTC marker $source = self::extractXMP($f); $i = $i + $size + 2; $abort = 0; break; default: if ($f[$i] == '<') { $source = self::extractXMP($f); } $i = $i + 1; $abort++; break; } } } } // direct import to ZenPhoto20 fields with no processing required $import = array('location' => 'XMPSubLocation', 'city' => 'XMPCity', 'city' => 'XMPCity', 'state' => 'XMPState', 'country' => 'XMPLocationName', 'copyright' => 'XMPCopyright', 'rotation' => 'XMPOrientation'); if (!empty($source)) { $metadata = self::extract($source); if (count($metadata > 0)) { $exifVars = self::getMetadataFields(); foreach ($metadata as $field => $element) { if (!array_key_exists($field, $exifVars) || $exifVars[$field][5]) { $image->set('hasMetadata', 1); $v = self::to_string($element); if (($key = array_search($field, $import)) !== false) { $image->set($key, $v); } else { switch ($field) { case 'XMPSource': if (!isset($metadata['XMPImageCredit'])) { $this->set('credit', $v); } break; case 'XMPImageCredit': $this->set('credit', $v); break; case 'XMPImageHeadline': if (getoption('transform_newlines')) { $v = nl2br($v); } $image->setTitle($v); break; case 'XMPImageCaption': if (getoption('transform_newlines')) { $v = nl2br(v); } $image->setDesc($v); break; case 'XMPDateTimeOriginal': $image->setDateTime($element); break; case 'XMPExposureTime': $v = formatExposure(self::rationalNum($element)); break; case 'XMPFocalLength': $v = self::rationalNum($element) . ' mm'; break; case 'XMPAperatureValue': case 'XMPFNumber': $v = 'f/' . self::rationalNum($element); break; case 'XMPExposureBiasValue': case 'XMPGPSAltitude': $v = self::rationalNum($element); break; case 'XMPGPSLatitude': case 'XMPGPSLongitude': $n = explode(',', substr($element, 0, -1)); $r = $n[0] + $n[1] / 60; $ref = strtoupper(substr($element, -1, 1)); $v = Image::toDMS($r, $ref); if (in_array($ref, array('S', 'W'))) { $r = -$r; } $r = (double) $r; $image->set(substr($field, 3), $r); break; case 'XMPLensInfo': preg_match_all('~(\\d+/\\d+)~', $v, $matches); if (isset($matches[1]) && !empty($matches[1])) { $lens = array(); foreach ($matches[1] as $i => $f) { $term = explode('/', $f); if ($term[0] != 0 && $term[1] != 0) { $lens[$i] = convertToFraction($term[0] / $term[1]); } else { $lens[$i] = 0; } } if ($lens[0] == $lens[1]) { $v = sprintf('%0.0fmm', $lens[0]); } else { $v = sprintf('%0.0f-%0.0fmm', $lens[0], $lens[1]); } if ($lens[2] == $lens[3]) { if ($lens[2] != 0) { $v .= sprintf(' f/%0.1f', $lens[2]); } } else { $v .= sprintf(' f/%0.1f-%0.1f', $lens[3], $lens[2]); } } break; case 'rating': $v = min(getoption('rating_stars_count'), $v) * min(1, getOption('rating_split_stars')); $image->set('total_value', $v); $image->set('total_votes', 1); break; case 'XMPKeywords': if (!is_array($element)) { $element = explode(',', $element); } $element = array_unique(array_merge($image->getTags(), $element)); $image->setTags($element); break; } } $image->set($field, $v); } } $image->save(); } } return $image; }