source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Assets/getid3/module.tag.xmp.php @ 1302

Last change on this file since 1302 was 1302, checked in by gogo, 8 years ago

Updates to http://www.github.com/sleemanj/mootools-filemanager from GerHoblett?

http://www.github.com/GerHoblett/

Changes to said updates by gogo (sleemanj @ github)

Modifications to MootoolsFileManager? to work with those updates, some courtesy of GerHoblett?, some sleemanj

GerHoblett? provided a large diff which accomplished the goal in a quite different way. It has merit, however I have opted for a less-affecting path in so far as Xinha's "way" is concerned, namely, not splitting the config for a single plugin into several calls to backend config passing functions which seemed a little cumbersome.

Instead I take the option of using POST to send backend data around, at the minor expense of an extra round trip when displaying thumbnails (for each one). This could be reduced by checking for thumbnail existence and returning the thumbnail name directly in "onView" rather than the backend request to generate said thumbnail.

Still to do, is to make the preview pane thumbnail also work.


File size: 19.9 KB
Line 
1<?php
2/////////////////////////////////////////////////////////////////
3/// getID3() by James Heinrich <info@getid3.org>               //
4//  available at http://getid3.sourceforge.net                 //
5//            or http://www.getid3.org                         //
6/////////////////////////////////////////////////////////////////
7// See readme.txt for more details                             //
8/////////////////////////////////////////////////////////////////
9//                                                             //
10// module.tag.xmp.php                                          //
11// module for analyzing XMP metadata (e.g. in JPEG files)      //
12// dependencies: NONE                                          //
13//                                                             //
14/////////////////////////////////////////////////////////////////
15//                                                             //
16// Module originally written [2009-Mar-26] by                  //
17//      Nigel Barnes <ngbarnesØhotmail*com>                    //
18// Bundled into getID3 with permission                         //
19//   called by getID3 in module.graphic.jpg.php                //
20//                                                            ///
21/////////////////////////////////////////////////////////////////
22
23/**************************************************************************************************
24 * SWISScenter Source                                                              Nigel Barnes
25 *
26 *      Provides functions for reading information from the 'APP1' Extensible Metadata
27 *      Platform (XMP) segment of JPEG format files.
28 *      This XMP segment is XML based and contains the Resource Description Framework (RDF)
29 *      data, which itself can contain the Dublin Core Metadata Initiative (DCMI) information.
30 *
31 *      This code uses segments from the JPEG Metadata Toolkit project by Evan Hunter.
32 *************************************************************************************************/
33class Image_XMP
34{
35        /**
36        * @var string
37        * The name of the image file that contains the XMP fields to extract and modify.
38        * @see Image_XMP()
39        */
40        var $_sFilename = null;
41
42        /**
43        * @var array
44        * The XMP fields that were extracted from the image or updated by this class.
45        * @see getAllTags()
46        */
47        var $_aXMP = array();
48
49        /**
50        * @var boolean
51        * True if an APP1 segment was found to contain XMP metadata.
52        * @see isValid()
53        */
54        var $_bXMPParse = false;
55
56        /**
57        * Returns the status of XMP parsing during instantiation
58        *
59        * You'll normally want to call this method before trying to get XMP fields.
60        *
61        * @return boolean
62        * Returns true if an APP1 segment was found to contain XMP metadata.
63        */
64        function isValid()
65        {
66                return $this->_bXMPParse;
67        }
68
69        /**
70        * Get a copy of all XMP tags extracted from the image
71        *
72        * @return array - An array of XMP fields as it extracted by the XMPparse() function
73        */
74        function getAllTags()
75        {
76                return $this->_aXMP;
77        }
78
79        /**
80        * Reads all the JPEG header segments from an JPEG image file into an array
81        *
82        * @param string $filename - the filename of the JPEG file to read
83        * @return array $headerdata - Array of JPEG header segments
84        * @return boolean FALSE - if headers could not be read
85        */
86        function _get_jpeg_header_data($filename)
87        {
88                // prevent refresh from aborting file operations and hosing file
89                ignore_user_abort(true);
90
91                // Attempt to open the jpeg file - the at symbol supresses the error message about
92                // not being able to open files. The file_exists would have been used, but it
93                // does not work with files fetched over http or ftp.
94                ob_start();
95                $filehnd = fopen($filename, 'rb');
96                $errormessage = ob_get_contents();
97                ob_end_clean();
98
99                // Check if the file opened successfully
100                if (!$filehnd)
101                {
102                        // Could't open the file - exit
103                        echo '<p>Could not open file '.htmlentities($filename).'</p>'."\n";
104                        return false;
105                }
106
107                // Read the first two characters
108                $data = fread($filehnd, 2);
109
110                // Check that the first two characters are 0xFF 0xD8  (SOI - Start of image)
111                if ($data != "\xFF\xD8")
112                {
113                        // No SOI (FF D8) at start of file - This probably isn't a JPEG file - close file and return;
114                        echo '<p>This probably is not a JPEG file</p>'."\n";
115                        fclose($filehnd);
116                        return false;
117                }
118
119                // Read the third character
120                $data = fread($filehnd, 2);
121
122                // Check that the third character is 0xFF (Start of first segment header)
123                if ($data{0} != "\xFF")
124                {
125                        // NO FF found - close file and return - JPEG is probably corrupted
126                        fclose($filehnd);
127                        return false;
128                }
129
130                // Flag that we havent yet hit the compressed image data
131                $hit_compressed_image_data = false;
132
133                // Cycle through the file until, one of: 1) an EOI (End of image) marker is hit,
134                //                                       2) we have hit the compressed image data (no more headers are allowed after data)
135                //                                       3) or end of file is hit
136
137                while (($data{1} != "\xD9") && (!$hit_compressed_image_data) && (!feof($filehnd)))
138                {
139                        // Found a segment to look at.
140                        // Check that the segment marker is not a Restart marker - restart markers don't have size or data after them
141                        if ((ord($data{1}) < 0xD0) || (ord($data{1}) > 0xD7))
142                        {
143                                // Segment isn't a Restart marker
144                                // Read the next two bytes (size)
145                                $sizestr = fread($filehnd, 2);
146
147                                // convert the size bytes to an integer
148                                $decodedsize = unpack('nsize', $sizestr);
149
150                                // Save the start position of the data
151                                $segdatastart = ftell($filehnd);
152
153                                // Read the segment data with length indicated by the previously read size
154                                if ($decodedsize['size'] - 2 > 0)       // [i_a] bugfix
155                                {
156                                        $segdata = fread($filehnd, $decodedsize['size'] - 2);
157                                }
158                                else
159                                {
160                                        $segdata = null;
161                                }
162
163                                // Store the segment information in the output array
164                                $headerdata[] = array(
165                                        'SegType'      => ord($data{1}),
166                                        'SegName'      => $GLOBALS['JPEG_Segment_Names'][ord($data{1})],
167                                        'SegDataStart' => $segdatastart,
168                                        'SegData'      => $segdata,
169                                );
170                        }
171
172                        // If this is a SOS (Start Of Scan) segment, then there is no more header data - the compressed image data follows
173                        if ($data{1} == "\xDA")
174                        {
175                                // Flag that we have hit the compressed image data - exit loop as no more headers available.
176                                $hit_compressed_image_data = true;
177                        }
178                        else
179                        {
180                                // Not an SOS - Read the next two bytes - should be the segment marker for the next segment
181                                $data = fread($filehnd, 2);
182
183                                // Check that the first byte of the two is 0xFF as it should be for a marker
184                                if ($data{0} != "\xFF")
185                                {
186                                        // NO FF found - close file and return - JPEG is probably corrupted
187                                        fclose($filehnd);
188                                        return false;
189                                }
190                        }
191                }
192
193                // Close File
194                fclose($filehnd);
195                // Alow the user to abort from now on
196                ignore_user_abort(false);
197
198                // Return the header data retrieved
199                return $headerdata;
200        }
201
202
203        /**
204        * Retrieves XMP information from an APP1 JPEG segment and returns the raw XML text as a string.
205        *
206        * @param string $filename - the filename of the JPEG file to read
207        * @return string $xmp_data - the string of raw XML text
208        * @return boolean FALSE - if an APP 1 XMP segment could not be found, or if an error occured
209        */
210        function _get_XMP_text($filename)
211        {
212                //Get JPEG header data
213                $jpeg_header_data = $this->_get_jpeg_header_data($filename);
214
215                //Cycle through the header segments
216                for ($i = 0; $i < count($jpeg_header_data); $i++)
217                {
218                        // If we find an APP1 header,
219                        if (strcmp($jpeg_header_data[$i]['SegName'], 'APP1') == 0)
220                        {
221                                // And if it has the Adobe XMP/RDF label (http://ns.adobe.com/xap/1.0/\x00) ,
222                                if (strncmp($jpeg_header_data[$i]['SegData'], 'http://ns.adobe.com/xap/1.0/'."\x00", 29) == 0)
223                                {
224                                        // Found a XMP/RDF block
225                                        // Return the XMP text
226                                        $xmp_data = substr($jpeg_header_data[$i]['SegData'], 29);
227
228                                        return $xmp_data;
229                                }
230                        }
231                }
232                return false;
233        }
234
235        /**
236        * Parses a string containing XMP data (XML), and returns an array
237        * which contains all the XMP (XML) information.
238        *
239        * @param string $xml_text - a string containing the XMP data (XML) to be parsed
240        * @return array $xmp_array - an array containing all xmp details retrieved.
241        * @return boolean FALSE - couldn't parse the XMP data
242        */
243        function read_XMP_array_from_text($xmltext)
244        {
245                // Check if there actually is any text to parse
246                if (trim($xmltext) == '')
247                {
248                        return false;
249                }
250
251                // Create an instance of a xml parser to parse the XML text
252                $xml_parser = xml_parser_create('UTF-8');
253
254                // Change: Fixed problem that caused the whitespace (especially newlines) to be destroyed when converting xml text to an xml array, as of revision 1.10
255
256                // We would like to remove unneccessary white space, but this will also
257                // remove things like newlines (&#xA;) in the XML values, so white space
258                // will have to be removed later
259                if (xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 0) == false)
260                {
261                        // Error setting case folding - destroy the parser and return
262                        xml_parser_free($xml_parser);
263                        return false;
264                }
265
266                // to use XML code correctly we have to turn case folding
267                // (uppercasing) off. XML is case sensitive and upper
268                // casing is in reality XML standards violation
269                if (xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0) == false)
270                {
271                        // Error setting case folding - destroy the parser and return
272                        xml_parser_free($xml_parser);
273                        return false;
274                }
275
276                // Parse the XML text into a array structure
277                if (xml_parse_into_struct($xml_parser, $xmltext, $values, $tags) == 0)
278                {
279                        // Error Parsing XML - destroy the parser and return
280                        xml_parser_free($xml_parser);
281                        return false;
282                }
283
284                // Destroy the xml parser
285                xml_parser_free($xml_parser);
286
287                // Clear the output array
288                $xmp_array = array();
289
290                // The XMP data has now been parsed into an array ...
291
292                // Cycle through each of the array elements
293                $current_property = ''; // current property being processed
294                $container_index = -1; // -1 = no container open, otherwise index of container content
295                foreach ($values as $xml_elem)
296                {
297                        // Syntax and Class names
298                        switch ($xml_elem['tag'])
299                        {
300                                case 'x:xmpmeta':
301                                        // only defined attribute is x:xmptk written by Adobe XMP Toolkit; value is the version of the toolkit
302                                        break;
303
304                                case 'rdf:RDF':
305                                        // required element immediately within x:xmpmeta; no data here
306                                        break;
307
308                                case 'rdf:Description':
309                                        switch ($xml_elem['type'])
310                                        {
311                                                case 'open':
312                                                case 'complete':
313                                                        if (array_key_exists('attributes', $xml_elem))
314                                                        {
315                                                                // rdf:Description may contain wanted attributes
316                                                                foreach (array_keys($xml_elem['attributes']) as $key)
317                                                                {
318                                                                        // Check whether we want this details from this attribute
319                                                                        if (in_array($key, $GLOBALS['XMP_tag_captions']))
320                                                                        {
321                                                                                // Attribute wanted
322                                                                                $xmp_array[$key] = $xml_elem['attributes'][$key];
323                                                                        }
324                                                                }
325                                                        }
326                                                case 'cdata':
327                                                case 'close':
328                                                        break;
329                                        }
330
331                                case 'rdf:ID':
332                                case 'rdf:nodeID':
333                                        // Attributes are ignored
334                                        break;
335
336                                case 'rdf:li':
337                                        // Property member
338                                        if ($xml_elem['type'] == 'complete')
339                                        {
340                                                if (array_key_exists('attributes', $xml_elem))
341                                                {
342                                                        // If Lang Alt (language alternatives) then ensure we take the default language
343                                                        if (empty($xml_elem['attributes']['xml:lang']) || $xml_elem['attributes']['xml:lang'] != 'x-default')  // [i_a] crash fix
344                                                        {
345                                                                break;
346                                                        }
347                                                }
348                                                if ($current_property != '' && isset($xml_elem['value']))  // [i_a]
349                                                {
350                                                        $xmp_array[$current_property][$container_index] = $xml_elem['value'];
351                                                        $container_index += 1;
352                                                }
353                                        //else unidentified attribute!!
354                                        }
355                                        break;
356
357                                case 'rdf:Seq':
358                                case 'rdf:Bag':
359                                case 'rdf:Alt':
360                                        // Container found
361                                        switch ($xml_elem['type'])
362                                        {
363                                                case 'open':
364                                                        $container_index = 0;
365                                                        break;
366                                                case 'close':
367                                                        $container_index = -1;
368                                                        break;
369                                                case 'cdata':
370                                                        break;
371                                        }
372                                        break;
373
374                                default:
375                                        // Check whether we want the details from this attribute
376                                        if (in_array($xml_elem['tag'], $GLOBALS['XMP_tag_captions']))
377                                        {
378                                                switch ($xml_elem['type'])
379                                                {
380                                                        case 'open':
381                                                                // open current element
382                                                                $current_property = $xml_elem['tag'];
383                                                                break;
384
385                                                        case 'close':
386                                                                // close current element
387                                                                $current_property = '';
388                                                                break;
389
390                                                        case 'complete':
391                                                                // store attribute value
392                                                                $xmp_array[$xml_elem['tag']] = (isset($xml_elem['value']) ? $xml_elem['value'] : '');
393                                                                break;
394
395                                                        case 'cdata':
396                                                                // ignore
397                                                                break;
398                                                }
399                                        }
400                                        break;
401                        }
402
403                }
404                return $xmp_array;
405        }
406
407
408        /**
409        * Constructor
410        *
411        * @param string - Name of the image file to access and extract XMP information from.
412        */
413        function Image_XMP($sFilename)
414        {
415                $this->_sFilename = $sFilename;
416
417                if (is_file($this->_sFilename))
418                {
419                        // Get XMP data
420                        $xmp_data = $this->_get_XMP_text($sFilename);
421                        if ($xmp_data)
422                        {
423                                $this->_aXMP = $this->read_XMP_array_from_text($xmp_data);
424                                $this->_bXMPParse = true;
425                        }
426                }
427        }
428
429}
430
431/**
432* Global Variable: XMP_tag_captions
433*
434* The Property names of all known XMP fields.
435* Note: this is a full list with unrequired properties commented out.
436*/
437$GLOBALS['XMP_tag_captions'] = array(
438// IPTC Core
439        'Iptc4xmpCore:CiAdrCity',
440        'Iptc4xmpCore:CiAdrCtry',
441        'Iptc4xmpCore:CiAdrExtadr',
442        'Iptc4xmpCore:CiAdrPcode',
443        'Iptc4xmpCore:CiAdrRegion',
444        'Iptc4xmpCore:CiEmailWork',
445        'Iptc4xmpCore:CiTelWork',
446        'Iptc4xmpCore:CiUrlWork',
447        'Iptc4xmpCore:CountryCode',
448        'Iptc4xmpCore:CreatorContactInfo',
449        'Iptc4xmpCore:IntellectualGenre',
450        'Iptc4xmpCore:Location',
451        'Iptc4xmpCore:Scene',
452        'Iptc4xmpCore:SubjectCode',
453// Dublin Core Schema
454        'dc:contributor',
455        'dc:coverage',
456        'dc:creator',
457        'dc:date',
458        'dc:description',
459        'dc:format',
460        'dc:identifier',
461        'dc:language',
462        'dc:publisher',
463        'dc:relation',
464        'dc:rights',
465        'dc:source',
466        'dc:subject',
467        'dc:title',
468        'dc:type',
469// XMP Basic Schema
470        'xmp:Advisory',
471        'xmp:BaseURL',
472        'xmp:CreateDate',
473        'xmp:CreatorTool',
474        'xmp:Identifier',
475        'xmp:Label',
476        'xmp:MetadataDate',
477        'xmp:ModifyDate',
478        'xmp:Nickname',
479        'xmp:Rating',
480        'xmp:Thumbnails',
481        'xmpidq:Scheme',
482// XMP Rights Management Schema
483        'xmpRights:Certificate',
484        'xmpRights:Marked',
485        'xmpRights:Owner',
486        'xmpRights:UsageTerms',
487        'xmpRights:WebStatement',
488// These are not in spec but Photoshop CS seems to use them
489        'xap:Advisory',
490        'xap:BaseURL',
491        'xap:CreateDate',
492        'xap:CreatorTool',
493        'xap:Identifier',
494        'xap:MetadataDate',
495        'xap:ModifyDate',
496        'xap:Nickname',
497        'xap:Rating',
498        'xap:Thumbnails',
499        'xapidq:Scheme',
500        'xapRights:Certificate',
501        'xapRights:Copyright',
502        'xapRights:Marked',
503        'xapRights:Owner',
504        'xapRights:UsageTerms',
505        'xapRights:WebStatement',
506// XMP Media Management Schema
507        'xapMM:DerivedFrom',
508        'xapMM:DocumentID',
509        'xapMM:History',
510        'xapMM:InstanceID',
511        'xapMM:ManagedFrom',
512        'xapMM:Manager',
513        'xapMM:ManageTo',
514        'xapMM:ManageUI',
515        'xapMM:ManagerVariant',
516        'xapMM:RenditionClass',
517        'xapMM:RenditionParams',
518        'xapMM:VersionID',
519        'xapMM:Versions',
520        'xapMM:LastURL',
521        'xapMM:RenditionOf',
522        'xapMM:SaveID',
523// XMP Basic Job Ticket Schema
524        'xapBJ:JobRef',
525// XMP Paged-Text Schema
526        'xmpTPg:MaxPageSize',
527        'xmpTPg:NPages',
528        'xmpTPg:Fonts',
529        'xmpTPg:Colorants',
530        'xmpTPg:PlateNames',
531// Adobe PDF Schema
532        'pdf:Keywords',
533        'pdf:PDFVersion',
534        'pdf:Producer',
535// Photoshop Schema
536        'photoshop:AuthorsPosition',
537        'photoshop:CaptionWriter',
538        'photoshop:Category',
539        'photoshop:City',
540        'photoshop:Country',
541        'photoshop:Credit',
542        'photoshop:DateCreated',
543        'photoshop:Headline',
544        'photoshop:History',
545// Not in XMP spec
546        'photoshop:Instructions',
547        'photoshop:Source',
548        'photoshop:State',
549        'photoshop:SupplementalCategories',
550        'photoshop:TransmissionReference',
551        'photoshop:Urgency',
552// EXIF Schemas
553        'tiff:ImageWidth',
554        'tiff:ImageLength',
555        'tiff:BitsPerSample',
556        'tiff:Compression',
557        'tiff:PhotometricInterpretation',
558        'tiff:Orientation',
559        'tiff:SamplesPerPixel',
560        'tiff:PlanarConfiguration',
561        'tiff:YCbCrSubSampling',
562        'tiff:YCbCrPositioning',
563        'tiff:XResolution',
564        'tiff:YResolution',
565        'tiff:ResolutionUnit',
566        'tiff:TransferFunction',
567        'tiff:WhitePoint',
568        'tiff:PrimaryChromaticities',
569        'tiff:YCbCrCoefficients',
570        'tiff:ReferenceBlackWhite',
571        'tiff:DateTime',
572        'tiff:ImageDescription',
573        'tiff:Make',
574        'tiff:Model',
575        'tiff:Software',
576        'tiff:Artist',
577        'tiff:Copyright',
578        'exif:ExifVersion',
579        'exif:FlashpixVersion',
580        'exif:ColorSpace',
581        'exif:ComponentsConfiguration',
582        'exif:CompressedBitsPerPixel',
583        'exif:PixelXDimension',
584        'exif:PixelYDimension',
585        'exif:MakerNote',
586        'exif:UserComment',
587        'exif:RelatedSoundFile',
588        'exif:DateTimeOriginal',
589        'exif:DateTimeDigitized',
590        'exif:ExposureTime',
591        'exif:FNumber',
592        'exif:ExposureProgram',
593        'exif:SpectralSensitivity',
594        'exif:ISOSpeedRatings',
595        'exif:OECF',
596        'exif:ShutterSpeedValue',
597        'exif:ApertureValue',
598        'exif:BrightnessValue',
599        'exif:ExposureBiasValue',
600        'exif:MaxApertureValue',
601        'exif:SubjectDistance',
602        'exif:MeteringMode',
603        'exif:LightSource',
604        'exif:Flash',
605        'exif:FocalLength',
606        'exif:SubjectArea',
607        'exif:FlashEnergy',
608        'exif:SpatialFrequencyResponse',
609        'exif:FocalPlaneXResolution',
610        'exif:FocalPlaneYResolution',
611        'exif:FocalPlaneResolutionUnit',
612        'exif:SubjectLocation',
613        'exif:SensingMethod',
614        'exif:FileSource',
615        'exif:SceneType',
616        'exif:CFAPattern',
617        'exif:CustomRendered',
618        'exif:ExposureMode',
619        'exif:WhiteBalance',
620        'exif:DigitalZoomRatio',
621        'exif:FocalLengthIn35mmFilm',
622        'exif:SceneCaptureType',
623        'exif:GainControl',
624        'exif:Contrast',
625        'exif:Saturation',
626        'exif:Sharpness',
627        'exif:DeviceSettingDescription',
628        'exif:SubjectDistanceRange',
629        'exif:ImageUniqueID',
630        'exif:GPSVersionID',
631        'exif:GPSLatitude',
632        'exif:GPSLongitude',
633        'exif:GPSAltitudeRef',
634        'exif:GPSAltitude',
635        'exif:GPSTimeStamp',
636        'exif:GPSSatellites',
637        'exif:GPSStatus',
638        'exif:GPSMeasureMode',
639        'exif:GPSDOP',
640        'exif:GPSSpeedRef',
641        'exif:GPSSpeed',
642        'exif:GPSTrackRef',
643        'exif:GPSTrack',
644        'exif:GPSImgDirectionRef',
645        'exif:GPSImgDirection',
646        'exif:GPSMapDatum',
647        'exif:GPSDestLatitude',
648        'exif:GPSDestLongitude',
649        'exif:GPSDestBearingRef',
650        'exif:GPSDestBearing',
651        'exif:GPSDestDistanceRef',
652        'exif:GPSDestDistance',
653        'exif:GPSProcessingMethod',
654        'exif:GPSAreaInformation',
655        'exif:GPSDifferential',
656        'stDim:w',
657        'stDim:h',
658        'stDim:unit',
659        'xapGImg:height',
660        'xapGImg:width',
661        'xapGImg:format',
662        'xapGImg:image',
663        'stEvt:action',
664        'stEvt:instanceID',
665        'stEvt:parameters',
666        'stEvt:softwareAgent',
667        'stEvt:when',
668        'stRef:instanceID',
669        'stRef:documentID',
670        'stRef:versionID',
671        'stRef:renditionClass',
672        'stRef:renditionParams',
673        'stRef:manager',
674        'stRef:managerVariant',
675        'stRef:manageTo',
676        'stRef:manageUI',
677        'stVer:comments',
678        'stVer:event',
679        'stVer:modifyDate',
680        'stVer:modifier',
681        'stVer:version',
682        'stJob:name',
683        'stJob:id',
684        'stJob:url',
685// Exif Flash
686        'exif:Fired',
687        'exif:Return',
688        'exif:Mode',
689        'exif:Function',
690        'exif:RedEyeMode',
691// Exif OECF/SFR
692        'exif:Columns',
693        'exif:Rows',
694        'exif:Names',
695        'exif:Values',
696// Exif CFAPattern
697        'exif:Columns',
698        'exif:Rows',
699        'exif:Values',
700// Exif DeviceSettings
701        'exif:Columns',
702        'exif:Rows',
703        'exif:Settings',
704);
705
706
707/**
708* Global Variable: JPEG_Segment_Names
709*
710* The names of the JPEG segment markers, indexed by their marker number
711*/
712$GLOBALS['JPEG_Segment_Names'] = array(
713        0x01 => 'TEM',
714        0x02 => 'RES',
715        0xC0 => 'SOF0',
716        0xC1 => 'SOF1',
717        0xC2 => 'SOF2',
718        0xC3 => 'SOF4',
719        0xC4 => 'DHT',
720        0xC5 => 'SOF5',
721        0xC6 => 'SOF6',
722        0xC7 => 'SOF7',
723        0xC8 => 'JPG',
724        0xC9 => 'SOF9',
725        0xCA => 'SOF10',
726        0xCB => 'SOF11',
727        0xCC => 'DAC',
728        0xCD => 'SOF13',
729        0xCE => 'SOF14',
730        0xCF => 'SOF15',
731        0xD0 => 'RST0',
732        0xD1 => 'RST1',
733        0xD2 => 'RST2',
734        0xD3 => 'RST3',
735        0xD4 => 'RST4',
736        0xD5 => 'RST5',
737        0xD6 => 'RST6',
738        0xD7 => 'RST7',
739        0xD8 => 'SOI',
740        0xD9 => 'EOI',
741        0xDA => 'SOS',
742        0xDB => 'DQT',
743        0xDC => 'DNL',
744        0xDD => 'DRI',
745        0xDE => 'DHP',
746        0xDF => 'EXP',
747        0xE0 => 'APP0',
748        0xE1 => 'APP1',
749        0xE2 => 'APP2',
750        0xE3 => 'APP3',
751        0xE4 => 'APP4',
752        0xE5 => 'APP5',
753        0xE6 => 'APP6',
754        0xE7 => 'APP7',
755        0xE8 => 'APP8',
756        0xE9 => 'APP9',
757        0xEA => 'APP10',
758        0xEB => 'APP11',
759        0xEC => 'APP12',
760        0xED => 'APP13',
761        0xEE => 'APP14',
762        0xEF => 'APP15',
763        0xF0 => 'JPG0',
764        0xF1 => 'JPG1',
765        0xF2 => 'JPG2',
766        0xF3 => 'JPG3',
767        0xF4 => 'JPG4',
768        0xF5 => 'JPG5',
769        0xF6 => 'JPG6',
770        0xF7 => 'JPG7',
771        0xF8 => 'JPG8',
772        0xF9 => 'JPG9',
773        0xFA => 'JPG10',
774        0xFB => 'JPG11',
775        0xFC => 'JPG12',
776        0xFD => 'JPG13',
777        0xFE => 'COM',
778);
779
780?>
Note: See TracBrowser for help on using the repository browser.