diff --git a/exifer/upstream/exif.php b/exifer/upstream/exif.php index a282410..45ae585 100644 --- a/exifer/upstream/exif.php +++ b/exifer/upstream/exif.php @@ -140,6 +140,8 @@ + Fixed bug with newer Olympus cameras where number of fields was miscalculated leading to bad performance. + More logical fraction calculation for shutter speed. + +2009: For all further changes, see the Zenphoto change logs. */ @@ -160,13 +162,11 @@ function intel2Moto($intel) { $cache[$intel] = ''; $len = strlen($intel); - if ($len > 1000) { - debugLogBacktrace('intel2Moto called with unreasonable data string: length='.$len); - trigger_error(sprintf(gettext('intel2Moto called with unreasonable data string: length=%s. See debug log for details. (Setting DEBUG_EXIF to true might help locate problem images.)'),$len)); - } else { - for($i = 0; $i <= $len; $i += 2) { - $cache[$intel] .= substr($intel, $len-$i, 2); - } + if ($len > 1000) { // an unreasonable length, override it. + $len = 1000; + } + for($i = 0; $i <= $len; $i += 2) { + $cache[$intel] .= substr($intel, $len-$i, 2); } return $cache[$intel]; } @@ -212,7 +212,7 @@ function lookup_tag($tag) { case '8827': $tag = 'ISOSpeedRatings'; break; // integer 0-65535 case '9000': $tag = 'ExifVersion'; break; // ?? case '9003': $tag = 'DateTimeOriginal'; break; // YYYY:MM:DD HH:MM:SS - case '9004': $tag = 'DateTimedigitized'; break; // YYYY:MM:DD HH:MM:SS + case '9004': $tag = 'DateTimeDigitized'; break; // YYYY:MM:DD HH:MM:SS case '9101': $tag = 'ComponentsConfiguration'; break; // ?? case '9102': $tag = 'CompressedBitsPerPixel'; break; // positive rational number case '9201': $tag = 'ShutterSpeedValue'; break; // seconds or fraction of seconds 1/x @@ -348,258 +348,321 @@ function lookup_type(&$type,&$size) { } //================================================================================================ -// Formats Data for the data type +// processes a irrational number //================================================================================================ -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') { +function unRational($data, $type, $intel) { $data = bin2hex($data); - if ($intel == 1) $data = intel2Moto($data); - - if ($intel == 1) $top = hexdec(substr($data,8,8)); // intel stores them bottom-top - else $top = hexdec(substr($data,0,8)); // motorola stores them top-bottom - - if ($intel == 1) $bottom = hexdec(substr($data,0,8)); // intel stores them bottom-top - else $bottom = hexdec(substr($data,8,8)); // motorola stores them top-bottom + if ($intel == 1) { + $data = intel2Moto($data); + $top = hexdec(substr($data,8,8)); // intel stores them bottom-top + $bottom = hexdec(substr($data,0,8)); // intel stores them bottom-top + } else { + $top = hexdec(substr($data,0,8)); // motorola stores them top-bottom + $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 { + if ($bottom != 0) + $data=$top/$bottom; + else + if ($top == 0) $data = 0; + else + $data = $top.'/'.$bottom; + return $data; +} + +//================================================================================================ +// processes a rational number +//================================================================================================ +function rational($data,$type,$intel) { + if (($type == 'USHORT' || $type == 'SSHORT')) { + $data = substr($data,0,2); + } + $data = bin2hex($data); + if ($intel == 1) { + $data = intel2Moto($data); + } + $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 + return $data; +} + +//================================================================================================ +// Formats Data for the data type +//================================================================================================ +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); } - $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 = 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; + 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 + 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 + 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; } - - } 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'); // 3 Tungsten (Incandescent light) - // 4 Flash - // 9 Fine Weather - else if ($data == 10) $data = gettext('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 - 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 + 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 + 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 + case 'a210': // 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 + 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 + 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 + 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 + case 'a000': // 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); - $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); + if ($intel == 1) $data = intel2Moto($data); + break; } - return $data; } function formatExposure($data) { - if ($data > 0) { + if (strpos($data,'/')===false) { if ($data > 1) { return round($data, 2).' '.gettext('sec'); } else { @@ -666,30 +729,30 @@ function read_entry(&$result,$in,$seek,$intel,$ifd_name,$globalOffset) { if ($result['VerboseOutput'] == 1) { $result[$ifd_name]['MakerNote']['RawData'] = $data; } - if (eregi('NIKON',$make)) { + if (preg_match('/NIKON/i',$make)) { require_once(dirname(__FILE__).'/makers/nikon.php'); parseNikon($data,$result); $result[$ifd_name]['KnownMaker'] = 1; - } else if (eregi('OLYMPUS',$make)) { + } else if (preg_match('/OLYMPUS/i',$make)) { require_once(dirname(__FILE__).'/makers/olympus.php'); parseOlympus($data,$result,$seek,$globalOffset); $result[$ifd_name]['KnownMaker'] = 1; - } else if (eregi('Canon',$make)) { + } else if (preg_match('/Canon/i',$make)) { require_once(dirname(__FILE__).'/makers/canon.php'); parseCanon($data,$result,$seek,$globalOffset); $result[$ifd_name]['KnownMaker'] = 1; - } else if (eregi('FUJIFILM',$make)) { + } else if (preg_match('/FUJIFILM/i',$make)) { require_once(dirname(__FILE__).'/makers/fujifilm.php'); parseFujifilm($data,$result); $result[$ifd_name]['KnownMaker'] = 1; - } else if (eregi('SANYO',$make)) { + } else if (preg_match('/SANYO/i',$make)) { require_once(dirname(__FILE__).'/makers/sanyo.php'); parseSanyo($data,$result,$seek,$globalOffset); $result[$ifd_name]['KnownMaker'] = 1; - } else if (eregi('Panasonic',$make)) { - require_once(dirname(__FILE__).'/makers/panasonic.php'); - parsePanasonic($data,$result,$seek,$globalOffset); - $result[$ifd_name]['KnownMaker'] = 1; + } else if (preg_match('/Panasonic/i',$make)) { + require_once(dirname(__FILE__).'/makers/panasonic.php'); + parsePanasonic($data,$result,$seek,$globalOffset); + $result[$ifd_name]['KnownMaker'] = 1; } else { $result[$ifd_name]['KnownMaker'] = 0; } @@ -709,9 +772,9 @@ function read_entry(&$result,$in,$seek,$intel,$ifd_name,$globalOffset) { $data = bin2hex($data); if ($intel == 1) $data = intel2Moto($data); } - $result[$ifd_name][$tag_name.'_Verbose']['RawData'] = $data; + $result[$ifd_name][$tag_name.'_Verbose']['RawData'] = $data; $result[$ifd_name][$tag_name.'_Verbose']['Type'] = $type; - $result[$ifd_name][$tag_name.'_Verbose']['Bytes'] = $bytesofdata; + $result[$ifd_name][$tag_name.'_Verbose']['Bytes'] = $bytesofdata; } } } @@ -912,7 +975,7 @@ function read_exif_data_raw($path,$verbose) { $v = fseek($in,$globalOffset+$ExitOffset); if ($v == -1) { $result['Errors'] = $result['Errors']+1; - $result['Error'][$result['Errors']] = gettext('Couldnt Find SubIFD'); + $result['Error'][$result['Errors']] = gettext('Could not Find SubIFD'); } //=========================================================== @@ -932,7 +995,12 @@ function read_exif_data_raw($path,$verbose) { } // Add the 35mm equivalent focal length: - $result['SubIFD']['FocalLength35mmEquiv'] = get35mmEquivFocalLength($result); + if (isset($result['IFD0']['FocalLengthIn35mmFilm']) && !isset($result['SubIFD']['FocalLengthIn35mmFilm'])) { // found in the wrong place + $result['SubIFD']['FocalLengthIn35mmFilm'] = $result['IFD0']['FocalLengthIn35mmFilm']; + } + if (!isset($result['SubIFD']['FocalLengthIn35mmFilm'])) { + $result['SubIFD']['FocalLengthIn35mmFilm'] = get35mmEquivFocalLength($result); + } // Check for IFD1 if (!isset($result['IFD1Offset']) || $result['IFD1Offset'] == 0) { @@ -944,7 +1012,7 @@ function read_exif_data_raw($path,$verbose) { $v = fseek($in,$globalOffset+$result['IFD1Offset']); if ($v == -1) { $result['Errors'] = $result['Errors']+1; - $result['Error'][$result['Errors']] = gettext('Couldnt Find IFD1'); + $result['Error'][$result['Errors']] = gettext('Could not Find IFD1'); } //=========================================================== @@ -984,7 +1052,7 @@ function read_exif_data_raw($path,$verbose) { $v = fseek($in,$globalOffset+$result['SubIFD']['ExifInteroperabilityOffset']); if ($v == -1) { $result['Errors'] = $result['Errors']+1; - $result['Error'][$result['Errors']] = gettext('Couldnt Find InteroperabilityIFD'); + $result['Error'][$result['Errors']] = gettext('Could not Find InteroperabilityIFD'); } //=========================================================== @@ -1028,7 +1096,7 @@ function ConvertToFraction($v, &$n, &$d) { //================================================================================================ function get35mmEquivFocalLength(&$result) { if (isset($result['SubIFD']['ExifImageWidth'])) { - $width = $result['SubIFD']['ExifImageWidth']; + $width = $result['SubIFD']['ExifImageWidth']; } else { $width = 0; } @@ -1054,7 +1122,7 @@ function get35mmEquivFocalLength(&$result) { } else { $fl = 0; } - + if (($width != 0) && !empty($units) && !empty($xres) && !empty($fl) && !empty($width)) { $ccdwidth = ($width * $unitfactor) / $xres; $equivfl = $fl / $ccdwidth*36+0.5; @@ -1063,10 +1131,4 @@ function get35mmEquivFocalLength(&$result) { return null; } -if (!function_exists('debugLogBacktrace')) { - // define this function for stand-alone uses if exifier - function debugLogBacktrace($msg) { - } -} - ?> diff --git a/exifer/upstream/makers/canon.php b/exifer/upstream/makers/canon.php index 2536fd2..abdedcf 100644 --- a/exifer/upstream/makers/canon.php +++ b/exifer/upstream/makers/canon.php @@ -40,6 +40,7 @@ function lookup_Canon_tag($tag) { case "0009": $tag = "OwnerName";break; case "000c": $tag = "CameraSerialNumber";break; case "000f": $tag = "CustomFunctions";break; + case "0095": $tag = "LensInfo";break; default: $tag = "unknown:".$tag;break; } @@ -57,13 +58,7 @@ function formatCanonData($type,$tag,$intel,$data,$exif,&$result) { if($type=="ASCII") { $result = $data = str_replace("\0", "", $data); } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; + $data = unRational($data,$type,$intel); if($tag=="0204") { //DigitalZoom $data=$data."x"; @@ -71,7 +66,7 @@ function formatCanonData($type,$tag,$intel,$data,$exif,&$result) { } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); + $data = rational($data,$type,$intel); $result['RAWDATA'] = $data; if($tag=="0001") { //first chunk @@ -377,20 +372,18 @@ function parseCanon($block,&$result,$seek, $globalOffset) { //2 byte type $type = bin2hex(substr($block,$place,2));$place+=2; if($intel==1) $type = intel2Moto($type); - lookup_type($type,$size); + lookup_type($type,$size); //4 byte count of number of data units $count = bin2hex(substr($block,$place,4));$place+=4; if($intel==1) $count = intel2Moto($count); $bytesofdata = $size*hexdec($count); - if($bytesofdata<=0) { return; //if this value is 0 or less then we have read all the tags we can } //4 byte value of data or pointer to data $value = substr($block,$place,4);$place+=4; - if($bytesofdata<=4) { $data = $value; } else { diff --git a/exifer/upstream/makers/fujifilm.php b/exifer/upstream/makers/fujifilm.php index 80567b1..dce3c58 100644 --- a/exifer/upstream/makers/fujifilm.php +++ b/exifer/upstream/makers/fujifilm.php @@ -44,7 +44,6 @@ function lookup_Fujifilm_tag($tag) { case "1021": $tag = "FocusMode";break; case "1030": $tag = "SlowSync";break; case "1031": $tag = "PictureMode";break; - case "1032": $tag = "Unknown";break; case "1100": $tag = "ContinuousTakingBracket";break; case "1200": $tag = "Unknown";break; case "1300": $tag = "BlurWarning";break; @@ -66,22 +65,14 @@ function formatFujifilmData($type,$tag,$intel,$data) { } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; + $data = unRational($data,$type,$intel); if($tag=="1011") { //FlashStrength $data=$data." EV"; } } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $data=hexdec($data); + $data =rational($data,$type,$intel); if($tag=="1001") { //Sharpness if($data == 1) $data = gettext("Soft"); diff --git a/exifer/upstream/makers/gps.php b/exifer/upstream/makers/gps.php index 3869fda..5494c8b 100644 --- a/exifer/upstream/makers/gps.php +++ b/exifer/upstream/makers/gps.php @@ -72,103 +72,66 @@ function lookup_GPS_tag($tag) { return $tag; } -//================= -// Formats a rational number -//==================================================================== -function GPSRational($data, $intel) { - - if($intel==1) $top = hexdec(substr($data,8,8)); //intel stores them bottom-top - else $top = hexdec(substr($data,0,8)); //motorola stores them top-bottom - - if($intel==1) $bottom = hexdec(substr($data,0,8)); //intel stores them bottom-top - else $bottom = hexdec(substr($data,8,8)); //motorola stores them top-bottom - - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - - return $data; -} //================= // Formats Data for the data type //==================================================================== function formatGPSData($type,$tag,$intel,$data) { if($type=="ASCII") { - if($tag=="0001" || $tag=="0003"){ // Latitude Reference, Longitude Reference - $data = ($data{1} == $data{2} && $data{1} == $data{3}) ? $data{0} : $data; - } - + if($tag=="0001" || $tag=="0003"){ // Latitude Reference, Longitude Reference + $data = ($data{1} == $data{2} && $data{1} == $data{3}) ? $data{0} : $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)); //intel stores them bottom-top - else $top = hexdec(substr($data,0,8)); //motorola stores them top-bottom - - if($intel==1) $bottom = hexdec(substr($data,0,8)); //intel stores them bottom-top - 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($tag=="0002" || $tag=="0004") { //Latitude, Longitude - - if($intel==1){ - $seconds = GPSRational(substr($data,0,16),$intel); - $hour = GPSRational(substr($data,32,16),$intel); - } else { - $hour= GPSRational(substr($data,0,16),$intel); - $seconds = GPSRational(substr($data,32,16),$intel); - } - $minutes = GPSRational(substr($data,16,16),$intel); - - $data = $hour+$minutes/60+$seconds/3600; - } else if($tag=="0007") { //Time - $seconds = GPSRational(substr($data,0,16),$intel); - $minutes = GPSRational(substr($data,16,16),$intel); - $hour = GPSRational(substr($data,32,16),$intel); - - $data = $hour.":".$minutes.":".$seconds; + if($tag=="0002" || $tag=="0004" || $tag=='0007') { //Latitude, Longitude, Time + $datum = array(); + for ($i=0;$i 1024) { $result['Errors'] = $result['Errors']++; + $data = ''; + $type = 'ASCII'; + } else { + $value = bin2hex($value); + if($intel==1) $value = intel2Moto($value); + $v = fseek($seek,$globalOffset+hexdec($value)); //offsets are from TIFF header which is 12 bytes from the start of the file + if($v==0) { + $data = fread($seek, $bytesofdata); + } else { + $result['Errors'] = $result['Errors']++; + $data = ''; + $type = 'ASCII'; + } } } - if($result['VerboseOutput']==1) { $result['GPS'][$tag_name] = formatGPSData($type,$tag,$intel,$data); $result['GPS'][$tag_name."_Verbose"]['RawData'] = bin2hex($data); @@ -242,7 +210,7 @@ function parseGPS($block,&$result,$offset,$seek, $globalOffset) { $result['GPS'][$tag_name."_Verbose"]['Bytes'] = $bytesofdata; } else { $result['GPS'][$tag_name] = formatGPSData($type,$tag,$intel,$data); - } + } } } diff --git a/exifer/upstream/makers/nikon.php b/exifer/upstream/makers/nikon.php index 813cbc6..a00119a 100644 --- a/exifer/upstream/makers/nikon.php +++ b/exifer/upstream/makers/nikon.php @@ -57,8 +57,32 @@ function lookup_Nikon_tag($tag,$model) { case "0008": $tag = "FlashSetting";break; case "0009": $tag = "FlashMode";break; case "000b": $tag = "WhiteBalanceFine";break; + case "000c": $tag = "WB_RBLevels";break; + case "000d": $tag = "ProgramShift";break; + case "000e": $tag = "ExposureDifference";break; case "000f": $tag = "ISOSelection";break; - case "0013": $tag = "ISOSelection2";break; + case "0010": $tag = "DataDump";break; + case "0011": $tag = "NikonPreview";break; + case "0012": $tag = "FlashExposureComp";break; + case "0013": $tag = "ISOSetting2";break; + case "0014": $tag = "ColorBalanceA";break; + case "0016": $tag = "ImageBoundary";break; + case "0017": $tag = "FlashExposureComp";break; + case "0018": $tag = "FlashExposureBracketValue";break; + case "0019": $tag = "ExposureBracketValue";break; + case "001a": $tag = "ImageProcessing";break; + case "001b": $tag = "CropHiSpeed";break; + case "001c": $tag = "ExposureTuning";break; + case "001d": $tag = "SerialNumber";break; + case "001e": $tag = "ColorSpace";break; + case "001f": $tag = "VRInfo";break; + case "0020": $tag = "ImageAuthentication";break; + case "0022": $tag = "ActiveD-Lighting";break; + case "0023": $tag = "PictureControl";break; + case "0024": $tag = "WorldTime";break; + case "0025": $tag = "ISOInfo";break; + case "002a": $tag = "VignetteControl";break; + case "002b": $tag = "DistortInfo";break; case "0080": $tag = "ImageAdjustment";break; case "0081": $tag = "ToneCompensation";break; case "0082": $tag = "Adapter";break; @@ -68,11 +92,16 @@ function lookup_Nikon_tag($tag,$model) { case "0086": $tag = "DigitalZoom";break; case "0087": $tag = "FlashUsed";break; case "0088": $tag = "AFFocusPosition";break; + case "0089": $tag = "ShootingMode";break; + case "008b": $tag = "LensFStops";break; + case "008c": $tag = "ContrastCurve";break; case "008d": $tag = "ColorMode";break; case "0090": $tag = "LightType";break; + case "0092": $tag = "HueAdjustment";break; + case "0093": $tag = "NEFCompression";break; case "0094": $tag = "Saturation";break; case "0095": $tag = "NoiseReduction";break; - case "0010": $tag = "DataDump";break; + case "009a": $tag = "SensorPixelSize";break; default: $tag = "unknown:".$tag;break; } @@ -81,120 +110,172 @@ function lookup_Nikon_tag($tag,$model) { return $tag; } + //================= // Formats Data for the data type //==================================================================== function formatNikonData($type,$tag,$intel,$model,$data) { - - if($type=="ASCII") { - - - } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - - if($tag=="0085" && $model==1) { //ManualFocusDistance - $data=$data." m"; - } - if($tag=="0086" && $model==1) { //DigitalZoom - $data=$data."x"; - } - if($tag=="000a" && $model==0) { //DigitalZoom - $data=$data."x"; - } - } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $data=hexdec($data); - - if($tag=="0003" && $model==0) { //Quality - if($data == 1) $data = gettext("VGA Basic"); - else if($data == 2) $data = gettext("VGA Normal"); - else if($data == 3) $data = gettext("VGA Fine"); - else if($data == 4) $data = gettext("SXGA Basic"); - else if($data == 5) $data = gettext("SXGA Normal"); - else if($data == 6) $data = gettext("SXGA Fine"); - else $data = gettext("Unknown").": ".$data; - } - if($tag=="0004" && $model==0) { //Color - if($data == 1) $data = gettext("Color"); - else if($data == 2) $data = gettext("Monochrome"); - else $data = gettext("Unknown").": ".$data; - } - if($tag=="0005" && $model==0) { //Image Adjustment - if($data == 0) $data = gettext("Normal"); - else if($data == 1) $data = gettext("Bright+"); - else if($data == 2) $data = gettext("Bright-"); - else if($data == 3) $data = gettext("Contrast+"); - else if($data == 4) $data = gettext("Contrast-"); - else $data = gettext("Unknown").": ".$data; - } - if($tag=="0006" && $model==0) { //CCD Sensitivity - if($data == 0) $data = "ISO-80"; - else if($data == 2) $data = "ISO-160"; - else if($data == 4) $data = "ISO-320"; - else if($data == 5) $data = "ISO-100"; - else $data = gettext("Unknown").": ".$data; - } - if($tag=="0007" && $model==0) { //White Balance - if($data == 0) $data = gettext("Auto"); - else if($data == 1) $data = gettext("Preset"); - else if($data == 2) $data = gettext("Daylight"); - else if($data == 3) $data = gettext("Incandescense"); - else if($data == 4) $data = gettext("Flourescence"); - else if($data == 5) $data = gettext("Cloudy"); - else if($data == 6) $data = gettext("SpeedLight"); - else $data = gettext("Unknown").": ".$data; - } - if($tag=="000b" && $model==0) { //Converter - if($data == 0) $data = gettext("None"); - else if($data == 1) $data = gettext("Fisheye"); - else $data = gettext("Unknown").": ".$data; - } - } else if($type=="UNDEFINED") { - - if($tag=="0001" && $model==1) { //Unknown (Version?) - $data=$data/100; - } - if($tag=="0088" && $model==1) { //AF Focus Position - $temp = gettext("Center"); + switch ($type) { + case "ASCII": + break; // do nothing! + case "URATIONAL": + case"SRATIONAL": + switch ($tag) { + case '0084': // LensInfo + $minFL = unRational(substr($data,0,8),$type,$intel); + $maxFL = unRational(substr($data,8,8),$type,$intel); + $minSP = unRational(substr($data,16,8),$type,$intel); + $maxSP = unRational(substr($data,24,8),$type,$intel); + if ($minFL == $maxFL) { + $data = sprintf('%0.0f f/%0.0f',$minFL,$minSP); + } elseif ($minSP == $maxSP) { + $data = sprintf('%0.0f-%0.0fmm f/%0.1f',$minFL,$maxFL,$minSP); + } else { + $data = sprintf('%0.0f-%0.0fmm f/%0.1f-%0.1f',$minFL,$maxFL,$minSP,$maxSP); + } + break; + case "0085": + if ($model==1) $data=unRational($data,$type,$intel)." m"; //ManualFocusDistance + break; + case "0086": + if ($model==1) $data=unRational($data,$type,$intel)."x"; //DigitalZoom + break; + case "000a": + if ($model==0) $data=unRational($data,$type,$intel)."x"; //DigitalZoom + break; + default: + $data=unRational($data,$type,$intel); + break; + } + break; + case "USHORT": + case $type=="SSHORT": + case $type=="ULONG": + case $type=="SLONG": + case $type=="FLOAT": + case $type=="DOUBLE": + $data = rational($data,$type,$intel); + switch ($tag) { + case "0003": + if ($model==0) { //Quality + switch ($data) { + case 1: $data = gettext("VGA Basic"); break; + case 2: $data = gettext("VGA Normal"); break; + case 3: $data = gettext("VGA Fine"); break; + case 4: $data = gettext("SXGA Basic"); break; + case 5: $data = gettext("SXGA Normal"); break; + case 6: $data = gettext("SXGA Fine"); break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + case "0004": + if ($model==0) { //Color + switch ($data) { + case 1: $data = gettext("Color"); break; + case 2: $data = gettext("Monochrome"); break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + case "0005": + if ($model==0) { //Image Adjustment + switch ($data) { + case 0: $data = gettext("Normal"); break; + case 1: $data = gettext("Bright+"); break; + case 2: $data = gettext("Bright-"); break; + case 3: $data = gettext("Contrast+"); break; + case 4: $data = gettext("Contrast-"); break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + case "0006": + if ($model==0) { //CCD Sensitivity + switch($data) { + case 0: $data = "ISO-80"; break; + case 2: $data = "ISO-160"; break; + case 4: $data = "ISO-320"; break; + case 5: $data = "ISO-100"; break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + case "0007": + if ($model==0) { //White Balance + switch ($data) { + case 0: $data = gettext("Auto"); break; + case 1: $data = gettext("Preset"); break; + case 2: $data = gettext("Daylight"); break; + case 3: $data = gettext("Incandescence"); break; + case 4: $data = gettext("Fluorescence"); break; + case 5: $data = gettext("Cloudy"); break; + case 6: $data = gettext("SpeedLight"); break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + case "000b": + if ($model==0) { //Converter + switch ($data) { + case 0: $data = gettext("None"); break; + case 1: $data = gettext("Fisheye"); break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + } + break; + case "UNDEFINED": + switch ($tag) { + case "0001": + if ($model==1) $data=$data/100; break; //Unknown (Version?) + break; + case "0088": + if ($model==1) { //AF Focus Position + $temp = gettext("Center"); + $data = bin2hex($data); + $data = str_replace("01","Top",$data); + $data = str_replace("02","Bottom",$data); + $data = str_replace("03","Left",$data); + $data = str_replace("04","Right",$data); + $data = str_replace("00","",$data); + if(strlen($data)==0) $data = $temp; + } + break; + } + break; + default: $data = bin2hex($data); - $data = str_replace("01","Top",$data); - $data = str_replace("02","Bottom",$data); - $data = str_replace("03","Left",$data); - $data = str_replace("04","Right",$data); - $data = str_replace("00","",$data); - if(strlen($data)==0) $data = $temp; - } - - } else { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - - if($tag=="0083" && $model==1) { //Lens Type - $data = hexdec(substr($data,0,2)); - if($data == 0) $data = gettext("AF non D"); - else if($data == 1) $data = gettext("Manual"); - else if($data == 2) $data = "AF-D or AF-S"; - else if($data == 6) $data = "AF-D G"; - else if($data == 10) $data = "AF-D VR"; - else $data = gettext("Unknown").": ".$data; - } - if($tag=="0087" && $model==1) { //Flash type - $data = hexdec(substr($data,0,2)); - if($data == 0) $data = gettext("Did Not Fire"); - else if($data == 4) $data = gettext("Unknown"); - else if($data == 7) $data = gettext("External"); - else if($data == 9) $data = gettext("On Camera"); - else $data = gettext("Unknown").": ".$data; - } + if($intel==1) $data = intel2Moto($data); + switch ($tag) { + case "0083": + if ($model==1) { //Lens Type + $data = hexdec(substr($data,0,2)); + switch ($data) { + case 0: $data = gettext("AF non D"); break; + case 1: $data = gettext("Manual"); break; + case 2: $data = "AF-D or AF-S"; break; + case 6: $data = "AF-D G"; break; + case 10: $data = "AF-D VR"; break; + case 14: $data = "AF-D G VR"; break; + default: $data = gettext("Unknown").": ".$data; break; + } + } + break; + case "0087": + if ($model==1) { //Flash type + $data = hexdec(substr($data,0,2)); + if($data == 0) $data = gettext("Did Not Fire"); + else if($data == 4) $data = gettext("Unknown"); + else if($data == 7) $data = gettext("External"); + else if($data == 9) $data = gettext("On Camera"); + else $data = gettext("Unknown").": ".$data; + } + break; + } + break; } - return $data; } diff --git a/exifer/upstream/makers/olympus.php b/exifer/upstream/makers/olympus.php index bc7df6e..027753c 100644 --- a/exifer/upstream/makers/olympus.php +++ b/exifer/upstream/makers/olympus.php @@ -57,24 +57,17 @@ function formatOlympusData($type,$tag,$intel,$data) { if($type=="ASCII") { } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); + $data = unRational($data,$type,$intel); if($intel==1) $data = intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; if($tag=="0204") { //DigitalZoom $data=$data."x"; } if($tag=="0205") { //Unknown2 - $data=$top."/".$bottom; + } } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $data=hexdec($data); + $data = rational($data,$type,$intel); if($tag=="0201") { //JPEGQuality if($data == 1) $data = "SQ"; diff --git a/exifer/upstream/makers/panasonic.php b/exifer/upstream/makers/panasonic.php index afbb31b..5147c4e 100644 --- a/exifer/upstream/makers/panasonic.php +++ b/exifer/upstream/makers/panasonic.php @@ -85,18 +85,10 @@ function formatPanasonicData($type,$tag,$intel,$data) { } } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; + $data = unRational($data,$type,$intel); } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $data=hexdec($data); + $data = rational($data,$type,$intel); if($tag=="0001") { //Image Quality if($data == 2) $data = gettext("High"); diff --git a/exifer/upstream/makers/sanyo.php b/exifer/upstream/makers/sanyo.php index 340e442..bba46e8 100644 --- a/exifer/upstream/makers/sanyo.php +++ b/exifer/upstream/makers/sanyo.php @@ -54,19 +54,10 @@ function formatSanyoData($type,$tag,$intel,$data) { } else if($type=="URATIONAL" || $type=="SRATIONAL") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $top = hexdec(substr($data,8,8)); - $bottom = hexdec(substr($data,0,8)); - if($bottom!=0) $data=$top/$bottom; - else if($top==0) $data = 0; - else $data=$top."/".$bottom; - + $data = unRational($data,$type,$intel); } else if($type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") { - $data = bin2hex($data); - if($intel==1) $data = intel2Moto($data); - $data=hexdec($data); + $data = rational($data,$type,$intel); if($tag=="0200") { //SpecialMode if($data == 0) $data = gettext("Normal");