summaryrefslogtreecommitdiff
path: root/modules/exif/lib/makers/nikon.php
diff options
context:
space:
mode:
authorTim Almdal <tnalmdal@shaw.ca>2009-02-07 21:44:19 +0000
committerTim Almdal <tnalmdal@shaw.ca>2009-02-07 21:44:19 +0000
commit37d90e663ca75fdf441d449799fc94a5e467b4a7 (patch)
treea04d21d7d721beabba867422bcf87873e926881a /modules/exif/lib/makers/nikon.php
parent1d9a3f70b12a10fbd123fb444e7a67b99a882f41 (diff)
Adding exifer library
Diffstat (limited to 'modules/exif/lib/makers/nikon.php')
-rw-r--r--modules/exif/lib/makers/nikon.php330
1 files changed, 330 insertions, 0 deletions
diff --git a/modules/exif/lib/makers/nikon.php b/modules/exif/lib/makers/nikon.php
new file mode 100644
index 00000000..813cbc69
--- /dev/null
+++ b/modules/exif/lib/makers/nikon.php
@@ -0,0 +1,330 @@
+<?php //================================================================================================
+//================================================================================================
+//================================================================================================
+/*
+ Exifer
+ Extracts EXIF information from digital photos.
+
+ Copyright � 2003 Jake Olefsky
+ http://www.offsky.com/software/exif/index.php
+ jake@olefsky.com
+
+ Please see exif.php for the complete information about this software.
+
+ ------------
+
+ This program is free software; you can redistribute it and/or modify it under the terms of
+ the GNU General Public License as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details. http://www.gnu.org/copyleft/gpl.html
+*/
+//================================================================================================
+//================================================================================================
+//================================================================================================
+
+
+
+//=================
+// Looks up the name of the tag for the MakerNote (Depends on Manufacturer)
+//====================================================================
+function lookup_Nikon_tag($tag,$model) {
+
+ if($model==0) {
+ switch($tag) {
+ case "0003": $tag = "Quality";break;
+ case "0004": $tag = "ColorMode";break;
+ case "0005": $tag = "ImageAdjustment";break;
+ case "0006": $tag = "CCDSensitivity";break;
+ case "0007": $tag = "WhiteBalance";break;
+ case "0008": $tag = "Focus";break;
+ case "0009": $tag = "Unknown2";break;
+ case "000a": $tag = "DigitalZoom";break;
+ case "000b": $tag = gettext("Converter");break;
+
+ default: $tag = "unknown:".$tag;break;
+ }
+ } else if($model==1) {
+ switch($tag) {
+ case "0002": $tag = "ISOSetting";break;
+ case "0003": $tag = "ColorMode";break;
+ case "0004": $tag = "Quality";break;
+ case "0005": $tag = "Whitebalance";break;
+ case "0006": $tag = "ImageSharpening";break;
+ case "0007": $tag = "FocusMode";break;
+ case "0008": $tag = "FlashSetting";break;
+ case "0009": $tag = "FlashMode";break;
+ case "000b": $tag = "WhiteBalanceFine";break;
+ case "000f": $tag = "ISOSelection";break;
+ case "0013": $tag = "ISOSelection2";break;
+ case "0080": $tag = "ImageAdjustment";break;
+ case "0081": $tag = "ToneCompensation";break;
+ case "0082": $tag = "Adapter";break;
+ case "0083": $tag = "LensType";break;
+ case "0084": $tag = "LensInfo";break;
+ case "0085": $tag = "ManualFocusDistance";break;
+ case "0086": $tag = "DigitalZoom";break;
+ case "0087": $tag = "FlashUsed";break;
+ case "0088": $tag = "AFFocusPosition";break;
+ case "008d": $tag = "ColorMode";break;
+ case "0090": $tag = "LightType";break;
+ case "0094": $tag = "Saturation";break;
+ case "0095": $tag = "NoiseReduction";break;
+ case "0010": $tag = "DataDump";break;
+
+ default: $tag = "unknown:".$tag;break;
+ }
+ }
+
+ 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");
+ $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;
+ }
+ }
+
+ return $data;
+}
+
+
+//=================
+// Nikon Special data section
+//====================================================================
+function parseNikon($block,&$result) {
+
+ if($result['Endien']=="Intel") $intel=1;
+ else $intel=0;
+
+ $model = $result['IFD0']['Model'];
+
+ //these 6 models start with "Nikon". Other models dont.
+ if($model=="E700\0" || $model=="E800\0" || $model=="E900\0" || $model=="E900S\0" || $model=="E910\0" || $model=="E950\0") {
+ $place=8; //current place
+ $model = 0;
+
+ //Get number of tags (2 bytes)
+ $num = bin2hex(substr($block,$place,2));$place+=2;
+ if($intel==1) $num = intel2Moto($num);
+ $result['SubIFD']['MakerNote']['MakerNoteNumTags'] = hexdec($num);
+
+ //loop thru all tags Each field is 12 bytes
+ for($i=0;$i<hexdec($num);$i++) {
+ //2 byte tag
+ $tag = bin2hex(substr($block,$place,2));$place+=2;
+ if($intel==1) $tag = intel2Moto($tag);
+ $tag_name = lookup_Nikon_tag($tag, $model);
+
+ //2 byte type
+ $type = bin2hex(substr($block,$place,2));$place+=2;
+ if($intel==1) $type = intel2Moto($type);
+ 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);
+
+ //4 byte value of data or pointer to data
+ $value = substr($block,$place,4);$place+=4;
+
+ //if tag is 0002 then its the ASCII value which we know is at 140 so calc offset
+ //THIS HACK ONLY WORKS WITH EARLY NIKON MODELS
+ if($tag=="0002") $offset = hexdec($value)-140;
+ if($bytesofdata<=4) {
+ $data = $value;
+ } else {
+ $value = bin2hex($value);
+ if($intel==1) $value = intel2Moto($value);
+ $data = substr($block,hexdec($value)-$offset,$bytesofdata*2);
+ }
+ $formated_data = formatNikonData($type,$tag,$intel,$model,$data);
+
+ if($result['VerboseOutput']==1) {
+ $result['SubIFD']['MakerNote'][$tag_name] = $formated_data;
+ $result['SubIFD']['MakerNote'][$tag_name."_Verbose"]['RawData'] = $data;
+ $result['SubIFD']['MakerNote'][$tag_name."_Verbose"]['Type'] = $type;
+ $result['SubIFD']['MakerNote'][$tag_name."_Verbose"]['Bytes'] = $bytesofdata;
+ } else {
+ $result['SubIFD']['MakerNote'][$tag_name] = $formated_data;
+ }
+ }
+
+ } else {
+ $place=0;//current place
+ $model = 1;
+
+ $nikon = substr($block,$place,8);$place+=8;
+ $endien = substr($block,$place,4);$place+=4;
+
+ //2 bytes of 0x002a
+ $tag = bin2hex(substr($block,$place,2));$place+=2;
+
+ //Then 4 bytes of offset to IFD0 (usually 8 which includes all 8 bytes of TIFF header)
+ $offset = bin2hex(substr($block,$place,4));$place+=4;
+ if($intel==1) $offset = intel2Moto($offset);
+ if(hexdec($offset)>8) $place+=$offset-8;
+
+ //Get number of tags (2 bytes)
+ $num = bin2hex(substr($block,$place,2));$place+=2;
+ if($intel==1) $num = intel2Moto($num);
+
+ //loop thru all tags Each field is 12 bytes
+ for($i=0;$i<hexdec($num);$i++) {
+ //2 byte tag
+ $tag = bin2hex(substr($block,$place,2));$place+=2;
+ if($intel==1) $tag = intel2Moto($tag);
+ $tag_name = lookup_Nikon_tag($tag, $model);
+
+ //2 byte type
+ $type = bin2hex(substr($block,$place,2));$place+=2;
+ if($intel==1) $type = intel2Moto($type);
+ 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);
+
+ //4 byte value of data or pointer to data
+ $value = substr($block,$place,4);$place+=4;
+
+ if($bytesofdata<=4) {
+ $data = $value;
+ } else {
+ $value = bin2hex($value);
+ if($intel==1) $value = intel2Moto($value);
+ $data = substr($block,hexdec($value)+hexdec($offset)+2,$bytesofdata);
+ }
+ $formated_data = formatNikonData($type,$tag,$intel,$model,$data);
+
+ if($result['VerboseOutput']==1) {
+ $result['SubIFD']['MakerNote'][$tag_name] = $formated_data;
+ if($type=="URATIONAL" || $type=="SRATIONAL" || $type=="USHORT" || $type=="SSHORT" || $type=="ULONG" || $type=="SLONG" || $type=="FLOAT" || $type=="DOUBLE") {
+ $data = bin2hex($data);
+ if($intel==1) $data = intel2Moto($data);
+ }
+ $result['SubIFD']['MakerNote'][$tag_name."_Verbose"]['RawData'] = $data;
+ $result['SubIFD']['MakerNote'][$tag_name."_Verbose"]['Type'] = $type;
+ $result['SubIFD']['MakerNote'][$tag_name."_Verbose"]['Bytes'] = $bytesofdata;
+ } else {
+ $result['SubIFD']['MakerNote'][$tag_name] = $formated_data;
+ }
+ }
+
+ }
+}
+
+
+?> \ No newline at end of file