1<?php 2 3/* Test script for PHP module ext/exif 4 * 5 * (c) Marcus Boerger, 2002 6 * 7 * $Id$ 8 * 9 * Rename the file to test.php and read the instructions. If the 10 * script cannot be executed or does not generate any output check 11 * you error log. In most cases this would mean you found an error 12 * if the rest of your php environment works fine. 13 * 14 * The original version of module exif has many errors and mostly 15 * fails on executing this script. 16 */ 17 18$file = array_key_exists('thumbnail',$_REQUEST) ? $_REQUEST['thumbnail'] : ''; 19//$file = '/t/temp/kodak-dc4800.tif'; 20//$file = '/t/temp/canon-ixus.jpg'; 21//$file = '/t/temp/test2.jpg'; 22if ( $file) { 23 $image = exif_thumbnail($file); 24 if ( $image!==false) { 25 @Header("content-type: image/jpeg"); 26 echo $image; 27 } else { 28 echo "<html><body><table>\n"; 29 echo "Thumbnail could not be extracted.\n"; 30 echo "</table></body></html>"; 31 } 32 die(); 33} 34 35if ( !defined('IMAGETYPE_GIF')) define('IMAGETYPE_GIF',1); 36if ( !defined('IMAGETYPE_JPEG')) define('IMAGETYPE_JPEG',2); 37if ( !defined('IMAGETYPE_TIFF_II')) define('IMAGETYPE_TIFF_II',7); 38if ( !defined('IMAGETYPE_TIFF_MM')) define('IMAGETYPE_TIFF_MM',8); 39 40$possible = array(); 41 42/****************************************************************************/ 43// message function is used for debugging purpose: just to se what happens 44function message($msg) { 45 error_log($msg,0); 46 echo "$msg\n"; 47} 48 49function error_msg() { 50 $ret = '<b style="color:green">O.K.</b>'; 51 if (array_key_exists('php_errormsg',$GLOBALS) && strlen($GLOBALS['php_errormsg'])) { 52 $ret = '<b style="color:red">'.$GLOBALS['php_errormsg'].'</b>'; 53 $GLOBALS['php_errormsg'] = ''; 54 } 55 return $ret; 56} 57 58/****************************************************************************/ 59// private to function search_file() 60function _search_file($root,&$possible,$path='') { 61 $sub = array(); 62 $cnt = 0; 63 $type= false; 64 65 //error_log("search_file($root,$path)",0); 66 if ($dir = @opendir($root.$path.'/')) { 67 while (($found = @readdir($dir)) !== false) { 68 $type = @filetype($root.$path.'/'.$found); 69 //error_log("search_file($root$path):$type=$found",0); 70 switch( $type) { 71 case 'file': 72 $pos = strrpos($found,'.'); 73 if ( function_exists('exif_imagetype')) { 74 $type = exif_imagetype($root.$path.'/'.$found); 75 } else { 76 if ( $pos!==false) { 77 $type = GetImageSize($root.$path.'/'.$found); 78 if ( is_array($type)) { 79 $type = $type[2]; 80 } else { 81 $type = false; 82 } 83 } else $type = false; 84 } 85 if ( $type!==false) 86 { 87 $possible[] = array('file'=>$root.$path.'/'.$found, 'type'=>$type); 88 //error_log("search_file($root$path) add:$path/$found",0); 89 if ( ($cnt=count($possible)) % 100 == 0) { 90 error_log("exif test page - counting files: $cnt",0); 91 } 92 } 93 break; 94 case 'dir': 95 if ( $found!='.' && $found!='..') { 96 $sub[count($sub)] = $found; 97 } 98 break; 99 } 100 } 101 @closedir($dir); 102 foreach( $sub as $idx => $found) { 103 _search_file($root,$possible,$path.'/'.$found); 104 } 105 } 106} 107 108/****************************************************************************/ 109// function: search_file($file,$ext) 110// 111// Searches for $file in document tree. The path is ignored. 112// 113function search_file() { 114 global $argc, $argv; 115 $possible = array(); 116 117 if ( $argc > 1) { 118 $path = $argv[1]; 119 } else if ( array_key_exists('SCRIPT_FILENAME',$_SERVER)) { 120 $path = $_SERVER['SCRIPT_FILENAME']; 121 //error_log("SCRIPT_FILENAME($path)",0); 122 } else { 123 $path = $argv[0]; 124 //error_log("argv($path)",0); 125 } 126 if ( ($p=strpos($path,'?')) !== false) $path = substr($path,0,$p); 127 if ( ($p=strrpos($path,'/')) /*< strlen($path)-1*/) $path = substr($path,0,$p); 128 error_log("exif test page - counting files in $path"); 129 _search_file($path,$possible); 130 error_log("exif test page - counting files: ".count($possible)." done.",0); 131 return $possible; 132} 133 134/****************************************************************************/ 135// function: search_file($file,$ext) 136// 137// Searches for $file in document tree. The path is ignored. 138// 139function AddInfo($Name,$Value,$highlight=0) { 140 if (is_array($Value)) $Value = 'Array: ('.join(',',$Value).')'; 141 $Value = nl2br($Value); 142 if ( $highlight) { 143 $Name = "<th>$Name</th>"; 144 } else { 145 $Name = "<td>$Name</td>"; 146 } 147 return "<tr>$Name<td>$Value </td></tr>\n"; 148} 149 150$possible = search_file(); 151 152$title = "PHP module exif test page"; 153 154?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional"> 155<html> 156<head> 157<title><?=$title ?></title> 158<style type="text/css"> 159body { 160 font-size: 12pt; 161} 162h1 { 163 font-size: 20pt; 164 font-weight:bold; 165} 166h2 { 167 font-size: 16pt; 168 font-weight:bold; 169} 170th { 171 text-align: left; 172} 173ul { 174 margin-bottom: 6pt; 175} 176</style> 177</head> 178<body> 179<h1><?=$title ?></h1> 180<h2>(c) Marcus Börger, 2002</h2> 181</p> 182<p> 183Images taken from <a href="http://www.exif.org">www.exif.org</a>, 184<a href="http://marcus-boerger.de">marcus-boerger.de</a> 185all rights reserved by their authors and artists, see exif headers. 186The files can be downloaded <a href="http://marcus-boerger.de/php/ext/exif/test/">here</a>. 187To start the test you simple have to put all images into the same directory as this script. 188The test will work with all files in that directory and all subdirectories. To test private 189images just put them into that directory. 190</p> 191<p> 192Youmay take a look at the test <a href="http://marcus-boerger.de/php/ext/exif/test.txt">source here</a>. 193</p> 194<p> 195This test just prooves that some exif headers can be scanned. 196If all files produce a header in output the module might be o.k. 197</p> 198<p> 199What to look for in detail: 200</p> 201<ul> 202<li>kodak-dc4800-plus-acdsee.jpg 203 <ul> 204 <li>should provide a <b>long</b> comment 'by marcus börger<%04i>'*n</li> 205 <li>this file returns an array but it also produces an errormessage because ACDSee destroys 206 the integrity of IFD directory (size of directory and offsets of entries following any 207 edited entry maybe wrong). 208 </li> 209 </ul> 210</li> 211<li>hp-photosmart.jpg 212 <ul> 213 <li>should provide a <b>two line</b> copyright notice</li> 214 </ul> 215</li> 216<li>olympus-d320l 217 <ul> 218 <li>should provide an <b>APP12</b> infoset</li> 219 </ul> 220</li> 221<li>unknown.jpg 222 <ul> 223 <li>should provide an <b>empty</b> comment, this is a comment section and not an IFD0, EXIF or GPS section</li> 224 </ul> 225</li> 226<li>some images 227 <ul> 228 <li>have empty fields, that is the tag is present but no data is stored</li> 229 </ul> 230</li> 231</ul> 232<h2>function exif_tagname</h2> 233<table border='1' cellspacing='0' cellpadding='3' summary="EXIF headernames"> 234<?php 235if (function_exists('exif_tagname')) { 236?> 237<tr><td>ImageWidth</td><td><?=@exif_tagname(0x0100)?></td><td><?=error_msg()?></td></tr> 238<tr><td>JPEGProc</td><td><?=@exif_tagname(0x0200)?></td><td><?=error_msg()?></td></tr> 239<tr><td>SceneType</td><td><?=@exif_tagname(0xA301)?></td><td><?=error_msg()?></td></tr> 240<tr><td>false</td><td><?=@exif_tagname(0x0000)===false?'false':'value'?></td><td><?=error_msg()?></td></tr> 241<?php 242} else { 243 echo "<tr><td>function exif_tagname is not supported</td></tr>\n"; 244} 245?> 246</table> 247<br clear="all"> 248<h2>function exif_read_data for <?=count($possible)?> images</h2> 249 250<?php 251$check_getimagesize = false; 252$check_exif_thumbnail = true; 253$check_exif_read_data = false; 254$fast_output = false; 255if (function_exists('exif_read_data')) { 256 $num = 0; 257 echo "<table border='1' cellspacing='0' cellpadding='3' summary='function results'>\n"; 258 $tab2 = "";//"<table border='1' cellspacing='0' cellpadding='3' summary='EXIF information'>\n"; 259 $types = array('','GIF','JPEG','PNG','SWF','PSD','BMP','TIFF_II','TIFF_MM','JPC','JP2','JPX','JB2'); 260 foreach($possible as $idx => $file) { 261 $type = $file['type']; 262 $file = $file['file']; 263 if ( !((++$num)%100)) error_log("exif test page - checking files: $num",0); 264 $error = ''; 265 $len = 2; 266 $rows = 1 267 + ($check_getimagesize ? 1 : 0) 268 + ($check_exif_thumbnail ? 1 : 0) 269 + ($check_exif_read_data ? 1 : 0); 270 if ( !$fast_output) echo "<tr><td rowspan='$rows' valign='top'>$num</td><th colspan='2'>$file</th></tr>\n"; 271 if ($check_getimagesize) { 272 $len++; 273 $size = GetImageSize($file); 274 $error = error_msg();// clear message 275 if ( $size === false) { 276 $error = '<b style="color:red">GetImageSize returned false</b><br>'.$error; 277 $res_getimagesize = $error; 278 } else { 279 $res_getimagesize = '('.join($size,',').')'; 280 } 281 if ( !$fast_output) echo AddInfo("GetImageSize",$error,1); 282 } 283 if ( $check_exif_thumbnail) { 284 $len++; 285 if ($type!=IMAGETYPE_JPEG) {// && $type!=IMAGETYPE_TIFF_II && $type!=IMAGETYPE_TIFF_MM) { 286 $error = "<b style='color: green'>filetype not supported: $types[$type]</b>"; 287 $res_exif_thumbnail = $error; 288 } else { 289 $t_width = 0; 290 $t_height = 0; 291 $result = exif_thumbnail($file, $t_width, $t_height); 292 $error = error_msg();// clear message 293 if ( $result === false) { 294 $error = '<b style="color:red">exif_thumbnail returned false</b><br>'.$error; 295 if ( $t_width && $t_height) { 296 $error = "<b style='color:green'>$t_width x $t_height</b><br>$error"; 297 } 298 $res_exif_thumbnail = $error; 299 } else { 300 $res_exif_thumbnail = $t_width . " x " . $t_height; 301 } 302 } 303 if ( !$fast_output) echo AddInfo("exif_thumbnail",$error,1); 304 } 305 if ($check_exif_read_data) { 306 $len++; 307 if ($type!=IMAGETYPE_JPEG && $type!=IMAGETYPE_TIFF_II && $type!=IMAGETYPE_TIFF_MM) { 308 $res_exif_read_data = "<b style='color: green'>filetype not supported: $types[$type]</b>"; 309 if ( !$fast_output) echo AddInfo("exif_read_data",$res_exif_read_data); 310 $res = ''; 311 } else { 312 $image = exif_read_data($file,'COMMENT,IFD0,EXIF,APP12',true); 313 $error = error_msg();// clear message 314 if ( !$fast_output) echo AddInfo("exif_read_data",$error,1); 315 $res = ''; 316 if ( $image === false) { 317 $res_exif_read_data = "<b style='color:red'>exif_read_data returned false</b><br>$error"; 318 } else { 319 $res_exif_read_data = $error; 320 // ah no!$error = error_msg(); // force o.k. 321 foreach($image as $Name => $Value) { 322 if ( $Name!='Thumbnail') { 323 if ( is_array($Value)) { 324 $len++; 325 $res .= AddInfo($Name,'Array('.count($Value).')'); 326 foreach( $Value as $idx => $Entry) { 327 if ($idx==='Thumbnail') $Entry = '<data>'; 328 $len++; 329 $res .= AddInfo($Name.':'.$idx,$Entry); 330 } 331 } else { 332 $len++; 333 $res .= AddInfo($Name,$Value); 334 } 335 } 336 } 337 } 338 } 339 } 340 $tab2 .= "<tr><td rowspan='$len' valign='top'>$num</td></tr>\n"; 341 $tab2 .= "<tr><th colspan='2'>$file</th></tr>\n"; 342 if ($check_getimagesize) { 343 $tab2 .= "<tr><th>GetImageSize</th><td>$res_getimagesize</td></tr>\n"; 344 } 345 if ($check_exif_thumbnail) { 346 $tab2 .= "<tr><th>exif_thumbnail</th><td>$res_exif_thumbnail</td></tr>\n"; 347 } 348 if ($check_exif_read_data) { 349 $tab2 .= "<tr><th>exif_read_data</th><td>$res_exif_read_data</td></tr>\n"; 350 $tab2 .= $res; 351 } 352 if ( $fast_output) { 353 echo $tab2; 354 $tab2 = ''; 355 } 356 } 357 error_log("exif test page - checking files: ".count($possible)." done.",0); 358 echo $tab2; 359 echo "</table>\n"; 360} else { 361 echo "<h1 style='color:red'>function exif_read_data is not supported</h1>\n"; 362} 363?> 364</body> 365</html>