source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Assets/getid3/module.graphic.jpg.php @ 1300

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

Update the MootoolsFileManager? to the latest cpojer with some modifications.
Add a demo for the MFM examples/mootools-file-manager.php
Change the default config for ImageManager? and ExtendedFileManager? for added security.

File size: 12.3 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.graphic.jpg.php                                      //
11// module for analyzing JPEG Image files                       //
12// dependencies: PHP compiled with --enable-exif (optional)    //
13//               module.tag.xmp.php (optional)                 //
14//                                                            ///
15/////////////////////////////////////////////////////////////////
16
17
18class getid3_jpg
19{
20
21
22        function getid3_jpg(&$fd, &$ThisFileInfo) {
23                $ThisFileInfo['fileformat']                  = 'jpg';
24                $ThisFileInfo['video']['dataformat']         = 'jpg';
25                $ThisFileInfo['video']['lossless']           = false;
26                $ThisFileInfo['video']['bits_per_sample']    = 24;
27                $ThisFileInfo['video']['pixel_aspect_ratio'] = (float) 1;
28
29                fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET);
30
31                $imageinfo = array();
32                list($width, $height, $type) = getid3_lib::GetDataImageSize(fread($fd, $ThisFileInfo['filesize']), $imageinfo);
33
34
35                if (isset($imageinfo['APP13'])) {
36                        // http://php.net/iptcparse
37                        // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/IPTC.html
38                        $iptc_parsed = iptcparse($imageinfo['APP13']);
39                        if (is_array($iptc_parsed)) {
40                                foreach ($iptc_parsed as $iptc_key_raw => $iptc_values) {
41                                        list($iptc_record, $iptc_tagkey) = explode('#', $iptc_key_raw);
42                                        $iptc_tagkey = intval(ltrim($iptc_tagkey, '0'));
43                                        foreach ($iptc_values as $key => $value) {
44                                                $IPTCrecordName = $this->IPTCrecordName($iptc_record);
45                                                $IPTCrecordTagName = $this->IPTCrecordTagName($iptc_record, $iptc_tagkey);
46                                                if (isset($ThisFileInfo['iptc'][$IPTCrecordName][$IPTCrecordTagName])) {
47                                                        $ThisFileInfo['iptc'][$IPTCrecordName][$IPTCrecordTagName][] = $value;
48                                                } else {
49                                                        $ThisFileInfo['iptc'][$IPTCrecordName][$IPTCrecordTagName] = array($value);
50                                                }
51                                        }
52                                }
53                        }
54                }
55
56                $returnOK = false;
57                switch ($type) {
58                        case IMG_JPG:
59                                $ThisFileInfo['video']['resolution_x'] = $width;
60                                $ThisFileInfo['video']['resolution_y'] = $height;
61
62                                if (isset($imageinfo['APP1'])) {
63                                        if (function_exists('exif_read_data')) {
64                                                if (substr($imageinfo['APP1'], 0, 4) == 'Exif') {
65                                                        ob_start();
66                                                        $ThisFileInfo['jpg']['exif'] = exif_read_data($ThisFileInfo['filenamepath'], '', true, false);
67                                                        $errors = ob_get_contents();
68                                                        if ($errors) {
69                                                                $ThisFileInfo['warning'][] = strip_tags($errors);
70                                                                //unset($ThisFileInfo['jpg']['exif']);
71                                                        }
72                                                        ob_end_clean();
73                                                } else {
74                                                        $ThisFileInfo['warning'][] = 'exif_read_data() cannot parse non-EXIF data in APP1 (expected "Exif", found "'.substr($imageinfo['APP1'], 0, 4).'")';
75                                                }
76                                        } else {
77                                                $ThisFileInfo['warning'][] = 'EXIF parsing only available when '.(GETID3_OS_ISWINDOWS ? 'php_exif.dll enabled' : 'compiled with --enable-exif');
78                                        }
79                                }
80                                $returnOK = true;
81                                break;
82
83                        default:
84                                break;
85                }
86
87
88                $cast_as_appropriate_keys = array('EXIF', 'IFD0', 'THUMBNAIL');
89                foreach ($cast_as_appropriate_keys as $exif_key) {
90                        if (isset($ThisFileInfo['jpg']['exif'][$exif_key])) {
91                                foreach ($ThisFileInfo['jpg']['exif'][$exif_key] as $key => $value) {
92                                        $ThisFileInfo['jpg']['exif'][$exif_key][$key] = $this->CastAsAppropriate($value);
93                                }
94                        }
95                }
96
97
98                if (isset($ThisFileInfo['jpg']['exif']['GPS'])) {
99
100                        if (isset($ThisFileInfo['jpg']['exif']['GPS']['GPSVersion'])) {
101                                for ($i = 0; $i < 4; $i++) {
102                                        $version_subparts[$i] = ord(substr($ThisFileInfo['jpg']['exif']['GPS']['GPSVersion'], $i, 1));
103                                }
104                                $ThisFileInfo['jpg']['exif']['GPS']['computed']['version'] = 'v'.implode('.', $version_subparts);
105                        }
106
107                        if (isset($ThisFileInfo['jpg']['exif']['GPS']['GPSDateStamp'])) {
108                                $explodedGPSDateStamp = explode(':', $ThisFileInfo['jpg']['exif']['GPS']['GPSDateStamp']);
109                                $computed_time[5] = (isset($explodedGPSDateStamp[0]) ? $explodedGPSDateStamp[0] : '');
110                                $computed_time[3] = (isset($explodedGPSDateStamp[1]) ? $explodedGPSDateStamp[1] : '');
111                                $computed_time[4] = (isset($explodedGPSDateStamp[2]) ? $explodedGPSDateStamp[2] : '');
112
113                                if (function_exists('date_default_timezone_set')) {
114                                        date_default_timezone_set('UTC');
115                                } else {
116                                        ini_set('date.timezone', 'UTC');
117                                }
118
119                                $computed_time = array(0=>0, 1=>0, 2=>0, 3=>0, 4=>0, 5=>0);
120                                if (isset($ThisFileInfo['jpg']['exif']['GPS']['GPSTimeStamp']) && is_array($ThisFileInfo['jpg']['exif']['GPS']['GPSTimeStamp'])) {
121                                        foreach ($ThisFileInfo['jpg']['exif']['GPS']['GPSTimeStamp'] as $key => $value) {
122                                                $computed_time[$key] = getid3_lib::DecimalizeFraction($value);
123                                        }
124                                }
125                                $ThisFileInfo['jpg']['exif']['GPS']['computed']['timestamp'] = mktime($computed_time[0], $computed_time[1], $computed_time[2], $computed_time[3], $computed_time[4], $computed_time[5]);
126                        }
127
128                        if (isset($ThisFileInfo['jpg']['exif']['GPS']['GPSLatitude']) && is_array($ThisFileInfo['jpg']['exif']['GPS']['GPSLatitude'])) {
129                                $direction_multiplier = ((isset($ThisFileInfo['jpg']['exif']['GPS']['GPSLatitudeRef']) && ($ThisFileInfo['jpg']['exif']['GPS']['GPSLatitudeRef'] == 'S')) ? -1 : 1);
130                                foreach ($ThisFileInfo['jpg']['exif']['GPS']['GPSLatitude'] as $key => $value) {
131                                        $computed_latitude[$key] = getid3_lib::DecimalizeFraction($value);
132                                }
133                                $ThisFileInfo['jpg']['exif']['GPS']['computed']['latitude'] = $direction_multiplier * ($computed_latitude[0] + ($computed_latitude[1] / 60) + ($computed_latitude[2] / 3600));
134                        }
135
136                        if (isset($ThisFileInfo['jpg']['exif']['GPS']['GPSLongitude']) && is_array($ThisFileInfo['jpg']['exif']['GPS']['GPSLongitude'])) {
137                                $direction_multiplier = ((isset($ThisFileInfo['jpg']['exif']['GPS']['GPSLongitudeRef']) && ($ThisFileInfo['jpg']['exif']['GPS']['GPSLongitudeRef'] == 'W')) ? -1 : 1);
138                                foreach ($ThisFileInfo['jpg']['exif']['GPS']['GPSLongitude'] as $key => $value) {
139                                        $computed_longitude[$key] = getid3_lib::DecimalizeFraction($value);
140                                }
141                                $ThisFileInfo['jpg']['exif']['GPS']['computed']['longitude'] = $direction_multiplier * ($computed_longitude[0] + ($computed_longitude[1] / 60) + ($computed_longitude[2] / 3600));
142                        }
143
144                        if (isset($ThisFileInfo['jpg']['exif']['GPS']['GPSAltitude'])) {
145                                $direction_multiplier = ((isset($ThisFileInfo['jpg']['exif']['GPS']['GPSAltitudeRef']) && ($ThisFileInfo['jpg']['exif']['GPS']['GPSAltitudeRef'] === chr(1))) ? -1 : 1);
146                                $ThisFileInfo['jpg']['exif']['GPS']['computed']['altitude'] = $direction_multiplier * getid3_lib::DecimalizeFraction($ThisFileInfo['jpg']['exif']['GPS']['GPSAltitude']);
147                        }
148
149                }
150
151
152                if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.xmp.php', __FILE__, false)) {
153                        if (isset($ThisFileInfo['filenamepath'])) {
154                                $image_xmp = new Image_XMP($ThisFileInfo['filenamepath']);
155                                $xmp_raw = $image_xmp->getAllTags();
156                                foreach ($xmp_raw as $key => $value) {
157                                        list($subsection, $tagname) = explode(':', $key);
158                                        $ThisFileInfo['xmp'][$subsection][$tagname] = $this->CastAsAppropriate($value);
159                                }
160                        }
161                }
162
163                if (!$returnOK) {
164                        unset($ThisFileInfo['fileformat']);
165                        return false;
166                }
167                return true;
168        }
169
170
171        function CastAsAppropriate($value) {
172                if (is_array($value)) {
173                        return $value;
174                } elseif (preg_match('#^[0-9]+/[0-9]+$#', $value)) {
175                        return getid3_lib::DecimalizeFraction($value);
176                } elseif (preg_match('#^[0-9]+$#', $value)) {
177                        return getid3_lib::CastAsInt($value);
178                } elseif (preg_match('#^[0-9\.]+$#', $value)) {
179                        return (float) $value;
180                }
181                return $value;
182        }
183
184
185        function IPTCrecordName($iptc_record) {
186                // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/IPTC.html
187                static $IPTCrecordName = array();
188                if (empty($IPTCrecordName)) {
189                        $IPTCrecordName = array(
190                                1 => 'IPTCEnvelope',
191                                2 => 'IPTCApplication',
192                                3 => 'IPTCNewsPhoto',
193                                7 => 'IPTCPreObjectData',
194                                8 => 'IPTCObjectData',
195                                9 => 'IPTCPostObjectData',
196                        );
197                }
198                return (isset($IPTCrecordName[$iptc_record]) ? $IPTCrecordName[$iptc_record] : '');
199        }
200
201
202        function IPTCrecordTagName($iptc_record, $iptc_tagkey) {
203                // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/IPTC.html
204                static $IPTCrecordTagName = array();
205                if (empty($IPTCrecordTagName)) {
206                        $IPTCrecordTagName = array(
207                                1 => array( // IPTC EnvelopeRecord Tags
208                                        0   => 'EnvelopeRecordVersion',
209                                        5   => 'Destination',
210                                        20  => 'FileFormat',
211                                        22  => 'FileVersion',
212                                        30  => 'ServiceIdentifier',
213                                        40  => 'EnvelopeNumber',
214                                        50  => 'ProductID',
215                                        60  => 'EnvelopePriority',
216                                        70  => 'DateSent',
217                                        80  => 'TimeSent',
218                                        90  => 'CodedCharacterSet',
219                                        100 => 'UniqueObjectName',
220                                        120 => 'ARMIdentifier',
221                                        122 => 'ARMVersion',
222                                ),
223                                2 => array( // IPTC ApplicationRecord Tags
224                                        0   => 'ApplicationRecordVersion',
225                                        3   => 'ObjectTypeReference',
226                                        4   => 'ObjectAttributeReference',
227                                        5   => 'ObjectName',
228                                        7   => 'EditStatus',
229                                        8   => 'EditorialUpdate',
230                                        10  => 'Urgency',
231                                        12  => 'SubjectReference',
232                                        15  => 'Category',
233                                        20  => 'SupplementalCategories',
234                                        22  => 'FixtureIdentifier',
235                                        25  => 'Keywords',
236                                        26  => 'ContentLocationCode',
237                                        27  => 'ContentLocationName',
238                                        30  => 'ReleaseDate',
239                                        35  => 'ReleaseTime',
240                                        37  => 'ExpirationDate',
241                                        38  => 'ExpirationTime',
242                                        40  => 'SpecialInstructions',
243                                        42  => 'ActionAdvised',
244                                        45  => 'ReferenceService',
245                                        47  => 'ReferenceDate',
246                                        50  => 'ReferenceNumber',
247                                        55  => 'DateCreated',
248                                        60  => 'TimeCreated',
249                                        62  => 'DigitalCreationDate',
250                                        63  => 'DigitalCreationTime',
251                                        65  => 'OriginatingProgram',
252                                        70  => 'ProgramVersion',
253                                        75  => 'ObjectCycle',
254                                        80  => 'By-line',
255                                        85  => 'By-lineTitle',
256                                        90  => 'City',
257                                        92  => 'Sub-location',
258                                        95  => 'Province-State',
259                                        100 => 'Country-PrimaryLocationCode',
260                                        101 => 'Country-PrimaryLocationName',
261                                        103 => 'OriginalTransmissionReference',
262                                        105 => 'Headline',
263                                        110 => 'Credit',
264                                        115 => 'Source',
265                                        116 => 'CopyrightNotice',
266                                        118 => 'Contact',
267                                        120 => 'Caption-Abstract',
268                                        121 => 'LocalCaption',
269                                        122 => 'Writer-Editor',
270                                        125 => 'RasterizedCaption',
271                                        130 => 'ImageType',
272                                        131 => 'ImageOrientation',
273                                        135 => 'LanguageIdentifier',
274                                        150 => 'AudioType',
275                                        151 => 'AudioSamplingRate',
276                                        152 => 'AudioSamplingResolution',
277                                        153 => 'AudioDuration',
278                                        154 => 'AudioOutcue',
279                                        184 => 'JobID',
280                                        185 => 'MasterDocumentID',
281                                        186 => 'ShortDocumentID',
282                                        187 => 'UniqueDocumentID',
283                                        188 => 'OwnerID',
284                                        200 => 'ObjectPreviewFileFormat',
285                                        201 => 'ObjectPreviewFileVersion',
286                                        202 => 'ObjectPreviewData',
287                                        221 => 'Prefs',
288                                        225 => 'ClassifyState',
289                                        228 => 'SimilarityIndex',
290                                        230 => 'DocumentNotes',
291                                        231 => 'DocumentHistory',
292                                        232 => 'ExifCameraInfo',
293                                ),
294                                3 => array( // IPTC NewsPhoto Tags
295                                        0   => 'NewsPhotoVersion',
296                                        10  => 'IPTCPictureNumber',
297                                        20  => 'IPTCImageWidth',
298                                        30  => 'IPTCImageHeight',
299                                        40  => 'IPTCPixelWidth',
300                                        50  => 'IPTCPixelHeight',
301                                        55  => 'SupplementalType',
302                                        60  => 'ColorRepresentation',
303                                        64  => 'InterchangeColorSpace',
304                                        65  => 'ColorSequence',
305                                        66  => 'ICC_Profile',
306                                        70  => 'ColorCalibrationMatrix',
307                                        80  => 'LookupTable',
308                                        84  => 'NumIndexEntries',
309                                        85  => 'ColorPalette',
310                                        86  => 'IPTCBitsPerSample',
311                                        90  => 'SampleStructure',
312                                        100 => 'ScanningDirection',
313                                        102 => 'IPTCImageRotation',
314                                        110 => 'DataCompressionMethod',
315                                        120 => 'QuantizationMethod',
316                                        125 => 'EndPoints',
317                                        130 => 'ExcursionTolerance',
318                                        135 => 'BitsPerComponent',
319                                        140 => 'MaximumDensityRange',
320                                        145 => 'GammaCompensatedValue',
321                                ),
322                                7 => array( // IPTC PreObjectData Tags
323                                        10  => 'SizeMode',
324                                        20  => 'MaxSubfileSize',
325                                        90  => 'ObjectSizeAnnounced',
326                                        95  => 'MaximumObjectSize',
327                                ),
328                                8 => array( // IPTC ObjectData Tags
329                                        10  => 'SubFile',
330                                ),
331                                9 => array( // IPTC PostObjectData Tags
332                                        10  => 'ConfirmedObjectSize',
333                                ),
334                        );
335
336                }
337                return (isset($IPTCrecordTagName[$iptc_record][$iptc_tagkey]) ? $IPTCrecordTagName[$iptc_record][$iptc_tagkey] : $iptc_tagkey);
338        }
339
340}
341
342
343?>
Note: See TracBrowser for help on using the repository browser.