source: extensions/AMetaData/JpegMetaData/test/index.php @ 7511

Last change on this file since 7511 was 7511, checked in by grum, 13 years ago

Update JpegMetadata class to implement COM segment as a tag and keywords in "magic" tags
feature:1975, feature:1976

  • Property svn:executable set to *
File size: 13.0 KB
Line 
1<?php
2/*
3 * --:: JPEG MetaDatas ::-------------------------------------------------------
4 *
5 *  Author    : Grum
6 *   email    : grum at piwigo.org
7 *   website  : http://photos.grum.fr
8 *
9 *   << May the Little SpaceFrog be with you ! >>
10 *
11 *
12 * +-----------------------------------------------------------------------+
13 * | JpegMetaData - a PHP based Jpeg Metadata manager                      |
14 * +-----------------------------------------------------------------------+
15 * | Copyright(C) 2010  Grum - http://www.grum.fr                          |
16 * +-----------------------------------------------------------------------+
17 * | This program is free software; you can redistribute it and/or modify  |
18 * | it under the terms of the GNU General Public License as published by  |
19 * | the Free Software Foundation                                          |
20 * |                                                                       |
21 * | This program is distributed in the hope that it will be useful, but   |
22 * | WITHOUT ANY WARRANTY; without even the implied warranty of            |
23 * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
24 * | General Public License for more details.                              |
25 * |                                                                       |
26 * | You should have received a copy of the GNU General Public License     |
27 * | along with this program; if not, write to the Free Software           |
28 * | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
29 * | USA.                                                                  |
30 * +-----------------------------------------------------------------------+
31 *
32 *
33 * -----------------------------------------------------------------------------
34 *
35 * This file is used to test the capabilities of the JpegMetaData classes
36 *
37 * -----------------------------------------------------------------------------
38 *
39 *
40 * -----------------------------------------------------------------------------
41 */
42
43 ini_set('error_reporting', E_ALL | E_STRICT);
44 ini_set('display_errors', true);
45
46  require_once("./../JpegMetaData.class.php");
47  require_once(JPEG_METADATA_DIR."Readers/JpegReader.class.php");
48  require_once(JPEG_METADATA_DIR."Common/XmlData.class.php");
49  require_once(JPEG_METADATA_DIR."Common/L10n.class.php");
50
51  require_once(JPEG_METADATA_DIR."TagDefinitions/IfdTags.class.php");
52  require_once(JPEG_METADATA_DIR."TagDefinitions/PentaxTags.class.php");
53  require_once(JPEG_METADATA_DIR."TagDefinitions/GpsTags.class.php");
54  require_once(JPEG_METADATA_DIR."TagDefinitions/XmpTags.class.php");
55
56
57  /*
58   * functions
59   *
60   */
61
62  function dump_xml($xml)
63  {
64    $returned="";
65
66    $color=Array(
67     0 => "000000",
68     1 => "ff0000",
69     2 => "0000ff",
70     3 => "008000",
71     4 => "800000",
72     5 => "000080",
73     6 => "008080",
74     7 => "808000",
75     8 => "800080",
76     9 => "808080",
77     10 => "6080F0",
78     11 => "F06080",
79     12 => "80F060",
80     13 => "8080FF",
81     14 => "80FF80",
82     15 => "FF8080" );
83
84    $parser = xml_parser_create();
85    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
86    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
87    xml_parse_into_struct($parser, $xml, $values, $tags);
88    xml_parser_free($parser);
89
90    foreach($values as $key => $val)
91    {
92      switch($val['type'])
93      {
94        case "open":
95          $returned.="<span style='color:#".$color[$val['level']]."'>(".$val['level'].")".str_repeat("&nbsp;", 3*$val['level'])."".$val['tag']."</span>";
96          if(array_key_exists("attributes", $val))
97            foreach($val['attributes'] as $key2 => $val2)
98            {
99              $returned.="<br><span style='color:#".$color[$val['level']]."'>".str_repeat("&nbsp;", 5+3*$val['level'])."<i>[".$key2."] ".$val2."</i></span>";
100            }
101          break;
102        case "close":
103          $returned.="<span style='color:#".$color[$val['level']]."'>(".$val['level'].")".str_repeat("&nbsp;", 3*$val['level'])."/".$val['tag']."</span>";
104          if(array_key_exists("attributes", $val))
105            foreach($val['attributes'] as $key2 => $val2)
106            {
107              $returned.="<br><span style='color:#".$color[$val['level']]."'>".str_repeat("&nbsp;", 5+3*$val['level'])."<i>[".$key2."] ".$val2."</i></span>";
108            }
109          break;
110        case "complete":
111          $returned.="<span style='color:#".$color[$val['level']]."'>(".$val['level'].")".str_repeat("&nbsp;", 3*$val['level'])."/".$val['tag']."</span>";
112          if(array_key_exists("attributes", $val))
113            foreach($val['attributes'] as $key2 => $val2)
114            {
115              $returned.="<br><span style='color:#".$color[$val['level']]."'>".str_repeat("&nbsp;", 5+3*$val['level'])."<i>[".$key2."] ".$val2."</i></span>";
116            }
117          break;
118      }
119      if(array_key_exists('value', $val))
120       $returned.=" <span style='color:#ff00ff;'>".$val['value']."</span>";
121      $returned.="<br>";
122
123    }
124
125    return($returned);
126  }
127
128
129  function dump_ifd($key2, $val2)
130  {
131    $returned=sprintf("IFD %02d: ", $key2).$val2->toString()."<br>";
132
133    foreach($val2->getTags() as $key3 => $val3)
134    {
135      if($val3 instanceof Tag)
136      {
137        $tmpTag=$val3;
138      }
139      else
140      {
141        $tmpTag=$val3->getTag();
142      }
143
144      $returned.=dump_tag($key3, $tmpTag, "<span style='color:#804080;'>".sprintf("[%02d] ", $key3).$val3->toString()."</span><br>");
145
146      if($tmpTag->getLabel() instanceof IfdReader)
147      {
148        $returned.="<div style='padding:1px;margin-bottom:2px;margin-right:4px;margin-left:25px;border:1px dotted #6060FF;'>";
149        $returned.=dump_ifd($key3, $tmpTag->getLabel());
150        $returned.="</div>";
151      }
152    }
153    return($returned);
154  }
155
156
157  function dump_xmp($key2, $val2)
158  {
159    if(is_string($val2->getValue()))
160      $extra=$val2->getValue();
161    elseif(is_array($val2->getValue()))
162      $extra=print_r($val2->getValue(), true);
163    else
164      $extra=ConvertData::toHexDump($val2->getValue(), ByteType::ASCII);
165
166    $extra="<br><span style='color:#000000;'>".$extra."</span><br>";
167
168    $returned="<div style='color:#000000;margin-left:12px;border-bottom:1px solid #808080;";
169    if(!$val2->isKnown())
170    {
171      $returned.="background:#ffd0d0;'>";
172    }
173    elseif(!$val2->isImplemented())
174    {
175      $returned.="background:#ffffd0;'>";
176    }
177    else
178    {
179      $returned.="background:#d0ffd0;'>";
180      $extra="";
181    }
182
183    $returned.="<span style='color:#804080;'>".$val2->toString().$extra."</span></div>";
184
185    return($returned);
186  }
187
188
189  function dump_tag($key3, $val3, $extra)
190  {
191    $returned="<div style='color:#000000;margin-left:12px;border-bottom:1px solid #808080;";
192    if(!$val3->isKnown())
193    {
194      $returned.="background:#ffd0d0;'>".$extra;
195    }
196    elseif(!$val3->isImplemented())
197    {
198      $returned.="background:#ffffd0;'>".$extra;
199    }
200    else
201    {
202      $returned.="background:#d0ffd0;'>";
203    }
204
205    $returned.=str_replace(" ", "&nbsp;", "     ").$val3->toString("small")."<br></div>";
206
207    return($returned);
208  }
209
210  L10n::setLanguage("fr_FR");
211
212
213  $page="<html><header><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></header><body>";
214
215
216  $page.="<hr>-- Images --<br>";
217
218  /*
219   * display a list of jpeg files in the current directory
220   */
221  $directory = scandir(dirname(__FILE__));
222
223  foreach($directory as $key => $file)
224  {
225    if(preg_match("/.*\.(jpg|jpeg)/i",$file))
226      $page.="[<a href='?file=".$file."'>$file</a>]&nbsp; ";
227  }
228
229
230  $page.="<hr>-- Resultat --<br>";
231
232
233  if(isset($_GET["file"]))
234  {
235    $file=$_GET["file"];
236  }
237  else
238  {
239    $page.="no filename ?<br/></body></html>";
240    die($page);
241  }
242
243  $page.="<span style='font-family:monospace;'>";
244
245  $jpeg = new JpegReader($file, Array('filter' => JpegMetaData::TAGFILTER_ALL, 'xmp' => false, 'maker' => false, 'iptc' => false, 'exif' => false));
246
247  $page2="JpegReader extraction<br>";
248  $page2.="fileName=".$jpeg->getFileName()."<br>";
249  $page2.="isValid=".($jpeg->isValid()?"Y":"N")."<br>";
250  $page2.="isLoaded=".($jpeg->isLoaded()?"Y":"N")."<br>";
251  $page2.="NbMarkers=".$jpeg->countAppMarkerSegments()."<br>";
252
253  foreach($jpeg->getAppMarkerSegments() as $key => $val)
254  {
255    $page2.="<div style='border:1px solid #000000;padding:4px;margin:1px;'>";
256    $page2.=sprintf("[%02d] ", $key).$val->toString()."<br>";
257    if($val->dataLoaded())
258    {
259      $page2.="<div style='color:#0000ff;font-weight:bold;margin-left:20px;'>";
260      $data=$val->getData();
261      if($data instanceof TiffReader)
262      {
263        $page2.=$data->toString()."<br>";
264
265        foreach($data->getIFDs() as $key2 => $val2)
266        {
267          $page2.="<div style='color:#0000ff;font-weight:normal;margin-left:12px;'>";
268          $page2.=dump_ifd($key2, $val2);
269          $page2.="</div>";
270        }
271      }
272      elseif($data instanceof XmpReader)
273      {
274        $page2.=htmlentities($data->toString())."<br>";
275        $page2.=dump_xml($data->toString())."<br>";
276
277        foreach($data->getTags() as $key2 => $val2)
278        {
279          $page2.="<div style='color:#0000ff;font-weight:normal;margin-left:12px;'>";
280          $page2.=dump_xmp($key2, $val2);
281          $page2.="</div>";
282        }
283      }
284      elseif($data instanceof IptcReader)
285      {
286        $data->optimizeDateTime();
287        foreach($data->getTags() as $key2 => $val2)
288        {
289          $page2.="<div style='color:#0000ff;font-weight:normal;margin-left:12px;'>";
290          $page2.=dump_tag($key2, $val2, "");
291          $page2.="</div>";
292        }
293      }
294      elseif($data instanceof ComReader)
295      {
296        foreach($data->getTags() as $key2 => $val2)
297        {
298          $page2.="<div style='color:#0000ff;font-weight:normal;margin-left:12px;'>";
299          $page2.=dump_tag($key2, $val2, "");
300          $page2.="</div>";
301        }
302      }
303      elseif(is_array($data))
304      {
305        $page2.=print_r($val->getData(), true)."<br>";
306      }
307      else
308      {
309       $page2.=htmlentities($val->getData())."<br>";
310      }
311      $page2.="</div>";
312    }
313    $page2.="</div>";
314  }
315  $page2.="</span><hr>";
316  unset($jpeg);
317
318  $page2.="<div style='font-family:monospace;'>JpegMetaData - tag from test file<br>";
319  $page2.="<table style='border:1px solid #000000;width:100%;'>";
320  $page2.="<tr style='border-bottom:1x solid #000000;'><th>Schema</th><th>Key</th><th>Name</th><th>Value</th><th>Computed Value</th></tr>";
321
322
323  $time=microtime(true);
324  $jpegmd = new JpegMetaData($file,
325                              Array(
326                                'filter' => JpegMetaData::TAGFILTER_IMPLEMENTED,
327                                'xmp' => true,
328                                'maker' => true,
329                                'iptc' => true,
330                                'magic' => true,
331                                'exif' => true,
332                                'optimizeIptcDateTime' => true
333                              )
334                            );
335  $time2=microtime(true);
336
337  $i=0;
338  foreach($jpegmd->getTags() as $key => $val)
339  {
340    $txt=$val->getLabel();
341    $value=$val->getValue();
342
343    if($val->isTranslatable())
344      $style="color:#0000ff";
345    else
346      $style="color:#000000";
347
348    if(is_string($txt) and $val->isTranslatable())
349      $txt=L10n::get($txt);
350    if($txt instanceof DateTime)
351      $txt=$txt->format("Y-m-d H:i:s");
352    if(is_array($txt))
353      $txt=print_r($txt, true);
354    if(is_array($value))
355      $value=print_r($value, true);
356    $page2.="<tr><td>".$val->getSchema()."</td><td>".$key."</td><td>".L10n::get($val->getName())."</td><td>".$value."</td><td style='$style'>".$txt."</td></tr>";
357    $i++;
358  }
359  $page2.="</table>Total tags: $i</div><hr>";
360
361  $i=0;
362  $j=0;
363  $page2.="<div style='font-family:monospace;'>JpegMetaData - known tags<br>";
364  $page2.="<table style='border:1px solid #000000;width:100%;'>";
365  $page2.="<tr style='border-bottom:1x solid #000000;'><th>Key</th><th>Name</th><th>Implemented</th></tr>";
366  foreach(JpegMetaData::getTagList(
367                                    Array(
368                                      'filter' => JpegMetaData::TAGFILTER_ALL,
369                                      'xmp' => true,
370                                      'maker' => true,
371                                      'iptc' => true,
372                                      'magic' => true,
373                                      'exif' => true,
374                                    )
375                                  ) as $key => $val)
376  {
377    $val['implemented']?$i++:$j++;
378    $page2.="<tr><td>".$key."</td><td>".L10n::get($val['name'])."</td><td>".($val['implemented']?"yes":"no")."</td></tr>";
379  }
380  $page2.="</table>Total tags ; implemented: $i - not implemented: $j</span><hr>";
381
382  unset($jpegmd);
383
384  $memory=memory_get_usage();
385  $jpegmd = new JpegMetaData($file, Array(
386    'filter' => JpegMetaData::TAGFILTER_IMPLEMENTED,
387    'optimizeIptcDateTime' => true)
388  );
389  unset($jpegmd);
390  $memory2=memory_get_usage();
391
392  $page.="parsing time : ".($time2-$time)."<br>";
393  $page.="memory on start : ".$memory."<br>";
394  $page.="memory on end : ".$memory2." (memory leak ? = ".($memory2-$memory).")<br>";
395
396  $page.=$page2;
397  $page.="<br/></body></html>";
398
399  echo $page;
400  unset($page2);
401  unset($page);
402?>
Note: See TracBrowser for help on using the repository browser.