Return to test.txt CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / exif |
1.1 misho 1: <?php
2:
3: /* Test script for PHP module ext/exif
4: *
5: * (c) Marcus Boerger, 2002
6: *
1.1.1.2 ! misho 7: * $Id$
1.1 misho 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';
22: if ( $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:
35: if ( !defined('IMAGETYPE_GIF')) define('IMAGETYPE_GIF',1);
36: if ( !defined('IMAGETYPE_JPEG')) define('IMAGETYPE_JPEG',2);
37: if ( !defined('IMAGETYPE_TIFF_II')) define('IMAGETYPE_TIFF_II',7);
38: if ( !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
44: function message($msg) {
45: error_log($msg,0);
46: echo "$msg\n";
47: }
48:
49: function 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()
60: function _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: //
113: function 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: //
139: function 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">
159: body {
160: font-size: 12pt;
161: }
162: h1 {
163: font-size: 20pt;
164: font-weight:bold;
165: }
166: h2 {
167: font-size: 16pt;
168: font-weight:bold;
169: }
170: th {
171: text-align: left;
172: }
173: ul {
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>
183: Images taken from <a href="http://www.exif.org">www.exif.org</a>,
184: <a href="http://marcus-boerger.de">marcus-boerger.de</a>
185: all rights reserved by their authors and artists, see exif headers.
186: The files can be downloaded <a href="http://marcus-boerger.de/php/ext/exif/test/">here</a>.
187: To start the test you simple have to put all images into the same directory as this script.
188: The test will work with all files in that directory and all subdirectories. To test private
189: images just put them into that directory.
190: </p>
191: <p>
192: Youmay take a look at the test <a href="http://marcus-boerger.de/php/ext/exif/test.txt">source here</a>.
193: </p>
194: <p>
195: This test just prooves that some exif headers can be scanned.
196: If all files produce a header in output the module might be o.k.
197: </p>
198: <p>
199: What 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
235: if (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;
255: if (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>