source: extensions/AMetaData/JpegMetaData/TagDefinitions/XmpTags.class.php @ 4931

Last change on this file since 4931 was 4931, checked in by grum, 14 years ago

Implement Nikon camera's maker note ; add some Xmp tag ; fix some bugs

  • Property svn:executable set to *
File size: 58.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 * The XmpTags is the definition of the XMP tags
36 *
37 * -----------------------------------------------------------------------------
38 */
39
40  require_once(JPEG_METADATA_DIR."TagDefinitions/KnownTags.class.php");
41  require_once(JPEG_METADATA_DIR."TagDefinitions/IfdTags.class.php");
42  require_once(JPEG_METADATA_DIR."TagDefinitions/GpsTags.class.php");
43  require_once(JPEG_METADATA_DIR."TagDefinitions/IptcTags.class.php");
44
45  /**
46   * Define the tags for XMP metadata
47   */
48  class XmpTags extends KnownTags
49  {
50    const TYPE_SIMPLE = 0x00;
51    const TYPE_SEQ = 0x01;
52    const TYPE_BAG = 0x02;
53    const TYPE_ALT = 0x03;
54
55    protected $label = "XMP tags";
56    protected $tags = Array(
57      'xmlns:x' => Array(
58        'implemented'  => false,
59        'translatable' => false,
60        'type'         => self::TYPE_SIMPLE,
61        'schema'       => "xmlns",
62      ),
63
64      'x:xmptk' => Array(
65        'implemented'  => true,
66        'translatable' => false,
67        'type'         => self::TYPE_SIMPLE,
68        'schema'       => "x",
69      ),
70
71
72      'xmlns:rdf' => Array(
73        'implemented'  => false,
74        'translatable' => false,
75        'type'         => self::TYPE_SIMPLE,
76        'schema'       => "xmlns",
77      ),
78
79
80      'rdf:about' => Array(
81        'implemented'  => false,
82        'translatable' => false,
83        'type'         => self::TYPE_SIMPLE,
84        'schema'       => "rdf",
85      ),
86
87      /*
88       * Dublin Core schema
89       */
90      'xmlns:dc' => Array(
91        'implemented'  => false,
92        'translatable' => false,
93        'type'         => self::TYPE_SIMPLE,
94        'schema'       => "xmlns",
95      ),
96      'dc:contributor' => Array(
97        'implemented'  => true,
98        'translatable' => false,
99        'type'         => self::TYPE_BAG,
100        'schema'       => "dc",
101      ),
102      'dc:coverage' => Array(
103        'implemented'  => true,
104        'translatable' => false,
105        'type'         => self::TYPE_SIMPLE,
106        'schema'       => "dc",
107      ),
108      'dc:creator' => Array(
109        'iptcCreator'  => 0x0250,
110        'implemented'  => true,
111        'translatable' => false,
112        'type'         => self::TYPE_SEQ,
113        'schema'       => "dc",
114      ),
115      'dc:date' => Array(
116        'implemented'  => false,
117        'translatable' => false,
118        'type'         => self::TYPE_SEQ,
119        'schema'       => "dc",
120      ),
121      'dc:description' => Array(
122        'iptcTag'      => 0x0278,
123        'implemented'  => true,
124        'translatable' => false,
125        'type'         => self::TYPE_ALT,
126        'schema'       => "dc",
127      ),
128        'dc:format' => Array(
129        'implemented'  => true,
130        'translatable' => false,
131        'type'         => self::TYPE_SIMPLE,
132        'schema'       => "dc",
133      ),
134      'dc:identifier' => Array(
135        'implemented'  => true,
136        'translatable' => false,
137        'type'         => self::TYPE_SIMPLE,
138        'schema'       => "dc",
139      ),
140      'dc:language' => Array(
141        'implemented'  => true,
142        'translatable' => false,
143        'type'         => self::TYPE_BAG,
144        'schema'       => "dc",
145      ),
146      'dc:publisher' => Array(
147        'implemented'  => true,
148        'translatable' => false,
149        'type'         => self::TYPE_BAG,
150        'schema'       => "dc",
151      ),
152      'dc:relation' => Array(
153        'implemented'  => true,
154        'translatable' => false,
155        'type'         => self::TYPE_BAG,
156        'schema'       => "dc",
157      ),
158      'dc:rights' => Array(
159        'iptcTag'      => 0x0274,
160        'implemented'  => true,
161        'translatable' => false,
162        'type'         => self::TYPE_ALT,
163        'schema'       => "dc",
164      ),
165      'dc:source' => Array(
166        'implemented'  => true,
167        'translatable' => false,
168        'type'         => self::TYPE_SIMPLE,
169        'schema'       => "dc",
170      ),
171      'dc:subject' => Array(
172        'iptcTag'      => 0x0219,
173        'implemented'  => true,
174        'translatable' => false,
175        'type'         => self::TYPE_BAG,
176        'schema'       => "dc",
177      ),
178      'dc:title' => Array(
179        'iptcTag'      => 0x0205,
180        'implemented'  => true,
181        'translatable' => false,
182        'type'         => self::TYPE_ALT,
183        'schema'       => "dc",
184      ),
185      'dc:Type' => Array(
186        'implemented'  => true,
187        'translatable' => false,
188        'type'         => self::TYPE_BAG,
189        'schema'       => "dc",
190      ),
191
192      // not present in specification, but found in some files
193      'dc:CreatorTool' => Array(
194        'implemented'  => true,
195        'translatable' => false,
196        'type'         => self::TYPE_SIMPLE,
197        'schema'       => "dc",
198      ),
199
200
201
202      /*
203       * XMP Basic schema
204       */
205      'xmlns:xmp' => Array(
206        'implemented'  => false,
207        'translatable' => false,
208        'type'         => self::TYPE_SIMPLE,
209        'schema'       => "xmlns",
210      ),
211
212      'xmp:Advisory' => Array(
213        'implemented'  => true,
214        'translatable' => false,
215        'type'         => self::TYPE_BAG,
216        'schema'       => "xmp",
217      ),
218      'xmp:BaseURL' => Array(
219        'implemented'  => true,
220        'translatable' => false,
221        'type'         => self::TYPE_SIMPLE,
222        'schema'       => "xmp",
223      ),
224      'xmp:CreateDate' => Array(
225        'implemented'  => true,
226        'translatable' => false,
227        'type'         => self::TYPE_SIMPLE,
228        'schema'       => "xmp",
229      ),
230      'xmp:CreatorTool' => Array(
231        'implemented'  => true,
232        'translatable' => false,
233        'type'         => self::TYPE_SIMPLE,
234        'schema'       => "xmp",
235      ),
236      'xmp:Identifier' => Array(
237        'implemented'  => true,
238        'translatable' => false,
239        'type'         => self::TYPE_BAG,
240        'schema'       => "xmp",
241      ),
242      'xmp:Label' => Array(
243        'implemented'  => true,
244        'translatable' => false,
245        'type'         => self::TYPE_SIMPLE,
246        'schema'       => "xmp",
247      ),
248      'xmp:MetadataDate' => Array(
249        'implemented'  => true,
250        'translatable' => false,
251        'type'         => self::TYPE_SIMPLE,
252        'schema'       => "xmp",
253      ),
254      'xmp:ModifyDate' => Array(
255        'implemented'  => true,
256        'translatable' => false,
257        'type'         => self::TYPE_SIMPLE,
258        'schema'       => "xmp",
259      ),
260      'xmp:Nickname' => Array(
261        'implemented'  => true,
262        'translatable' => false,
263        'type'         => self::TYPE_SIMPLE,
264        'schema'       => "xmp",
265      ),
266      'xmp:Rating' => Array(
267        'implemented'  => true,
268        'translatable' => false,
269        'type'         => self::TYPE_SIMPLE,
270        'schema'       => "xmp",
271      ),
272      'xmp:Thumbnails' => Array(
273        'implemented'  => false,
274        'translatable' => false,
275        'type'         => self::TYPE_ALT,
276        'schema'       => "xmp",
277      ),
278
279      /*
280       * XMP Rights Management schema
281       */
282      'xmlns:xmpRights' => Array(
283        'implemented'  => false,
284        'translatable' => false,
285        'type'         => self::TYPE_SIMPLE,
286        'schema'       => "xmlns",
287      ),
288
289      'xmpRights:Certificate' => Array(
290        'implemented'  => true,
291        'translatable' => false,
292        'type'         => self::TYPE_SIMPLE,
293        'schema'       => "xmpRights",
294      ),
295      'xmpRights:Marked' => Array(
296        'implemented'  => true,
297        'translatable' => true,
298        'type'         => self::TYPE_SIMPLE,
299        'schema'       => "xmpRights",
300      ),
301      'xmpRights:Owner' => Array(
302        'implemented'  => true,
303        'translatable' => false,
304        'type'         => self::TYPE_BAG,
305        'schema'       => "xmpRights",
306      ),
307      'xmpRights:UsageTerms' => Array(
308        'implemented'  => true,
309        'translatable' => false,
310        'type'         => self::TYPE_ALT,
311        'schema'       => "xmpRights",
312      ),
313      'xmpRights:WebStatement' => Array(
314        'implemented'  => true,
315        'translatable' => false,
316        'type'         => self::TYPE_SIMPLE,
317        'schema'       => "xmpRights",
318      ),
319
320
321      /*
322       * XMP Media Management schema
323       */
324      'xmlns:xmpMM' => Array(
325        'implemented'  => false,
326        'translatable' => false,
327        'type'         => self::TYPE_SIMPLE,
328        'schema'       => "xmlns",
329      ),
330
331/*
332 * The DerivedFrom is a ResourceRef structure
333 * Not yet implemented
334 */
335      'xmpMM:DerivedFrom' => Array(
336        'implemented'  => false,
337        'translatable' => false,
338        'type'         => self::TYPE_SIMPLE,
339        'schema'       => "xmpMM",
340      ),
341
342      'xmpMM:DocumentID' => Array(
343        'implemented'  => true,
344        'translatable' => false,
345        'type'         => self::TYPE_SIMPLE,
346        'schema'       => "xmpMM",
347      ),
348/*
349 * The History is a sequence of ResourceEvent structure
350 * Not yet implemented
351 */
352      'xmpMM:History' => Array(
353        'implemented'  => false,
354        'translatable' => false,
355        'type'         => self::TYPE_SEQ,
356        'schema'       => "xmpMM",
357      ),
358
359      'xmpMM:InstanceID' => Array(
360        'implemented'  => true,
361        'translatable' => false,
362        'type'         => self::TYPE_SIMPLE,
363        'schema'       => "xmpMM",
364      ),
365
366/*
367 * The ManagedFrom is a ResourceRef structure
368 * Not yet implemented
369 */
370      'xmpMM:ManagedFrom' => Array(
371        'implemented'  => false,
372        'translatable' => false,
373        'type'         => self::TYPE_SIMPLE,
374        'schema'       => "xmpMM",
375      ),
376      'xmpMM:Manager' => Array(
377        'implemented'  => true,
378        'translatable' => false,
379        'type'         => self::TYPE_SIMPLE,
380        'schema'       => "xmpMM",
381      ),
382      'xmpMM:ManageTo' => Array(
383        'implemented'  => true,
384        'translatable' => false,
385        'type'         => self::TYPE_SIMPLE,
386        'schema'       => "xmpMM",
387      ),
388      'xmpMM:ManageUI' => Array(
389        'implemented'  => true,
390        'translatable' => false,
391        'type'         => self::TYPE_SIMPLE,
392        'schema'       => "xmpMM",
393      ),
394      'xmpMM:ManagerVariant' => Array(
395        'implemented'  => true,
396        'translatable' => false,
397        'type'         => self::TYPE_SIMPLE,
398        'schema'       => "xmpMM",
399      ),
400      'xmpMM:RenditionClass' => Array(
401        'implemented'  => true,
402        'translatable' => false,
403        'type'         => self::TYPE_SIMPLE,
404        'schema'       => "xmpMM",
405      ),
406      'xmpMM:RenditionParams' => Array(
407        'implemented'  => true,
408        'translatable' => false,
409        'type'         => self::TYPE_SIMPLE,
410        'schema'       => "xmpMM",
411      ),
412      'xmpMM:VersionID' => Array(
413        'implemented'  => true,
414        'translatable' => false,
415        'type'         => self::TYPE_SIMPLE,
416        'schema'       => "xmpMM",
417      ),
418/*
419 * The Versions is a sequence of Version structure
420 * Not yet implemented
421 */
422      'xmpMM:Versions' => Array(
423        'implemented'  => false,
424        'translatable' => false,
425        'type'         => self::TYPE_SEQ,
426        'schema'       => "xmpMM",
427      ),
428      'xmpMM:LastURL' => Array(
429        'implemented'  => true,
430        'translatable' => false,
431        'type'         => self::TYPE_SIMPLE,
432        'schema'       => "xmpMM",
433      ),
434
435
436      /*
437       * XMP Basic Job Ticket schema
438       */
439      'xmlns:xmpBJ' => Array(
440        'implemented'  => false,
441        'translatable' => false,
442        'type'         => self::TYPE_SIMPLE,
443        'schema'       => "xmlns",
444      ),
445      'xmpBJ:JobRef' => Array(
446        'implemented'  => false,
447        'translatable' => false,
448        'type'         => self::TYPE_BAG,
449        'schema'       => "xmpBJ",
450      ),
451
452
453      /*
454       * XMP Paged-Text schema
455       *
456       * No implementation for this tag, assuminf they're not needed for
457       * photography
458       */
459      'xmlns:xmpTPg' => Array(
460        'implemented'  => false,
461        'translatable' => false,
462        'type'         => self::TYPE_SIMPLE,
463        'schema'       => "xmlns",
464      ),
465
466      'xmpTPg:MaxPageSize' => Array(
467        'implemented'  => false,
468        'translatable' => false,
469        'type'         => self::TYPE_SIMPLE,
470        'schema'       => "xmpTPg",
471      ),
472      'xmpTPg:NPages' => Array(
473        'implemented'  => false,
474        'translatable' => false,
475        'type'         => self::TYPE_SIMPLE,
476        'schema'       => "xmpTPg",
477      ),
478      'xmpTPg:Fonts' => Array(
479        'implemented'  => false,
480        'translatable' => false,
481        'type'         => self::TYPE_BAG,
482        'schema'       => "xmpTPg",
483      ),
484      'xmpTPg:Colorants' => Array(
485        'implemented'  => false,
486        'translatable' => false,
487        'type'         => self::TYPE_SEQ,
488        'schema'       => "xmpTPg",
489      ),
490      'xmpTPg:PlateNames' => Array(
491        'implemented'  => false,
492        'translatable' => false,
493        'type'         => self::TYPE_SEQ,
494        'schema'       => "xmpTPg",
495      ),
496
497      /*
498       * XMP Dynamic Media schema
499       * ==> seems to be dedicated for video's file, so don't try to implement
500       *     it at now
501       */
502      'xmlns:xmpDM' => Array(
503        'implemented'  => false,
504        'translatable' => false,
505        'type'         => self::TYPE_SIMPLE,
506        'schema'       => "xmlns",
507      ),
508
509
510      /*
511       * Photoshop schema
512       */
513      'xmlns:photoshop' => Array(
514        'implemented'  => false,
515        'translatable' => false,
516        'type'         => self::TYPE_SIMPLE,
517        'schema'       => "xmlns",
518      ),
519
520      'photoshop:AuthorsPosition' => Array(
521        'iptcTag'      => 0x0255,
522        'implemented'  => true,
523        'translatable' => false,
524        'type'         => self::TYPE_SIMPLE,
525        'schema'       => "photoshop",
526      ),
527      'photoshop:CaptionWriter' => Array(
528        'iptcTag'      => 0x027A,
529        'implemented'  => true,
530        'translatable' => false,
531        'type'         => self::TYPE_SIMPLE,
532        'schema'       => "photoshop",
533      ),
534      'photoshop:Category' => Array(
535        'implemented'  => true,
536        'translatable' => false,
537        'type'         => self::TYPE_SIMPLE,
538        'schema'       => "photoshop",
539      ),
540      'photoshop:City' => Array(
541        'iptcTag'      => 0x025A,
542        'implemented'  => true,
543        'translatable' => false,
544        'type'         => self::TYPE_SIMPLE,
545        'schema'       => "photoshop",
546      ),
547      'photoshop:Country' => Array(
548        'iptcTag'      => 0x0265,
549        'implemented'  => true,
550        'translatable' => false,
551        'type'         => self::TYPE_SIMPLE,
552        'schema'       => "photoshop",
553      ),
554      'photoshop:Credit' => Array(
555        'iptcTag'      => 0x026E,
556        'implemented'  => true,
557        'translatable' => false,
558        'type'         => self::TYPE_SIMPLE,
559        'schema'       => "photoshop",
560      ),
561      'photoshop:DateCreated' => Array(
562        'implemented'  => true,
563        'translatable' => false,
564        'type'         => self::TYPE_SIMPLE,
565        'schema'       => "photoshop",
566      ),
567      'photoshop:Headline' => Array(
568        'iptcTag'      => 0x0269,
569        'implemented'  => true,
570        'translatable' => false,
571        'type'         => self::TYPE_SIMPLE,
572        'schema'       => "photoshop",
573      ),
574      'photoshop:Instructions' => Array(
575        'iptcTag'      => 0x228,
576        'implemented'  => true,
577        'translatable' => false,
578        'type'         => self::TYPE_SIMPLE,
579        'schema'       => "photoshop",
580      ),
581      'photoshop:Source' => Array(
582        'iptctag'      => 0x0273,
583        'implemented'  => true,
584        'translatable' => false,
585        'type'         => self::TYPE_SIMPLE,
586        'schema'       => "photoshop",
587      ),
588      'photoshop:State' => Array(
589        'iptcTag'      => 0x25F,
590        'implemented'  => true,
591        'translatable' => false,
592        'type'         => self::TYPE_SIMPLE,
593        'schema'       => "photoshop",
594      ),
595      'photoshop:SupplementalCategories' => Array(
596        'implemented'  => true,
597        'translatable' => false,
598        'type'         => self::TYPE_BAG,
599        'schema'       => "photoshop",
600      ),
601      'photoshop:TransmissionReference' => Array(
602        'iptcTag'      => 0x267,
603        'implemented'  => true,
604        'translatable' => false,
605        'type'         => self::TYPE_SIMPLE,
606        'schema'       => "photoshop",
607      ),
608      'photoshop:Urgency' => Array(
609        'implemented'  => true,
610        'translatable' => true,
611        'type'         => self::TYPE_SIMPLE,
612        'schema'       => "photoshop",
613        'tagValues'    => Array(
614           '0' => 'none',
615           '1' => 'high+++',
616           '2' => 'high++',
617           '3' => 'high+',
618           '4' => 'high',
619           '5' => 'normal',
620           '6' => 'low',
621           '7' => 'low+',
622           '8' => 'low++',
623           '9' => 'none',
624        ),
625      ),
626      // not present in specification but found in some files
627      'photoshop:ICCProfile' => Array(
628        'implemented'  => true,
629        'translatable' => false,
630        'type'         => self::TYPE_SIMPLE,
631        'schema'       => "photoshop",
632      ),
633      'photoshop:ColorMode' => Array(
634        'implemented'  => false,
635        'translatable' => false,
636        'type'         => self::TYPE_SIMPLE,
637        'schema'       => "photoshop",
638      ),
639
640
641      /*
642       * Camera Raw schema
643       */
644      'xmlns:crs' => Array(
645        'implemented'  => false,
646        'translatable' => false,
647        'type'         => self::TYPE_SIMPLE,
648        'schema'       => "xmlns",
649      ),
650      'crs:AutoBrightness' => Array(
651        'implemented'  => true,
652        'translatable' => true,
653        'type'         => self::TYPE_SIMPLE,
654        'schema'       => "crs",
655      ),
656      'crs:AutoContrast' => Array(
657        'implemented'  => true,
658        'translatable' => true,
659        'type'         => self::TYPE_SIMPLE,
660        'schema'       => "crs",
661      ),
662      'crs:AutoExposure' => Array(
663        'implemented'  => true,
664        'translatable' => true,
665        'type'         => self::TYPE_SIMPLE,
666        'schema'       => "crs",
667      ),
668      'crs:AutoShadows' => Array(
669        'implemented'  => true,
670        'translatable' => true,
671        'type'         => self::TYPE_SIMPLE,
672        'schema'       => "crs",
673      ),
674      'crs:BlueHue' => Array(
675        'implemented'  => true,
676        'translatable' => false,
677        'type'         => self::TYPE_SIMPLE,
678        'schema'       => "crs",
679      ),
680      'crs:BlueSaturation' => Array(
681        'implemented'  => true,
682        'translatable' => false,
683        'type'         => self::TYPE_SIMPLE,
684        'schema'       => "crs",
685      ),
686      'crs:Brightness' => Array(
687        'implemented'  => true,
688        'translatable' => false,
689        'type'         => self::TYPE_SIMPLE,
690        'schema'       => "crs",
691      ),
692      'crs:CameraProfile' => Array(
693        'implemented'  => true,
694        'translatable' => false,
695        'type'         => self::TYPE_SIMPLE,
696        'schema'       => "crs",
697      ),
698      'crs:ChromaticAberrationB' => Array(
699        'implemented'  => true,
700        'translatable' => false,
701        'type'         => self::TYPE_SIMPLE,
702        'schema'       => "crs",
703      ),
704      'crs:ChromaticAberrationR' => Array(
705        'implemented'  => true,
706        'translatable' => false,
707        'type'         => self::TYPE_SIMPLE,
708        'schema'       => "crs",
709      ),
710      'crs:ColorNoiseReduction' => Array(
711        'implemented'  => true,
712        'translatable' => false,
713        'type'         => self::TYPE_SIMPLE,
714        'schema'       => "crs",
715      ),
716      'crs:Contrast' => Array(
717        'implemented'  => true,
718        'translatable' => false,
719        'type'         => self::TYPE_SIMPLE,
720        'schema'       => "crs",
721      ),
722      'crs:CropTop' => Array(
723        'implemented'  => true,
724        'translatable' => false,
725        'type'         => self::TYPE_SIMPLE,
726        'schema'       => "crs",
727      ),
728      'crs:CropLeft' => Array(
729        'implemented'  => true,
730        'translatable' => false,
731        'type'         => self::TYPE_SIMPLE,
732        'schema'       => "crs",
733      ),
734      'crs:CropBottom' => Array(
735        'implemented'  => true,
736        'translatable' => false,
737        'type'         => self::TYPE_SIMPLE,
738        'schema'       => "crs",
739      ),
740      'crs:CropRight' => Array(
741        'implemented'  => true,
742        'translatable' => false,
743        'type'         => self::TYPE_SIMPLE,
744        'schema'       => "crs",
745      ),
746      'crs:CropAngle' => Array(
747        'implemented'  => true,
748        'translatable' => false,
749        'type'         => self::TYPE_SIMPLE,
750        'schema'       => "crs",
751      ),
752      'crs:CropWidth' => Array(
753        'implemented'  => true,
754        'translatable' => false,
755        'type'         => self::TYPE_SIMPLE,
756        'schema'       => "crs",
757      ),
758      'crs:CropHeight' => Array(
759        'implemented'  => true,
760        'translatable' => false,
761        'type'         => self::TYPE_SIMPLE,
762        'schema'       => "crs",
763      ),
764      'crs:CropUnits' => Array(
765        'implemented'  => true,
766        'translatable' => true,
767        'type'         => self::TYPE_SIMPLE,
768        'schema'       => "crs",
769        'tagValues'    => Array(
770           '0' => "pixels",
771           '1' => "inches",
772           '2' => "centimeters",
773        ),
774      ),
775      'crs:Exposure' => Array(
776        'implemented'  => true,
777        'translatable' => false,
778        'type'         => self::TYPE_SIMPLE,
779        'schema'       => "crs",
780      ),
781      'crs:GreenHue' => Array(
782        'implemented'  => true,
783        'translatable' => false,
784        'type'         => self::TYPE_SIMPLE,
785        'schema'       => "crs",
786      ),
787      'crs:GreenSaturation' => Array(
788        'implemented'  => true,
789        'translatable' => false,
790        'type'         => self::TYPE_SIMPLE,
791        'schema'       => "crs",
792      ),
793      'crs:HasCrop' => Array(
794        'implemented'  => true,
795        'translatable' => true,
796        'type'         => self::TYPE_SIMPLE,
797        'schema'       => "crs",
798      ),
799      'crs:HasSettings' => Array(
800        'implemented'  => true,
801        'translatable' => true,
802        'type'         => self::TYPE_SIMPLE,
803        'schema'       => "crs",
804      ),
805      'crs:LuminanceSmoothing' => Array(
806        'implemented'  => true,
807        'translatable' => false,
808        'type'         => self::TYPE_SIMPLE,
809        'schema'       => "crs",
810      ),
811      'crs:RawFileName' => Array(
812        'implemented'  => true,
813        'translatable' => false,
814        'type'         => self::TYPE_SIMPLE,
815        'schema'       => "crs",
816      ),
817      'crs:RedHue' => Array(
818        'implemented'  => true,
819        'translatable' => false,
820        'type'         => self::TYPE_SIMPLE,
821        'schema'       => "crs",
822      ),
823      'crs:RedSaturation' => Array(
824        'implemented'  => true,
825        'translatable' => false,
826        'type'         => self::TYPE_SIMPLE,
827        'schema'       => "crs",
828      ),
829      'crs:Saturation' => Array(
830        'implemented'  => true,
831        'translatable' => false,
832        'type'         => self::TYPE_SIMPLE,
833        'schema'       => "crs",
834      ),
835      'crs:Shadows' => Array(
836        'implemented'  => true,
837        'translatable' => false,
838        'type'         => self::TYPE_SIMPLE,
839        'schema'       => "crs",
840      ),
841      'crs:ShadowTint' => Array(
842        'implemented'  => true,
843        'translatable' => false,
844        'type'         => self::TYPE_SIMPLE,
845        'schema'       => "crs",
846      ),
847      'crs:Sharpness' => Array(
848        'implemented'  => true,
849        'translatable' => false,
850        'type'         => self::TYPE_SIMPLE,
851        'schema'       => "crs",
852      ),
853      'crs:Temperature' => Array(
854        'implemented'  => true,
855        'translatable' => false,
856        'type'         => self::TYPE_SIMPLE,
857        'schema'       => "crs",
858      ),
859      'crs:Tint' => Array(
860        'implemented'  => true,
861        'translatable' => false,
862        'type'         => self::TYPE_SIMPLE,
863        'schema'       => "crs",
864      ),
865      'crs:ToneCurve' => Array(
866        'implemented'  => false,
867        'translatable' => false,
868        'type'         => self::TYPE_SEQ,
869        'schema'       => "crs",
870      ),
871      'crs:ToneCurveName' => Array(
872        'implemented'  => true,
873        'translatable' => true,
874        'type'         => self::TYPE_SIMPLE,
875        'schema'       => "crs",
876        'tagValues'    => Array(
877           'Linear'          => "linear",
878           'Medium Contrast' => "Medium Contrast",
879           'Strong Contrast' => "Strong Contrast",
880           'Custom'          => "Custom",
881        ),      ),
882      'crs:Version' => Array(
883        'implemented'  => true,
884        'translatable' => false,
885        'type'         => self::TYPE_SIMPLE,
886        'schema'       => "crs",
887      ),
888      'crs:VignetteAmount' => Array(
889        'implemented'  => true,
890        'translatable' => false,
891        'type'         => self::TYPE_SIMPLE,
892        'schema'       => "crs",
893      ),
894      'crs:VignetteMidpoint' => Array(
895        'implemented'  => true,
896        'translatable' => false,
897        'type'         => self::TYPE_SIMPLE,
898        'schema'       => "crs",
899      ),
900      'crs:Balance' => Array(
901        'implemented'  => true,
902        'translatable' => true,
903        'type'         => self::TYPE_SIMPLE,
904        'schema'       => "crs",
905        'tagValues'    => Array(
906           'As Shot'     => "As Shot",
907           'Auto'        => "Auto",
908           'Daylight'    => "Daylight",
909           'Cloudy'      => "Cloudy",
910           'Shade'       => "Shade",
911           'Tungsten'    => "Tungsten",
912           'Fluorescent' => "Fluorescent",
913           'Flash'       => "Flash",
914           'Custom'      => "Custom",
915        ),
916      ),
917      // not present in specifications, but found in some files
918      'crs:WhiteBalance' => Array(
919        'implemented'  => true,
920        'translatable' => true,
921        'type'         => self::TYPE_SIMPLE,
922        'schema'       => "crs",
923        'tagValues'    => Array(
924           'As Shot'     => "As Shot",
925           'Auto'        => "Auto",
926           'Daylight'    => "Daylight",
927           'Cloudy'      => "Cloudy",
928           'Shade'       => "Shade",
929           'Tungsten'    => "Tungsten",
930           'Fluorescent' => "Fluorescent",
931           'Flash'       => "Flash",
932           'Custom'      => "Custom",
933        ),
934      ),
935
936
937
938      /*
939       * EXIF Schema for TIFF Properties
940       *
941       */
942      'xmlns:tiff' => Array(
943        'implemented'  => false,
944        'translatable' => false,
945        'type'         => self::TYPE_SIMPLE,
946        'schema'       => "xmlns",
947      ),
948      'tiff:ImageWidth' => Array(
949        'exifTag'      => 0x0100,
950        'implemented'  => true,
951        'translatable' => false,
952        'type'         => self::TYPE_SIMPLE,
953        'schema'       => "tiff",
954      ),
955      'tiff:ImageLength' => Array(
956        'exifTag'      => 0x0101,
957        'implemented'  => true,
958        'translatable' => false,
959        'type'         => self::TYPE_SIMPLE,
960        'schema'       => "tiff",
961      ),
962      'tiff:BitsPerSample' => Array(
963        'exifTag'      => 0x0102,
964        'implemented'  => true,
965        'translatable' => false,
966        'type'         => self::TYPE_SEQ,
967        'schema'       => "tiff",
968      ),
969      'tiff:Compression' => Array(
970        'exifTag'      => 0x0103,
971        'implemented'  => true,
972        'translatable' => false,
973        'type'         => self::TYPE_SIMPLE,
974        'schema'       => "tiff",
975      ),
976      'tiff:PhotometricInterpretation' => Array(
977        'exifTag'      => 0x0106,
978        'implemented'  => true,
979        'translatable' => false,
980        'type'         => self::TYPE_SIMPLE,
981        'schema'       => "tiff",
982      ),
983      'tiff:Orientation' => Array(
984        'exifTag'      => 0x0112,
985        'implemented'  => true,
986        'translatable' => false,
987        'type'         => self::TYPE_SIMPLE,
988        'schema'       => "tiff",
989      ),
990      'tiff:SamplesPerPixel' => Array(
991        'exifTag'      => 0x0115,
992        'implemented'  => true,
993        'translatable' => false,
994        'type'         => self::TYPE_SIMPLE,
995        'schema'       => "tiff",
996      ),
997      'tiff:PlanarConfiguration' => Array(
998        'exifTag'      => 0x011C,
999        'implemented'  => true,
1000        'translatable' => false,
1001        'type'         => self::TYPE_SIMPLE,
1002        'schema'       => "tiff",
1003      ),
1004      'tiff:YCbCrSubSampling' => Array(
1005        'exifTag'      => 0x0212,
1006        'implemented'  => true,
1007        'translatable' => false,
1008        'type'         => self::TYPE_SEQ,
1009        'schema'       => "tiff",
1010      ),
1011      'tiff:YCbCrPositioning' => Array(
1012        'exifTag'      => 0x0213,
1013        'implemented'  => true,
1014        'translatable' => false,
1015        'type'         => self::TYPE_SIMPLE,
1016        'schema'       => "tiff",
1017      ),
1018      'tiff:XResolution' => Array(
1019        'exifTag'      => 0x011A,
1020        'implemented'  => true,
1021        'translatable' => false,
1022        'type'         => self::TYPE_SIMPLE,
1023        'schema'       => "tiff",
1024      ),
1025      'tiff:YResolution' => Array(
1026        'exifTag'      => 0x011B,
1027        'implemented'  => true,
1028        'translatable' => false,
1029        'type'         => self::TYPE_SIMPLE,
1030        'schema'       => "tiff",
1031      ),
1032      'tiff:ResolutionUnit' => Array(
1033        'exifTag'      => 0x0128,
1034        'implemented'  => true,
1035        'translatable' => false,
1036        'type'         => self::TYPE_SIMPLE,
1037        'schema'       => "tiff",
1038      ),
1039      'tiff:TransferFunction' => Array(
1040        'exifTag'      => 0x012D,
1041        'implemented'  => true,
1042        'translatable' => false,
1043        'type'         => self::TYPE_SEQ,
1044        'schema'       => "tiff",
1045      ),
1046      'tiff:WhitePoint' => Array(
1047        'exifTag'      => 0x013E,
1048        'implemented'  => true,
1049        'translatable' => false,
1050        'type'         => self::TYPE_SEQ,
1051        'schema'       => "tiff",
1052      ),
1053      'tiff:PrimaryChromaticities' => Array(
1054        'exifTag'      => 0x013F,
1055        'implemented'  => true,
1056        'translatable' => false,
1057        'type'         => self::TYPE_SEQ,
1058        'schema'       => "tiff",
1059      ),
1060      'tiff:YCbCrCoefficients' => Array(
1061        'exifTag'      => 0x0211,
1062        'implemented'  => true,
1063        'translatable' => false,
1064        'type'         => self::TYPE_SEQ,
1065        'schema'       => "tiff",
1066      ),
1067      'tiff:ReferenceBlackWhite' => Array(
1068        'exifTag'      => 0x0214,
1069        'implemented'  => true,
1070        'translatable' => false,
1071        'type'         => self::TYPE_SEQ,
1072        'schema'       => "tiff",
1073      ),
1074      'tiff:DateTime' => Array(
1075        'exifTag'      => 0x0132,
1076        'implemented'  => true,
1077        'translatable' => false,
1078        'type'         => self::TYPE_SIMPLE,
1079        'schema'       => "tiff",
1080      ),
1081      'tiff:ImageDescription' => Array(
1082        'exifTag'      => 0x010E,
1083        'implemented'  => true,
1084        'translatable' => false,
1085        'type'         => self::TYPE_ALT,
1086        'schema'       => "tiff",
1087      ),
1088      'tiff:Make' => Array(
1089        'exifTag'      => 0x010F,
1090        'implemented'  => true,
1091        'translatable' => false,
1092        'type'         => self::TYPE_SIMPLE,
1093        'schema'       => "tiff",
1094      ),
1095      'tiff:Model' => Array(
1096        'exifTag'      => 0x0110,
1097        'implemented'  => true,
1098        'translatable' => false,
1099        'type'         => self::TYPE_SIMPLE,
1100        'schema'       => "tiff",
1101      ),
1102      'tiff:Software' => Array(
1103        'exifTag'      => 0x0131,
1104        'implemented'  => true,
1105        'translatable' => false,
1106        'type'         => self::TYPE_SIMPLE,
1107        'schema'       => "tiff",
1108      ),
1109      'tiff:Artist' => Array(
1110        'exifTag'      => 0x013B,
1111        'implemented'  => true,
1112        'translatable' => false,
1113        'type'         => self::TYPE_SIMPLE,
1114        'schema'       => "tiff",
1115      ),
1116      'tiff:Copyright' => Array(
1117        'exifTag'      => 0x9298,
1118        'implemented'  => true,
1119        'translatable' => false,
1120        'type'         => self::TYPE_ALT,
1121        'schema'       => "tiff",
1122      ),
1123
1124      /*
1125       * EXIF Schema for EXIF-specific Properties
1126       */
1127      'xmlns:exif' => Array(
1128        'implemented'  => false,
1129        'translatable' => false,
1130        'type'         => self::TYPE_SIMPLE,
1131        'schema'       => "xmlns",
1132      ),
1133      'exif:ExifVersion' => Array(
1134        'exifTag'      => 0x9000,
1135        'implemented'  => true,
1136        'translatable' => false,
1137        'type'         => self::TYPE_SIMPLE,
1138        'schema'       => "exif",
1139      ),
1140      'exif:FlashpixVersion' => Array(
1141        'exifTag'      => 0xA000,
1142        'implemented'  => true,
1143        'translatable' => false,
1144        'type'         => self::TYPE_SIMPLE,
1145        'schema'       => "exif",
1146      ),
1147      'exif:ColorSpace' => Array(
1148        'exifTag'      => 0xA001,
1149        'implemented'  => true,
1150        'translatable' => false,
1151        'type'         => self::TYPE_SIMPLE,
1152        'schema'       => "exif",
1153      ),
1154      'exif:ComponentsConfiguration' => Array(
1155        'exifTag'      => 0x9101,
1156        'implemented'  => true,
1157        'translatable' => false,
1158        'type'         => self::TYPE_SEQ,
1159        'schema'       => "exif",
1160      ),
1161      'exif:CompressedBitsPerPixel' => Array(
1162        'exifTag'      => 0x9102,
1163        'implemented'  => true,
1164        'translatable' => false,
1165        'type'         => self::TYPE_SIMPLE,
1166        'schema'       => "exif",
1167      ),
1168      'exif:PixelXDimension' => Array(
1169        'exifTag'      => 0xA002,
1170        'implemented'  => true,
1171        'translatable' => false,
1172        'type'         => self::TYPE_SIMPLE,
1173        'schema'       => "exif",
1174      ),
1175      'exif:PixelYDimension' => Array(
1176        'exifTag'      => 0xA003,
1177        'implemented'  => true,
1178        'translatable' => false,
1179        'type'         => self::TYPE_SIMPLE,
1180        'schema'       => "exif",
1181      ),
1182      'exif:UserComment' => Array(
1183        'exifTag'      => 0x9286,
1184        'implemented'  => true,
1185        'translatable' => false,
1186        'type'         => self::TYPE_ALT,
1187        'schema'       => "exif",
1188      ),
1189      'exif:RelatedSoundFile' => Array(
1190        'exifTag'      => 0xA004,
1191        'implemented'  => true,
1192        'translatable' => false,
1193        'type'         => self::TYPE_SIMPLE,
1194        'schema'       => "exif",
1195      ),
1196      'exif:DateTimeOriginal' => Array(
1197        'exifTag'      => 0x9003,
1198        'implemented'  => true,
1199        'translatable' => false,
1200        'type'         => self::TYPE_SIMPLE,
1201        'schema'       => "exif",
1202      ),
1203      'exif:DateTimeDigitized' => Array(
1204        'exifTag'      => 0x9004,
1205        'implemented'  => true,
1206        'translatable' => false,
1207        'type'         => self::TYPE_SIMPLE,
1208        'schema'       => "exif",
1209      ),
1210      'exif:ExposureTime' => Array(
1211        'exifTag'      => 0x829A,
1212        'implemented'  => true,
1213        'translatable' => false,
1214        'type'         => self::TYPE_SIMPLE,
1215        'schema'       => "exif",
1216      ),
1217      'exif:FNumber' => Array(
1218        'exifTag'      => 0x829D,
1219        'implemented'  => true,
1220        'translatable' => false,
1221        'type'         => self::TYPE_SIMPLE,
1222        'schema'       => "exif",
1223      ),
1224      'exif:ExposureProgram' => Array(
1225        'exifTag'      => 0x8822,
1226        'implemented'  => true,
1227        'translatable' => false,
1228        'type'         => self::TYPE_SIMPLE,
1229        'schema'       => "exif",
1230      ),
1231      'exif:SpectralSensitivity' => Array(
1232        'exifTag'      => 0x8824,
1233        'implemented'  => true,
1234        'translatable' => false,
1235        'type'         => self::TYPE_SIMPLE,
1236        'schema'       => "exif",
1237      ),
1238      'exif:ISOSpeedRatings' => Array(
1239        'exifTag'      => 0x8827,
1240        'implemented'  => true,
1241        'translatable' => false,
1242        'type'         => self::TYPE_SEQ,
1243        'schema'       => "exif",
1244      ),
1245      'exif:OECF' => Array(
1246        'exifTag'      => 0x8828,
1247        'implemented'  => true,
1248        'translatable' => false,
1249        'type'         => self::TYPE_SIMPLE,
1250        'schema'       => "exif",
1251      ),
1252      'exif:ShutterSpeedValue' => Array(
1253        'exifTag'      => 0x9201,
1254        'implemented'  => true,
1255        'translatable' => false,
1256        'type'         => self::TYPE_SIMPLE,
1257        'schema'       => "exif",
1258      ),
1259      'exif:ApertureValue' => Array(
1260        'exifTag'      => 0x9202,
1261        'implemented'  => true,
1262        'translatable' => false,
1263        'type'         => self::TYPE_SIMPLE,
1264        'schema'       => "exif",
1265      ),
1266      'exif:BrightnessValue' => Array(
1267        'exifTag'      => 0x9203,
1268        'implemented'  => true,
1269        'translatable' => false,
1270        'type'         => self::TYPE_SIMPLE,
1271        'schema'       => "exif",
1272      ),
1273      'exif:ExposureBiasValue' => Array(
1274        'exifTag'      => 0x9204,
1275        'implemented'  => true,
1276        'translatable' => false,
1277        'type'         => self::TYPE_SIMPLE,
1278        'schema'       => "exif",
1279      ),
1280      'exif:MaxApertureValue' => Array(
1281        'exifTag'      => 0x9205,
1282        'implemented'  => true,
1283        'translatable' => false,
1284        'type'         => self::TYPE_SIMPLE,
1285        'schema'       => "exif",
1286      ),
1287      'exif:SubjectDistance' => Array(
1288        'exifTag'      => 0x9206,
1289        'implemented'  => true,
1290        'translatable' => false,
1291        'type'         => self::TYPE_SIMPLE,
1292        'schema'       => "exif",
1293      ),
1294      'exif:MeteringMode' => Array(
1295        'exifTag'      => 0x9207,
1296        'implemented'  => true,
1297        'translatable' => false,
1298        'type'         => self::TYPE_SIMPLE,
1299        'schema'       => "exif",
1300      ),
1301      'exif:LightSource' => Array(
1302        'exifTag'      => 0x9208,
1303        'implemented'  => true,
1304        'translatable' => false,
1305        'type'         => self::TYPE_SIMPLE,
1306        'schema'       => "exif",
1307      ),
1308/*
1309 * The Flash is a sequence of Flash structure
1310 * Not yet implemented
1311 */
1312      'exif:Flash' => Array(
1313        'exifTag'      => 0x9209,
1314        'implemented'  => false,
1315        'translatable' => false,
1316        'type'         => self::TYPE_SIMPLE,
1317        'schema'       => "exif",
1318      ),
1319      'exif:FocalLength' => Array(
1320        'exifTag'      => 0x920A,
1321        'implemented'  => true,
1322        'translatable' => false,
1323        'type'         => self::TYPE_SIMPLE,
1324        'schema'       => "exif",
1325      ),
1326      'exif:SubjectArea' => Array(
1327        'exifTag'      => 0x9214,
1328        'implemented'  => true,
1329        'translatable' => false,
1330        'type'         => self::TYPE_SEQ,
1331        'schema'       => "exif",
1332      ),
1333      'exif:FlashEnergy' => Array(
1334        'exifTag'      => 0xA20B,
1335        'implemented'  => true,
1336        'translatable' => false,
1337        'type'         => self::TYPE_SIMPLE,
1338        'schema'       => "exif",
1339      ),
1340      'exif:SpatialFrequencyResponse' => Array(
1341        'exifTag'      => 0xA20C,
1342        'implemented'  => true,
1343        'translatable' => false,
1344        'type'         => self::TYPE_SIMPLE,
1345        'schema'       => "exif",
1346      ),
1347      'exif:FocalPlaneXResolution' => Array(
1348        'exifTag'      => 0xA20E,
1349        'implemented'  => true,
1350        'translatable' => false,
1351        'type'         => self::TYPE_SIMPLE,
1352        'schema'       => "exif",
1353      ),
1354      'exif:FocalPlaneYResolution' => Array(
1355        'exifTag'      => 0xA20F,
1356        'implemented'  => true,
1357        'translatable' => false,
1358        'type'         => self::TYPE_SIMPLE,
1359        'schema'       => "exif",
1360      ),
1361      'exif:FocalPlaneResolutionUnit' => Array(
1362        'exifTag'      => 0xA210,
1363        'implemented'  => true,
1364        'translatable' => false,
1365        'type'         => self::TYPE_SIMPLE,
1366        'schema'       => "exif",
1367      ),
1368      'exif:SubjectLocation' => Array(
1369        'exifTag'      => 0xA214,
1370        'implemented'  => true,
1371        'translatable' => false,
1372        'type'         => self::TYPE_SEQ,
1373        'schema'       => "exif",
1374      ),
1375      'exif:ExposureIndex' => Array(
1376        'exifTag'      => 0xA215,
1377        'implemented'  => true,
1378        'translatable' => false,
1379        'type'         => self::TYPE_SIMPLE,
1380        'schema'       => "exif",
1381      ),
1382      'exif:SensingMethod' => Array(
1383        'exifTag'      => 0xA217,
1384        'implemented'  => true,
1385        'translatable' => false,
1386        'type'         => self::TYPE_SIMPLE,
1387        'schema'       => "exif",
1388      ),
1389      'exif:FileSource' => Array(
1390        'exifTag'      => 0xA300,
1391        'implemented'  => true,
1392        'translatable' => false,
1393        'type'         => self::TYPE_SIMPLE,
1394        'schema'       => "exif",
1395      ),
1396      'exif:SceneType' => Array(
1397        'exifTag'      => 0xA301,
1398        'implemented'  => true,
1399        'translatable' => false,
1400        'type'         => self::TYPE_SIMPLE,
1401        'schema'       => "exif",
1402      ),
1403/*
1404 * The CFAPattern is a CFAPattern structure
1405 * Not yet implemented
1406 */
1407      'exif:CFAPattern' => Array(
1408        'exifTag'      => 0xA302,
1409        'implemented'  => true,
1410        'translatable' => false,
1411        'type'         => self::TYPE_SIMPLE,
1412        'schema'       => "exif",
1413      ),
1414      'exif:CustomRendered' => Array(
1415        'exifTag'      => 0xA401,
1416        'implemented'  => true,
1417        'translatable' => false,
1418        'type'         => self::TYPE_SIMPLE,
1419        'schema'       => "exif",
1420      ),
1421      'exif:ExposureMode' => Array(
1422        'exifTag'      => 0xA402,
1423        'implemented'  => true,
1424        'translatable' => false,
1425        'type'         => self::TYPE_SIMPLE,
1426        'schema'       => "exif",
1427      ),
1428      'exif:Balance' => Array(
1429        'exifTag'      => 0xA403,
1430        'implemented'  => true,
1431        'translatable' => false,
1432        'type'         => self::TYPE_SIMPLE,
1433        'schema'       => "exif",
1434      ),
1435      'exif:WhiteBalance' => Array(
1436        'exifTag'      => 0xA403,
1437        'implemented'  => true,
1438        'translatable' => false,
1439        'type'         => self::TYPE_SIMPLE,
1440        'schema'       => "exif",
1441      ),
1442      'exif:DigitalZoomRatio' => Array(
1443        'exifTag'      => 0xA404,
1444        'implemented'  => true,
1445        'translatable' => false,
1446        'type'         => self::TYPE_SIMPLE,
1447        'schema'       => "exif",
1448      ),
1449      'exif:FocalLengthIn35mmFilm' => Array(
1450        'exifTag'      => 0xA405,
1451        'implemented'  => true,
1452        'translatable' => false,
1453        'type'         => self::TYPE_SIMPLE,
1454        'schema'       => "exif",
1455      ),
1456      'exif:SceneCaptureType' => Array(
1457        'exifTag'      => 0xA406,
1458        'implemented'  => true,
1459        'translatable' => false,
1460        'type'         => self::TYPE_SIMPLE,
1461        'schema'       => "exif",
1462      ),
1463      'exif:GainControl' => Array(
1464        'exifTag'      => 0xA407,
1465        'implemented'  => true,
1466        'translatable' => false,
1467        'type'         => self::TYPE_SIMPLE,
1468        'schema'       => "exif",
1469      ),
1470      'exif:Contrast' => Array(
1471        'exifTag'      => 0xA408,
1472        'implemented'  => true,
1473        'translatable' => false,
1474        'type'         => self::TYPE_SIMPLE,
1475        'schema'       => "exif",
1476      ),
1477      'exif:Saturation' => Array(
1478        'exifTag'      => 0xA409,
1479        'implemented'  => true,
1480        'translatable' => false,
1481        'type'         => self::TYPE_SIMPLE,
1482        'schema'       => "exif",
1483      ),
1484      'exif:Sharpness' => Array(
1485        'exifTag'      => 0xA40A,
1486        'implemented'  => true,
1487        'translatable' => false,
1488        'type'         => self::TYPE_SIMPLE,
1489        'schema'       => "exif",
1490      ),
1491      'exif:DeviceSettingDescription' => Array(
1492        'exifTag'      => 0xA40B,
1493        'implemented'  => true,
1494        'translatable' => false,
1495        'type'         => self::TYPE_SIMPLE,
1496        'schema'       => "exif",
1497      ),
1498      'exif:SubjectDistanceRange' => Array(
1499        'exifTag'      => 0xA40C,
1500        'implemented'  => true,
1501        'translatable' => false,
1502        'type'         => self::TYPE_SIMPLE,
1503        'schema'       => "exif",
1504      ),
1505      'exif:ImageUniqueID' => Array(
1506        'exifTag'      => 0xA420,
1507        'implemented'  => true,
1508        'translatable' => false,
1509        'type'         => self::TYPE_SIMPLE,
1510        'schema'       => "exif",
1511      ),
1512      'exif:GPSVersionID' => Array(
1513        'gpsTag'       => 0x0000,
1514        'implemented'  => true,
1515        'translatable' => false,
1516        'type'         => self::TYPE_SIMPLE,
1517        'schema'       => "exif",
1518      ),
1519      'exif:GPSLatitude' => Array(
1520        'gpsTag'       => 0xFFFF, // combination of tags 0x02 & 0x01
1521        'implemented'  => true,
1522        'translatable' => false,
1523        'type'         => self::TYPE_SIMPLE,
1524        'schema'       => "exif",
1525      ),
1526      'exif:GPSLongitude' => Array(
1527        'gpsTag'       => 0xFFFF, // combination of tags 0x04 & 0x03
1528        'implemented'  => true,
1529        'translatable' => false,
1530        'type'         => self::TYPE_SIMPLE,
1531        'schema'       => "exif",
1532      ),
1533      'exif:GPSAltitudeRef' => Array(
1534        'gpsTag'       => 0x0005,
1535        'implemented'  => true,
1536        'translatable' => false,
1537        'type'         => self::TYPE_SIMPLE,
1538        'schema'       => "exif",
1539      ),
1540      'exif:GPSAltitude' => Array(
1541        'gpsTag'       => 0x0006,
1542        'implemented'  => true,
1543        'translatable' => false,
1544        'type'         => self::TYPE_SIMPLE,
1545        'schema'       => "exif",
1546      ),
1547      'exif:GPSTimeStamp' => Array(
1548        'gpsTag'       => 0xFFFF, // combination of tags 0x1D & 0x07
1549        'implemented'  => true,
1550        'translatable' => false,
1551        'type'         => self::TYPE_SIMPLE,
1552        'schema'       => "exif",
1553      ),
1554      'exif:GPSSatellites' => Array(
1555        'gpsTag'       => 0x0008,
1556        'implemented'  => true,
1557        'translatable' => false,
1558        'type'         => self::TYPE_SIMPLE,
1559        'schema'       => "exif",
1560      ),
1561      'exif:GPSStatus' => Array(
1562        'gpsTag'       => 0x0009,
1563        'implemented'  => true,
1564        'translatable' => false,
1565        'type'         => self::TYPE_SIMPLE,
1566        'schema'       => "exif",
1567      ),
1568      'exif:GPSMeasureMode' => Array(
1569        'gpsTag'       => 0x000A,
1570        'implemented'  => true,
1571        'translatable' => false,
1572        'type'         => self::TYPE_SIMPLE,
1573        'schema'       => "exif",
1574      ),
1575      'exif:GPSDOP' => Array(
1576        'gpsTag'       => 0x000B,
1577        'implemented'  => true,
1578        'translatable' => false,
1579        'type'         => self::TYPE_SIMPLE,
1580        'schema'       => "exif",
1581      ),
1582      'exif:GPSSpeedRef' => Array(
1583        'gpsTag'       => 0x000C,
1584        'implemented'  => true,
1585        'translatable' => false,
1586        'type'         => self::TYPE_SIMPLE,
1587        'schema'       => "exif",
1588      ),
1589      'exif:GPSSpeed' => Array(
1590        'gpsTag'       => 0x000D,
1591        'implemented'  => true,
1592        'translatable' => false,
1593        'type'         => self::TYPE_SIMPLE,
1594        'schema'       => "exif",
1595      ),
1596      'exif:GPSTrackRef' => Array(
1597        'gpsTag'       => 0x000E,
1598        'implemented'  => true,
1599        'translatable' => false,
1600        'type'         => self::TYPE_SIMPLE,
1601        'schema'       => "exif",
1602      ),
1603      'exif:GPSTrack' => Array(
1604        'gpsTag'       => 0x000F,
1605        'implemented'  => true,
1606        'translatable' => false,
1607        'type'         => self::TYPE_SIMPLE,
1608        'schema'       => "exif",
1609      ),
1610      'exif:GPSImgDirectionRef' => Array(
1611        'gpsTag'       => 0x0010,
1612        'implemented'  => true,
1613        'translatable' => false,
1614        'type'         => self::TYPE_SIMPLE,
1615        'schema'       => "exif",
1616      ),
1617      'exif:GPSImgDirection' => Array(
1618        'gpsTag'       => 0x0011,
1619        'implemented'  => true,
1620        'translatable' => false,
1621        'type'         => self::TYPE_SIMPLE,
1622        'schema'       => "exif",
1623      ),
1624      'exif:GPSMapDatum' => Array(
1625        'gpsTag'       => 0x0012,
1626        'implemented'  => true,
1627        'translatable' => false,
1628        'type'         => self::TYPE_SIMPLE,
1629        'schema'       => "exif",
1630      ),
1631      'exif:GPSDestLatitude' => Array(
1632        'gpsTag'       => 0xFFFF,  // combination of tags 0x14 & 0x13
1633        'implemented'  => true,
1634        'translatable' => false,
1635        'type'         => self::TYPE_SIMPLE,
1636        'schema'       => "exif",
1637      ),
1638      'exif:GPSDestLongitude' => Array(
1639        'gpsTag'       => 0xFFFF,  // combination of tags 0x16 & 0x15
1640        'implemented'  => true,
1641        'translatable' => false,
1642        'type'         => self::TYPE_SIMPLE,
1643        'schema'       => "exif",
1644      ),
1645      'exif:GPSDestBearingRef' => Array(
1646        'gpsTag'       => 0x0017,
1647        'implemented'  => true,
1648        'translatable' => false,
1649        'type'         => self::TYPE_SIMPLE,
1650        'schema'       => "exif",
1651      ),
1652      'exif:GPSDestBearing' => Array(
1653        'gpsTag'       => 0x0018,
1654        'implemented'  => true,
1655        'translatable' => false,
1656        'type'         => self::TYPE_SIMPLE,
1657        'schema'       => "exif",
1658      ),
1659      'exif:GPSDestDistanceRef' => Array(
1660        'gpsTag'       => 0x0019,
1661        'implemented'  => true,
1662        'translatable' => false,
1663        'type'         => self::TYPE_SIMPLE,
1664        'schema'       => "exif",
1665      ),
1666      'exif:GPSDestDistance' => Array(
1667        'gpsTag'       => 0x001A,
1668        'implemented'  => true,
1669        'translatable' => false,
1670        'type'         => self::TYPE_SIMPLE,
1671        'schema'       => "exif",
1672      ),
1673      'exif:GPSProcessingMethod' => Array(
1674        'gpsTag'       => 0x001B,
1675        'implemented'  => true,
1676        'translatable' => false,
1677        'type'         => self::TYPE_SIMPLE,
1678        'schema'       => "exif",
1679      ),
1680      'exif:GPSAreaInformation' => Array(
1681        'gpsTag'       => 0x001C,
1682        'implemented'  => true,
1683        'translatable' => false,
1684        'type'         => self::TYPE_SIMPLE,
1685        'schema'       => "exif",
1686      ),
1687      'exif:GPSDifferential' => Array(
1688        'gpsTag'       => 0x001E,
1689        'implemented'  => true,
1690        'translatable' => false,
1691        'type'         => self::TYPE_SIMPLE,
1692        'schema'       => "exif",
1693      ),
1694
1695      /*
1696       * EXIF Schema for Additional EXIF Properties
1697       */
1698      'xmlns:aux' => Array(
1699        'implemented'  => false,
1700        'translatable' => false,
1701        'type'         => self::TYPE_SIMPLE,
1702        'schema'       => "xmlns",
1703      ),
1704      'aux:Lens' => Array(
1705        'implemented'  => false,
1706        'translatable' => false,
1707        'type'         => self::TYPE_SIMPLE,
1708        'schema'       => "aux",
1709      ),
1710      'aux:SerialNumber' => Array(
1711        'implemented'  => false,
1712        'translatable' => false,
1713        'type'         => self::TYPE_SIMPLE,
1714        'schema'       => "aux",
1715      ),
1716
1717
1718      /*
1719       * IPTC Schema
1720       */
1721      'xmlns:Iptc4xmpCore' => Array(
1722        'implemented'  => false,
1723        'translatable' => false,
1724        'type'         => self::TYPE_SIMPLE,
1725        'schema'       => "xmlns",
1726      ),
1727
1728      'Iptc4xmpCore:CountryCode' => Array(
1729        'iptcTag'      => 0x0264,
1730        'implemented'  => true,
1731        'translatable' => false,
1732        'type'         => self::TYPE_SIMPLE,
1733        'schema'       => "Iptc4xmpCore",
1734      ),
1735
1736      'Iptc4xmpCore:IntellectualGenre' => Array(
1737        'iptcTag'      => 0x0204,
1738        'implemented'  => true,
1739        'translatable' => false,
1740        'type'         => self::TYPE_SIMPLE,
1741        'schema'       => "Iptc4xmpCore",
1742      ),
1743
1744      'Iptc4xmpCore:Scene' => Array(
1745        'implemented'  => true,
1746        'translatable' => true,
1747        'type'         => self::TYPE_BAG,
1748        'schema'       => "Iptc4xmpCore",
1749        'tagValues.special' => Array(
1750          '012100' => "posing",
1751          '012000' => "performing",
1752          '011900' => "action",
1753          '011800' => "close-up",
1754          '011700' => "interior view",
1755          '011600' => "exterior view",
1756          '011500' => "satellite",
1757          '011400' => "night scene",
1758          '011300' => "under-water",
1759          '011200' => "aerial view",
1760          '011100' => "panoramic view",
1761          '011000' => "general view",
1762          '010800' => "two",
1763          '010900' => "group",
1764          '010700' => "couple",
1765          '010600' => "single",
1766          '010400' => "profile",
1767          '010500' => "rear view",
1768          '010300' => "full-length",
1769          '010200' => "half-length",
1770          '010100' => "headshot",
1771          '012200' => "symbolic",
1772          '012300' => "off-beat",
1773          '012400' => "movie scene",
1774        )
1775      ),
1776
1777      'Iptc4xmpCore:SubjectCode' => Array(
1778        'iptcTag'      => 0x020C,
1779        'implemented'  => true,
1780        'translatable' => false,
1781        'type'         => self::TYPE_BAG,
1782        'schema'       => "Iptc4xmpCore",
1783      ),
1784
1785      'Iptc4xmpCore:Location' => Array(
1786        'iptcTag'      => 0x025C,
1787        'implemented'  => true,
1788        'translatable' => false,
1789        'type'         => self::TYPE_SIMPLE,
1790        'schema'       => "Iptc4xmpCore",
1791      ),
1792
1793      'Iptc4xmpCore:DateCreated' => Array(
1794        'iptcTag'      => 0x0237,
1795        'implemented'  => false,
1796        'translatable' => false,
1797        'type'         => self::TYPE_SIMPLE,
1798        'schema'       => "Iptc4xmpCore",
1799      ),
1800
1801      /*
1802       * specification says :
1803       * "The IPTC Extension Licensor fields should be used instead of these
1804       * Creator's Contact Info fields if you are using IPTC Extension fields.
1805       * If the creator is also the licensor his or her contact information
1806       * should be provided in the Licensor fields."
1807       */
1808      'Iptc4xmpCore:CreatorContactInfo' => Array(
1809        'implemented'  => false,
1810        'translatable' => false,
1811        'type'         => self::TYPE_SIMPLE,
1812        'schema'       => "Iptc4xmpCore",
1813      ),
1814
1815      'Iptc4xmpCore:CiEmailWork' => Array(
1816        'implemented'  => true,
1817        'translatable' => false,
1818        'type'         => self::TYPE_SIMPLE,
1819        'schema'       => "Iptc4xmpCore",
1820      ),
1821
1822      'Iptc4xmpCore:CiUrlWork' => Array(
1823        'implemented'  => true,
1824        'translatable' => false,
1825        'type'         => self::TYPE_SIMPLE,
1826        'schema'       => "Iptc4xmpCore",
1827      ),
1828
1829      'Iptc4xmpCore:CiTelWork' => Array(
1830        'implemented'  => true,
1831        'translatable' => false,
1832        'type'         => self::TYPE_SIMPLE,
1833        'schema'       => "Iptc4xmpCore",
1834      ),
1835
1836      'Iptc4xmpCore:CiAdrExtadr' => Array(
1837        'implemented'  => true,
1838        'translatable' => false,
1839        'type'         => self::TYPE_SIMPLE,
1840        'schema'       => "Iptc4xmpCore",
1841      ),
1842
1843      'Iptc4xmpCore:CiAdrPcode' => Array(
1844        'implemented'  => true,
1845        'translatable' => false,
1846        'type'         => self::TYPE_SIMPLE,
1847        'schema'       => "Iptc4xmpCore",
1848      ),
1849
1850      'Iptc4xmpCore:CiAdrCity' => Array(
1851        'implemented'  => true,
1852        'translatable' => false,
1853        'type'         => self::TYPE_SIMPLE,
1854        'schema'       => "Iptc4xmpCore",
1855      ),
1856
1857      'Iptc4xmpCore:CiAdrCtry' => Array(
1858        'implemented'  => true,
1859        'translatable' => false,
1860        'type'         => self::TYPE_SIMPLE,
1861        'schema'       => "Iptc4xmpCore",
1862      ),
1863    );
1864
1865    /**
1866     * XmpTags needs a specific constructor, allowing to extract exif & iptc
1867     * properties for some tags
1868     *
1869     */
1870    function __construct()
1871    {
1872      parent::__construct();
1873
1874      $tmpTags=Array(
1875        'exifTag' => new IfdTags(),
1876        'gpsTag'  => new GpsTags(),
1877        'iptcTag' => new IptcTags());
1878      foreach($this->tags as $key => $val)
1879      {
1880        foreach($tmpTags as $schema => $tags)
1881        {
1882          if(array_key_exists($schema, $val))
1883          {
1884            /*
1885             * for all the tags from the exif & tiff schema, try to copy properties
1886             */
1887            if($val[$schema]!=0xFFFF and $tags->tagIdExists($val[$schema]))
1888            {
1889              $tmpTag=$tags->getTagById($val[$schema]);
1890            }
1891            else
1892            {
1893              $tmpTag=NULL;
1894            }
1895
1896
1897            if(!is_null($tmpTag))
1898            {
1899              $this->tags[$key]['tagName'] = $tmpTag['tagName'];
1900
1901              if(array_key_exists('tagValues', $tmpTag))
1902              {
1903                $this->tags[$key]['tagValues'] = $tmpTag['tagValues'];
1904              }
1905
1906              if($val['implemented'] and !$tmpTag['implemented'])
1907              {
1908                $this->tags[$key]['implemented'] = false;
1909              }
1910
1911              unset($tmpTag);
1912            }
1913          }
1914        }
1915      }
1916      unset($tmpTags[0]);
1917      unset($tmpTags[1]);
1918      unset($tmpTags[2]);
1919      unset($tmpTags);
1920    }
1921
1922
1923    function __destruct()
1924    {
1925      parent::__destruct();
1926    }
1927  }
1928
1929
1930?>
Note: See TracBrowser for help on using the repository browser.