I always want somebody make 4images to have exif support, at last, I write this MOD for show the EXIF info of the JPG file in the detail page. Originally, I wrote one was using the PHP built in function to read the data, however, I found the function in php 4.1 is not read all tag of exif and I did not want to make a php 4.2 installation. Finally, I find a php exif library call Exifer is for ver 0.1 & 0.2.
Now, for version 0.3, it use the php built in exif function, so you must have the php 4.2 or above and enable the exif option. I have add a function for choosing which exif field to display( actually, i only parse 2 sections(IFD0, EXIF) in exif header, other section seem unless for information) It work OK on my Canon D60 image file, but I did not have parse the MakerNote filed.
1. Create a file exif.php at "includes/exif.php" and the content is:
the first line of code (EXIF_CONTROL) is to control display all field or chosen field.
the second line of code (EXIF_FILTER) is to control which filed to display.
<?php
/*
4images EXIF MOD
Version : 0.3
Date: 2003-01-17
By: fatman (fatman_li@yahoo.com.hk)
*/
// true: enable the field filter
// false: disable the field filter
define('EXIF_CONTROL', true);
// add the field name for show in exif section
// remember the field name with the colon ":"
define('EXIF_FILTER', "
Model:
Orientation:
ExposureTime:
FNumber:
ISOSpeedRatings:
ExposureBiasValue:
MeteringMode:
Flash:
FocalLength:
ColorSpace:
");
function exif_filter_control() {
return EXIF_CONTROL;
}
function exif_filter($name) {
if (strpos(EXIF_FILTER, ($name . ":")) > 0) {
return true;
} else {
return false;
}
}
function exif_get_str_val($val) {
$val = (substr($val, 0, strpos($val, "/"))) / (substr($val, strpos($val, "/") + 1));
return $val;
}
function exif_parse_value($name, $val) {
switch($name) {
case "Orientation":
if($val==1) $val = "Normal";
if($val==2) $val = "Mirrored";
if($val==3) $val = "Upsidedown";
if($val==4) $val = "Upsidedown Mirrored";
if($val==5) $val = "90deg CW Mirrored";
if($val==6) $val = "90deg CCW";
if($val==7) $val = "90deg CCW Mirrored";
if($val==8) $val = "90deg CW";
break;
case "ResolutionUnit":
if($val==1) $val = "No Unit";
if($val==2) $val = "Inch";
if($val==3) $val = "Centimeter";
break;
case "YCbCrPositioning":
if($val==1) $val = "Pixel Array";
if($val==2) $val = "Datum Point";
break;
case "ExposureTime":
$val = $val . " seconds";
break;
case "FNumber":
$val = "F/" . exif_get_str_val($val);
break;
case "ExposureProgram":
if($val==1) $val = "Manual control";
if($val==2) $val = "Program normal";
if($val==3) $val = "Aperture priority";
if($val==4) $val = "Shutter priority";
if($val==5) $val = "Program creative(slow program)";
if($val==6) $val = "Program action(high-speed program)";
if($val==7) $val = "Portrait mode";
if($val==8) $val = "Landscape mode";
break;
case "ExifVersion":
$val = round($val / 100, 2);
break;
case "ComponentsConfiguration":
$val = bin2hex($val);
$val = str_replace("01","Y",$val);
$val = str_replace("02","Cb",$val);
$val = str_replace("03","Cr",$val);
$val = str_replace("04","R",$val);
$val = str_replace("05","G",$val);
$val = str_replace("06","B",$val);
$val = str_replace("00","",$val);
break;
case "CompressedBitsPerPixel":
$val = exif_get_str_val($val);
break;
case "ShutterSpeedValue":
$val = "1/" . round(pow(2, exif_get_str_val($val))) . " seconds";
break;
case "ApertureValue":
$val = "F/" . round(pow(sqrt(2), exif_get_str_val($val)),1);
break;
case "BrightnessValue ":
$val = exif_get_str_val($val);
break;
case "ExposureBiasValue":
if ((substr($val, 0, strpos($val, "/"))) == "0") {
$val = "0 Step";
} else {
$val = $val . " Step";
}
break;
case "MaxApertureValue":
$val = "F/" . round(pow(sqrt(2), exif_get_str_val($val)),1);
break;
case "SubjectDistance":
$val = exif_get_str_val($val) . " M";
break;
case "MeteringMode":
if($val==0) $val = "Unknown";
if($val==1) $val = "Average";
if($val==2) $val = "Center Weighted Average";
if($val==3) $val = "Spot";
if($val==4) $val = "Multi-spot";
if($val==5) $val = "Multi-segment";
if($val==6) $val = "Partial";
if($val==255) $val = "Other";
break;
case "LightSource":
if($val==0) $val = "Unknown";
if($val==1) $val = "Daylight";
if($val==2) $val = "Fluorescent";
if($val==3) $val = "Tungsten";
if($val==10) $val = "Flash";
if($val==17) $val = "Standard light A";
if($val==18) $val = "Standard light B";
if($val==19) $val = "Standard light C";
if($val==20) $val = "D55";
if($val==21) $val = "D65";
if($val==22) $val = "D75";
if($val==255) $val = "Other";
break;
case "Flash":
if($val==0) $val = "No Flash";
if($val==1) $val = "Flash fired";
if($val==5) $val = "Flash fired but strobe return light not detected";
if($val==7) $val = "Flash fired and strobe return light detected";
if($val==9) $val = "Undefined";
break;
case "FocalLength":
$val = exif_get_str_val($val) . " mm";
break;
case "FlashPixVersion":
$val = round($val / 100, 2);
break;
case "ColorSpace":
if($val==1) $val = "sRGB";
if($val=='65535') $val = "Uncalibrated";
break;
case "FocalPlaneXResolution":
$val = round(exif_get_str_val($val));
break;
case "FocalPlaneYResolution":
$val = round(exif_get_str_val($val));
break;
case "FocalPlaneResolutionUnit":
if($val==1) $val = "No Unit";
if($val==2) $val = "Inch";
if($val==3) $val = "Centimeter";
break;
case "SensingMethod":
if($val==2) $val = "1 chip color area sensor";
break;
case "FileSource":
$val = bin2hex($val);
if($val==0x03) $val = "Digital still camera";
break;
case "FileSource":
$val = bin2hex($val);
if($val==0x01) $val = "Directly photographed";
break;
}
return $val;
}
?>
2. Open "includes/functions.php" and add after:
if (!defined('ROOT_PATH')) {
die("Security violation");
}
this code:
include(ROOT_PATH.'includes/exif.php');
3. Open "includes/functions.php" and add after:
if ($detailed_view && isset($info['APP13'])) {
$iptc_array = get_iptc_info($info['APP13']);
$bgcounter = 0;
foreach ($iptc_array as $key => $val) {
$row_bg_number = ($bgcounter++ % 2 == 0) ? 1 : 2;
$site_template->register_vars(array(
"iptc_value" => $val,
"iptc_name" => $lang['iptc_'.$key],
"row_bg_number" => $row_bg_number
));
$iptc_info .= $site_template->parse_template("iptc_bit");
}
}
this code:
$exif_info = "";
if ($image_info[2] == 2 && $detailed_view && !is_remote($media_file_name)) {
$exif = exif_read_data ($media_src,'IFD0');
$bgcounter = 0;
if ($exif) {
$exif = exif_read_data ($media_src,0,true);
foreach($exif as $key=>$section) {
if (($key == "IFD0") || ($key == "EXIF")) {
foreach($section as $name=>$val) {
if (!(exif_filter($name)) && exif_filter_control()) continue;
$row_bg_number = ($bgcounter++ % 2 == 0) ? 1 : 2;
$site_template->register_vars(array(
"exif_value" => exif_parse_value($name, $val),
"exif_name" => $name . ":",
"row_bg_number" => $row_bg_number
));
$exif_info .= $site_template->parse_template("exif_bit");
}
}
}
}
}
4. Open "includes/functions.php" and find:
$site_template->register_vars(array(
"media_src" => $media_src,
"media_icon" => $media_icon,
"image_name" => $image_name,
"width_height" => $width_height,
"width" => $width,
"height" => $height,
"iptc_info" => $iptc_info
));
replace with:
$site_template->register_vars(array(
"media_src" => $media_src,
"media_icon" => $media_icon,
"image_name" => $image_name,
"width_height" => $width_height,
"width" => $width,
"height" => $height,
"iptc_info" => $iptc_info,
"exif_info" => $exif_info
));
5. Open template detail.html and add after:
{if iptc_info}
<br />
<table width="100%" border="0" cellspacing="0" cellpadding="1">
<tr>
<td class="bordercolor">
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td class="head1" valign="top" colspan="2">IPTC Info</td>
</tr>
{iptc_info}
</table>
</td>
</tr>
</table>
{endif iptc_info}
this code
{if exif_info}
<br />
<table width="100%" border="0" cellspacing="0" cellpadding="1">
<tr>
<td class="bordercolor">
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td class="head1" valign="top" colspan="2">EXIF Info</td>
</tr>
{exif_info}
</table>
</td>
</tr>
</table>
{endif exif_info}
6. Create a new template exif_bit.html
<tr>
<td valign="top" class="row{row_bg_number}"><b>{exif_name}</b></td>
<td valign="top" class="row{row_bg_number}">{exif_value}</td>
</tr>