diff options
Diffstat (limited to 'includes/jpeg_metadata_tk/Makernotes/konica_minolta.php')
| -rw-r--r-- | includes/jpeg_metadata_tk/Makernotes/konica_minolta.php | 745 |
1 files changed, 745 insertions, 0 deletions
diff --git a/includes/jpeg_metadata_tk/Makernotes/konica_minolta.php b/includes/jpeg_metadata_tk/Makernotes/konica_minolta.php new file mode 100644 index 0000000..17bbfbd --- /dev/null +++ b/includes/jpeg_metadata_tk/Makernotes/konica_minolta.php @@ -0,0 +1,745 @@ +<?php + +/****************************************************************************** +* +* Filename: konica_minolta.php +* +* Description: Konica/Minolta Makernote Parser +* Provides functions to decode an Konica/Minolta EXIF makernote and +* to interpret the resulting array into html. +* +* Konica/Minolta Makernote Formats: +* +* Type 1: +* +* Field Size Description +* ---------------------------------------------------------------- +* Header 3 Bytes "MLY" +* Unknown Data Variable Unknown Data +* ---------------------------------------------------------------- +* +* Type 2: +* +* Field Size Description +* ---------------------------------------------------------------- +* Header 2 Bytes "KC" +* Unknown Data Variable Unknown Data +* ---------------------------------------------------------------- +* +* Type 3: +* +* Field Size Description +* ---------------------------------------------------------------- +* Header 8 Bytes "+M+M+M+M" +* Unknown Data Variable Unknown Data +* ---------------------------------------------------------------- +* +* Type 4: +* +* Field Size Description +* ---------------------------------------------------------------- +* Header 5 Bytes "MINOL" +* Unknown Data Variable Unknown Data +* ---------------------------------------------------------------- +* +* Type 5: NO HEADER +* +* Field Size Description +* ---------------------------------------------------------------- +* IFD Data Variable Standard IFD with Olympus Tags +* ---------------------------------------------------------------- +* +* +* Author: Evan Hunter +* +* Date: 30/7/2004 +* +* Project: JPEG Metadata +* +* Revision: 1.00 +* +* URL: http://electronics.ozhiker.com +* +* Copyright: Copyright Evan Hunter 2004 +* This file may be used freely for non-commercial purposes.For +* commercial uses please contact the author: evan@ozhiker.com +* +******************************************************************************/ + +// Konica/Minolta makernote uses Olympus tags - ensure they are included + +include_once 'olympus.php'; + + +// Add the parser functions to the list of Makernote parsers . (Interpreting done by Olympus script) + +$GLOBALS['Makernote_Function_Array']['Read_Makernote_Tag'][] = "get_Minolta_Makernote"; +$GLOBALS['Makernote_Function_Array']['get_Makernote_Text_Value'][] = "get_Minolta_Text_Value"; + + + +/****************************************************************************** +* +* Function: get_Minolta_Makernote +* +* Description: Decodes the Makernote tag and returns the new tag with the decoded +* information attached. Returns false if this is not a makernote +* that can be processed with this script +* +* Parameters: Makernote_Tag - the element of an EXIF array containing the +* makernote, as returned from get_EXIF_JPEG +* EXIF_Array - the entire EXIF array containing the +* makernote, as returned from get_EXIF_JPEG, in +* case more information is required for decoding +* filehnd - an open file handle for the file containing the +* makernote - does not have to be positioned at the +* start of the makernote +* Make_Field - The contents of the EXIF Make field, to aid +* determining whether this script can decode +* the makernote +* +* +* Returns: Makernote_Tag - the Makernote_Tag from the parameters, but +* modified to contain the decoded information +* FALSE - If this script could not decode the makernote, or if +* an error occured in decoding +* +******************************************************************************/ + +function get_Minolta_Makernote( $Makernote_Tag, $EXIF_Array, $filehnd, $Make_Field ) +{ + + if ( ( stristr( $Make_Field, "Konica" ) === FALSE ) && + ( stristr( $Make_Field, "Minolta" ) === FALSE ) ) + { + // Not a Konica/Minolta Makernote - Cannot decode it + return False; + } + + // There are several different headers for a Konica/Minolta Makernote + // Unfortunately only one type can be decoded (the one without a header) + // Check which header exists (if any) + if ( substr( $Makernote_Tag['Data'], 0, 3 ) == "MLY" ) + { + // MLY Header - Can't Decode this + return $Makernote_Tag; + } + else if ( substr( $Makernote_Tag['Data'], 0, 2 ) == "KC" ) + { + // KC Header - Can't Decode this + return $Makernote_Tag; + } + if ( substr( $Makernote_Tag['Data'], 0, 8 ) == "+M+M+M+M" ) + { + // +M+M+M+M Header - Can't Decode this + return $Makernote_Tag; + } + else if ( substr( $Makernote_Tag['Data'], 0, 5 ) == "MINOL" ) + { + // MINOL Header - Can't Decode this + return $Makernote_Tag; + } + else + { + // No Header - Decode the IFD + + // Seek to the start of the IFD + fseek($filehnd, $Makernote_Tag['Tiff Offset'] + $Makernote_Tag['Offset'] ); + + // Read the IFD(s) into an array + $Makernote_Tag['Decoded Data'] = read_Multiple_IFDs( $filehnd, $Makernote_Tag['Tiff Offset'], $Makernote_Tag['ByteAlign'], "Olympus" ); + + // Save some information into the Tag element to aid interpretation + $Makernote_Tag['Decoded'] = TRUE; + $Makernote_Tag['Makernote Type'] = "Minolta"; + $Makernote_Tag['Makernote Tags'] = "Olympus"; + + + // Return the new tag + return $Makernote_Tag; + + } + + + // Shouldn't get here + return False; +} + +/****************************************************************************** +* End of Function: get_Minolta_Makernote +******************************************************************************/ + + + + + + + +/****************************************************************************** +* +* Function: get_Minolta_Text_Value +* +* Description: Provides a text value for any tag marked as special for makernotes +* that this script can decode. Returns false if this is not a makernote +* that can be processed with this script +* +* Parameters: Exif_Tag - the element of an the Makernote array containing the +* tag in question, as returned from get_Olympus_Makernote +* Tag_Definitions_Name - The name of the Tag Definitions group +* within the global array IFD_Tag_Definitions +* +* +* Returns: output - the text value for the tag +* FALSE - If this script could not decode the makernote, or if +* an error occured in decoding +* +******************************************************************************/ + +function get_Minolta_Text_Value( $Exif_Tag, $Tag_Definitions_Name ) +{ + // Check that this Tag uses Olympus type tags - otherwise it cannot be processed here + if ( $Tag_Definitions_Name !== "Olympus" ) + { + // Not Olympus Tags - cannot be processed here + return FALSE; + } + + + // Process the tag acording to it's tag number, to produce a text value + + if ( ( $Exif_Tag['Tag Number'] == 0x0001 ) || // Minolta Camera Settings + ( $Exif_Tag['Tag Number'] == 0x0003 ) ) + { + + // Create the output string + $output_str = ""; + + // Cycle through each camera setting record which are 4 byte Longs + + for ( $i = 1; $i*4 <= strlen( $Exif_Tag['Data'] ); $i++) + { + + // Exract the current 4 byte Long value (Motorola byte alignment) + $value = get_IFD_Data_Type( substr($Exif_Tag['Data'], ($i-1)*4, 4) , 4, "MM" ); + + // Corrupt settings can cause huge values, which automatically get + // put into floating point variables instead of integer variables + // Hence Check that this is an integer, as problems will occur if it isn't + if ( is_integer( $value ) ) + { + + // Check if the current setting number is in the Definitions array + if ( array_key_exists( $i, ($GLOBALS[ "Minolta_Camera_Setting_Definitions" ]) ) === TRUE ) + { + // Setting is in definitions array + + // Get some of the information from the settings definitions array + $tagname = $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ][ 'Name' ]; + $units = ""; + if ( array_key_exists( 'Units', $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ] ) ) + { + $units = $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ][ 'Units' ]; + } + // Check what type of field the setting is, and process accordingly + + if ( $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ]['Type'] == "Lookup" ) + { + // This is a lookup table field + + // Check if the value read is in the lookup table + if ( array_key_exists( $value, $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ] ) ) + { + // Value is in the lookup table - Add it to the text + $output_str .= $tagname . ": " . $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ][ $value ] . "\n"; + } + else + { + // Value is Not in the lookup table + // Add a message if the user has requested to see unknown tags + if ( $GLOBALS['HIDE_UNKNOWN_TAGS'] == FALSE ) + { + $output_str .= $tagname . ": Unknown Reserved Value $value\n"; + } + + } + } + else if ( $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ]['Type'] == "Numeric" ) + { + // This is a numeric type add it as is to the output, with units + $output_str .= $tagname . ": $value $units\n"; + } + else if ( $GLOBALS[ "Minolta_Camera_Setting_Definitions" ][ $i ]['Type'] == "Special" ) + { + // This is a special setting, Process it according to the setting number + switch ( $i ) + { + case 9: // Apex Film Speed Value + $output_str .= $tagname . ": " . ($value/8-1) . " ( ISO " . ((pow(2,($value/8-1)))*3.125) . " )\n"; + break; + + case 10: // Apex Shutter Speed Time Value + $output_str .= $tagname . ": " . ($value/8-6); + if ( $value == 8 ) + { + $output_str .= " ( 30 seconds )\n"; + } + else + { + $output_str .= " ( " . ( pow(2, (48-$value)/8 ) ) . " seconds )\n"; + } + break; + + case 11: // Apex Aperture Value + $output_str .= $tagname . ": " . ($value/8-1) . " ( F Stop: " . (pow(2,( $value/16-0.5 ))) . " )\n"; + break; + + case 14: // Exposure Compensation + $output_str .= $tagname . ": " . ($value/3-2) . " $units\n"; + break; + + case 17: // Interval Length + $output_str .= $tagname . ": " . ($value+1) . " $units\n"; + break; + + case 19: // Focal Length + $output_str .= $tagname . ": " . ($value/256) . " $units\n"; + break; + + case 22: // Date + $output_str .= $tagname . ": " . sprintf( "%d/%d/%d", ($value%256), floor(($value - floor($value/65536)*65536)/256 ), floor($value/65536) ) . " $units\n"; + break; + + case 23: // Time + $output_str .= $tagname . ": " . sprintf( "%2d:%02d:%02d", floor($value/65536), floor(($value - floor($value/65536)*65536)/256 ), ($value%256) ) . " $units\n"; + break; + + case 24: // Max Aperture at this focal length + $output_str .= $tagname . ": F" . (pow(2,($value/16-0.5))) ." $units\n"; + break; + + case 29: // White Balance Red + case 30: // White Balance Green + case 31: // White Balance Blue + $output_str .= $tagname . ": " . ($value/256) ." $units\n"; + break; + + case 32: // Saturation + case 33: // Contrast + $output_str .= $tagname . ": " . ($value-3) ." $units\n"; + break; + + case 36: // Flash Compensation + $output_str .= $tagname . ": " . (($value-6)/3) ." $units\n"; + break; + + case 42: // Color Filter + $output_str .= $tagname . ": " . ($value-3) ." $units\n"; + break; + + case 45: // Apex Brightness Value + $output_str .= $tagname . ": " . ($value/8-6) ." $units\n"; + break; + + default: // Unknown Special Setting + // If user has requested to see the unknown tags, then add the setting to the output + if ( $GLOBALS['HIDE_UNKNOWN_TAGS'] == FALSE ) + { + $output_str .= "Unknown Special Tag: $tagname, Value: $value $units\n"; + } + break; + } + } + else + { + // Unknown Setting Type + // If user has requested to see the unknown tags, then add the setting to the output + if ( $GLOBALS['HIDE_UNKNOWN_TAGS'] == FALSE ) + { + $output_str .= "Unknown Tag Type Tag $i, Value: " . $value . "\n"; + } + } + + + } + else + { + // Unknown Setting + // If user has requested to see the unknown tags, then add the setting to the output + if ( $GLOBALS['HIDE_UNKNOWN_TAGS'] == FALSE ) + { + $output_str .= "Unknown Minolta Camera Setting Tag $i, Value: " . $value . "\n"; + } + } + } + + } + + // Return the text string + return $output_str; + } + else if ( ( $Exif_Tag['Tag Number'] == 0x0088 ) || + ( $Exif_Tag['Tag Number'] == 0x0081 ) ) + { + // Konica/Minolta Thumbnail + return "Thumbnail"; + } + else + { + return FALSE; + } + +} + +/****************************************************************************** +* End of Function: get_Minolta_Text_Value +******************************************************************************/ + + + + + + + +/****************************************************************************** +* Global Variable: Minolta_Camera_Setting_Definitions +* +* Contents: This global variable provides definitions for the fields +* contained in the Konica/Minolta Camera Settings Makernote tag, +* indexed by their setting number. +* +******************************************************************************/ + +$GLOBALS[ "Minolta_Camera_Setting_Definitions" ] = array( + +2 => array ( 'Name' => "Exposure Mode", + 'Type' => "Lookup", + 0 => "P", + 1 => "A", + 2 => "S", + 3 => "M" ), + +3 => array ( 'Name' => "Flash Mode", + 'Type' => "Lookup", + 0 => "Normal", + 1 => "Red-eye reduction", + 2 => "Rear flash sync", + 3 => "Wireless" ), + +4 => array ( 'Name' => "White Balance", + 'Type' => "Lookup", + 0 => "Auto", + 1 => "Daylight", + 2 => "Cloudy", + 3 => "Tungsten", + 5 => "Custom", + 7 => "Fluorescent", + 8 => "Fluorescent 2", + 11 => "Custom 2", + 12 => "Custom 3" ), + +5 => array ( 'Name' => "Image Size", + 'Type' => "Lookup", + 0 => "2560 x 1920 (2048x1536 - DiMAGE 5 only)", + 1 => "1600 x 1200", + 2 => "1280 x 960", + 3 => "640 x 480" ), + + +6 => array ( 'Name' => "Image Quality", + 'Type' => "Lookup", + 0 => "Raw", + 1 => "Super Fine", + 2 => "Fine", + 3 => "Standard", + 4 => "Economy", + 5 => "Extra Fine" ), + +7 => array ( 'Name' => "Shooting Mode", + 'Type' => "Lookup", + 0 => "Single", + 1 => "Continuous", + 2 => "Self-timer", + 4 => "Bracketing", + 5 => "Interval", + 6 => "UHS Continuous", + 7 => "HS Continuous" ), + + +8 => array ( 'Name' => "Metering Mode", + 'Type' => "Lookup", + 0 => "Multi-Segment", + 1 => "Centre Weighted", + 2 => "Spot" ), + + +9 => array ( 'Name' => "Apex Film Speed Value", + 'Type' => "Special" ), + +// 09 FilmSpeed , APEX Film Speed Value , Speed value = x/8-1 , ISO= (2^(x/8-1))*3.125 + + +10 => array ( 'Name' => "Apex Shutter Speed Time Value", + 'Type' => "Special", + 'Units' => "Seconds?" ), + +// APEX Time Value , Time value = x/8-6 , ShutterSpeed = 2^( (48-x)/8 ), ! Due to rounding error x=8 should be displayed as 30 sec. + +11 => array ( 'Name' => "Apex Aperture Value", + 'Type' => "Special" ), + +// APEX Aperture Value ApertureValue = x/8-1 , Aperture = 2^( x/16-0.5 ) + + +12 => array ( 'Name' => "Macro Mode", + 'Type' => "Lookup", + 0 => "Off", + 1 => "On" ), + +13 => array ( 'Name' => "Digital Zoom", + 'Type' => "Lookup", + 0 => "Off", + 1 => "Electronic magnification was used", + 2 => "Digital zoom 2x" ), + + +14 => array ( 'Name' => "Exposure Compensation", + 'Type' => "Special", + 'Units' => "EV" ), + +// EV = x/3 -2 Exposure compensation in EV + + +15 => array ( 'Name' => "Bracket Step", + 'Type' => "Lookup", + 0 => "1/3 EV", + 1 => "2/3 EV", + 2 => "1 EV" ), + + +17 => array ( 'Name' => "Interval Length", + 'Type' => "Special", + 'Units' => "Min" ), + +// interval is x+1 min (used with interval mode) + + +18 => array ( 'Name' => "Interval Number", + 'Type' => "Numeric", + 'Units' => "frames" ), + +19 => array ( 'Name' => "Focal Length", + 'Type' => "Special", + 'Units' => "mm" ), + +// x / 256 is real focal length in mm , x / 256 * 3.9333 is 35-mm equivalent + + +20 => array ( 'Name' => "Focus Distance", + 'Type' => "Numeric", + 'Units' => "mm ( 0 = Infinity)" ), + + +21 => array ( 'Name' => "Flash Fired", + 'Type' => "Lookup", + 0 => "No", + 1 => "Yes" ), + +22 => array ( 'Name' => "Date", + 'Type' => "Special" ), + +// yyyymmdd , year = x/65536 , month = x/256-x/65536*256 , day = x%256 + +23 => array ( 'Name' => "Time", + 'Type' => "Special" ), + +// hhhhmmss , hour = x/65536 , minute = x/256-x/65536*256 , second = x%256 + + +24 => array ( 'Name' => "Max Aperture at this focal length", + 'Type' => "Special" ), + +// Fno = 2^(x/16-0.5) + + +27 => array ( 'Name' => "File Number Memory", + 'Type' => "Lookup", + 0 => "Off", + 1 => "On" ), + +28 => array ( 'Name' => "Last File Number", + 'Type' => "Numeric", + 'Units' => " ( 0 = File Number Memory is Off)" ), + + +29 => array ( 'Name' => "White Balance Red", + 'Type' => "Special" ), + +// x/256 - red white balance coefficient used for this picture + + +30 => array ( 'Name' => "White Balance Green", + 'Type' => "Special" ), + +// x/256 - green white balance coefficient used for this picture + +31 => array ( 'Name' => "White Balance Blue", + 'Type' => "Special" ), + +// x/256 - blue white balance coefficient used for this picture + + +32 => array ( 'Name' => "Saturation", + 'Type' => "Special" ), + +// x-3 = saturation + + +33 => array ( 'Name' => "Contrast", + 'Type' => "Special" ), + +// x-3 - contrast + + +34 => array ( 'Name' => "Sharpness", + 'Type' => "Lookup", + 0 => "Hard", + 1 => "Normal", + 2 => "Soft" ), + + +35 => array ( 'Name' => "Subject Program", + 'Type' => "Lookup", + 0 => "none", + 1 => "portrait", + 2 => "text", + 3 => "night portrait", + 4 => "sunset", + 5 => "sports action" ), + + +36 => array ( 'Name' => "Flash Compensation", + 'Type' => "Special", + 'Units' => "EV" ), + +// (x-6)/3 = flash compensation in EV + + +37 => array ( 'Name' => "ISO Setting", + 'Type' => "Lookup", + 0 => "100", + 1 => "200", + 2 => "400", + 3 => "800", + 4 => "auto", + 5 => "64" ), + + +38 => array ( 'Name' => "Camera Model", + 'Type' => "Lookup", + 0 => "DiMAGE 7", + 1 => "DiMAGE 5", + 2 => "DiMAGE S304", + 3 => "DiMAGE S404", + 4 => "DiMAGE 7i", + 5 => "DiMAGE 7Hi", + 6 => "DiMAGE A1", + 7 => "DiMAGE S414" ), + + +39 => array ( 'Name' => "Interval Mode", + 'Type' => "Lookup", + 0 => "Still Image", + 1 => "Time-lapse Movie" ), + + +40 => array ( 'Name' => "Folder Name", + 'Type' => "Lookup", + 0 => "Standard Form", + 1 => "Data Form" ), + + +41 => array ( 'Name' => "Color Mode", + 'Type' => "Lookup", + 0 => "Natural Color", + 1 => "Black & White", + 2 => "Vivid Color", + 3 => "Solarization", + 4 => "Adobe RGB" ), + + +42 => array ( 'Name' => "Color Filter", + 'Type' => "Special" ), + +// x-3 = color filter + + +43 => array ( 'Name' => "Black & White Filter", + 'Type' => "Numeric" ), + + + +44 => array ( 'Name' => "Internal Flash", + 'Type' => "Lookup", + 0 => "Not Fired", + 1 => "Fired" ), + + + +45 => array ( 'Name' => "Apex Brightness Value", + 'Type' => "Special" ), + +// Brightness Value = x/8-6 + + + + +46 => array ( 'Name' => "Spot Focus Point X Coordinate", + 'Type' => "Numeric" ), + + + +47 => array ( 'Name' => "Spot Focus Point Y Coordinate", + 'Type' => "Numeric" ), + + + +48 => array ( 'Name' => "Wide Focus Zone", + 'Type' => "Lookup", + 0 => "No Zone or AF Failed", + 1 => "Center Zone (Horizontal Orientation)", + 2 => "Center Zone (Vertical Orientation)", + 3 => "Left Zone", + 4 => "Right Zone" ), + + +49 => array ( 'Name' => "Focus Mode", + 'Type' => "Lookup", + 0 => "Auto Focus", + 1 => "Manual Focus" ), + + +50 => array ( 'Name' => "Focus Area", + 'Type' => "Lookup", + 0 => "Wide Focus (normal)", + 1 => "Spot Focus" ), + + +51 => array ( 'Name' => "DEC Switch Position", + 'Type' => "Lookup", + 0 => "Exposure", + 1 => "Contrast", + 2 => "Saturation", + 3 => "Filter" ), + + + +); + +/****************************************************************************** +* End of Global Variable: Minolta_Camera_Setting_Definitions +******************************************************************************/ + + + + +?> |
