4 * PEL: PHP Exif Library. A library with support for reading and
5 * writing all Exif headers in JPEG and TIFF images using PHP.
7 * Copyright (C) 2005, 2006 Martin Geisler.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program in the file COPYING; if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
22 * Boston, MA 02110-1301 USA
26 use lsolesen\pel\PelJpeg;
28 class OlympusC50zTest extends \PHPUnit_Framework_TestCase
31 public function testRead()
33 Pel::clearExceptions();
34 Pel::setStrictParsing(false);
35 $jpeg = new PelJpeg(dirname(__FILE__) . '/olympus-c50z.jpg');
37 $exif = $jpeg->getExif();
38 $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
40 $tiff = $exif->getTiff();
41 $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
44 $ifd0 = $tiff->getIfd();
45 $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
47 /* Start of IDF $ifd0. */
48 $this->assertEquals(count($ifd0->getEntries()), 11);
50 $entry = $ifd0->getEntry(270); // ImageDescription
51 $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
52 $this->assertEquals($entry->getValue(), 'OLYMPUS DIGITAL CAMERA ');
53 $this->assertEquals($entry->getText(), 'OLYMPUS DIGITAL CAMERA ');
55 $entry = $ifd0->getEntry(271); // Make
56 $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
57 $this->assertEquals($entry->getValue(), 'OLYMPUS OPTICAL CO.,LTD');
58 $this->assertEquals($entry->getText(), 'OLYMPUS OPTICAL CO.,LTD');
60 $entry = $ifd0->getEntry(272); // Model
61 $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
62 $this->assertEquals($entry->getValue(), 'X-2,C-50Z ');
63 $this->assertEquals($entry->getText(), 'X-2,C-50Z ');
65 $entry = $ifd0->getEntry(274); // Orientation
66 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
67 $this->assertEquals($entry->getValue(), 1);
68 $this->assertEquals($entry->getText(), 'top - left');
70 $entry = $ifd0->getEntry(282); // XResolution
71 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
72 $this->assertEquals($entry->getValue(), array(
76 $this->assertEquals($entry->getText(), '144/1');
78 $entry = $ifd0->getEntry(283); // YResolution
79 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
80 $this->assertEquals($entry->getValue(), array(
84 $this->assertEquals($entry->getText(), '144/1');
86 $entry = $ifd0->getEntry(296); // ResolutionUnit
87 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
88 $this->assertEquals($entry->getValue(), 2);
89 $this->assertEquals($entry->getText(), 'Inch');
91 $entry = $ifd0->getEntry(305); // Software
92 $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
93 $this->assertEquals($entry->getValue(), '28-1012 ');
94 $this->assertEquals($entry->getText(), '28-1012 ');
96 $entry = $ifd0->getEntry(306); // DateTime
97 $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
98 $this->assertEquals($entry->getValue(), false);
99 $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
101 $entry = $ifd0->getEntry(531); // YCbCrPositioning
102 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
103 $this->assertEquals($entry->getValue(), 2);
104 $this->assertEquals($entry->getText(), 'co-sited');
106 $entry = $ifd0->getEntry(50341); // PrintIM
107 $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
108 $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x14\0\x01\0\x12\0\x12\0\x02\0\x01\0\0\0\x03\0\x88\0\0\0\x07\0\0\0\0\0\x08\0\0\0\0\0\x09\0\0\0\0\0\x0a\0\0\0\0\0\x0b\0\xd0\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xe8\0\0\0\0\x01\x01\0\0\0\x01\x01\xff\0\0\0\x02\x01\x80\0\0\0\x03\x01\x80\0\0\0\x04\x01\x80\0\0\0\x05\x01\x80\0\0\0\x06\x01\x80\0\0\0\x07\x01\x80\x80\x80\0\x10\x01\x80\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x97\x05\0\0\x10\x27\0\0\xb0\x08\0\0\x10\x27\0\0\x01\x1c\0\0\x10\x27\0\0\x5e\x02\0\0\x10\x27\0\0\x8b\0\0\0\x10\x27\0\0\xcb\x03\0\0\x10\x27\0\0\xe5\x1b\0\0\x10\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
109 $this->assertEquals($entry->getValue(), $expected);
110 $this->assertEquals($entry->getText(), '(undefined)');
112 /* Sub IFDs of $ifd0. */
113 $this->assertEquals(count($ifd0->getSubIfds()), 1);
114 $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
115 $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
117 /* Start of IDF $ifd0_0. */
118 $this->assertEquals(count($ifd0_0->getEntries()), 30);
120 $entry = $ifd0_0->getEntry(33434); // ExposureTime
121 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
122 $this->assertEquals($entry->getValue(), array(
126 $this->assertEquals($entry->getText(), '1/80 sec.');
128 $entry = $ifd0_0->getEntry(33437); // FNumber
129 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
130 $this->assertEquals($entry->getValue(), array(
134 $this->assertEquals($entry->getText(), 'f/4.5');
136 $entry = $ifd0_0->getEntry(34850); // ExposureProgram
137 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
138 $this->assertEquals($entry->getValue(), 5);
139 $this->assertEquals($entry->getText(), 'Creative program (biased toward depth of field)');
141 $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
142 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
143 $this->assertEquals($entry->getValue(), 80);
144 $this->assertEquals($entry->getText(), '80');
146 $entry = $ifd0_0->getEntry(36864); // ExifVersion
147 $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
148 $this->assertEquals($entry->getValue(), 2.2);
149 $this->assertEquals($entry->getText(), 'Exif Version 2.2');
151 $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
152 $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
153 $this->assertEquals($entry->getValue(), false);
154 $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
156 $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
157 $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
158 $this->assertEquals($entry->getValue(), false);
159 $this->assertEquals($entry->getText(), '0000:00:00 00:00:00');
161 $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
162 $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
163 $this->assertEquals($entry->getValue(), "\x01\x02\x03\0");
164 $this->assertEquals($entry->getText(), 'Y Cb Cr -');
166 $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
167 $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
168 $this->assertEquals($entry->getValue(), array(
172 $this->assertEquals($entry->getText(), '0.0');
174 $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
175 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
176 $this->assertEquals($entry->getValue(), array(
180 $this->assertEquals($entry->getText(), '300/100');
182 $entry = $ifd0_0->getEntry(37383); // MeteringMode
183 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
184 $this->assertEquals($entry->getValue(), 5);
185 $this->assertEquals($entry->getText(), 'Pattern');
187 $entry = $ifd0_0->getEntry(37384); // LightSource
188 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
189 $this->assertEquals($entry->getValue(), 0);
190 $this->assertEquals($entry->getText(), 'Unknown');
192 $entry = $ifd0_0->getEntry(37385); // Flash
193 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
194 $this->assertEquals($entry->getValue(), 25);
195 $this->assertEquals($entry->getText(), 'Flash fired, auto mode.');
197 $entry = $ifd0_0->getEntry(37386); // FocalLength
198 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
199 $this->assertEquals($entry->getValue(), array(
203 $this->assertEquals($entry->getText(), '18.8 mm');
205 $entry = $ifd0_0->getEntry(37500); // MakerNote
206 $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
207 $expected = "\x4f\x4c\x59\x4d\x50\0\x01\0\x3e\0\0\x02\x04\0\x03\0\0\0\x24\x0f\0\0\x01\x02\x03\0\x01\0\0\0\x02\0\0\0\x02\x02\x03\0\x01\0\0\0\0\0\0\0\x03\x02\x03\0\x01\0\0\0\0\0\0\0\x04\x02\x05\0\x01\0\0\0\x38\x0f\0\0\x05\x02\x05\0\x01\0\0\0\x40\x0f\0\0\x06\x02\x08\0\x06\0\0\0\x48\x0f\0\0\x07\x02\x02\0\x06\0\0\0\x54\x0f\0\0\x09\x02\x07\0\x20\0\0\0\x5a\x0f\0\0\0\x10\x0a\0\x01\0\0\0\x7c\x0f\0\0\x01\x10\x0a\0\x01\0\0\0\x84\x0f\0\0\x02\x10\x0a\0\x01\0\0\0\x8c\x0f\0\0\x03\x10\x0a\0\x01\0\0\0\x94\x0f\0\0\x04\x10\x03\0\x01\0\0\0\0\0\0\0\x05\x10\x03\0\x02\0\0\0\0\0\0\0\x06\x10\x0a\0\x01\0\0\0\xa4\x0f\0\0\x09\x10\x03\0\x01\0\0\0\x01\0\0\0\x0a\x10\x03\0\x01\0\0\0\0\0\0\0\x0b\x10\x03\0\x01\0\0\0\0\0\0\0\x0c\x10\x05\0\x01\0\0\0\xb8\x0f\0\0\x0d\x10\x03\0\x01\0\0\0\x1c\0\x51\x01\x0e\x10\x03\0\x01\0\0\0\x51\x01\x02\0\x0f\x10\x03\0\x01\0\0\0\x02\0\0\0\x10\x10\x03\0\x01\0\0\0\0\0\0\0\x11\x10\x03\0\x09\0\0\0\x36\x10\0\0\x12\x10\x03\0\x04\0\0\0\x48\x10\0\0\x13\x10\x03\0\x01\0\0\0\0\0\0\0\x14\x10\x03\0\x01\0\0\0\0\0\x01\0\x15\x10\x03\0\x02\0\0\0\x01\0\0\0\x16\x10\x03\0\x01\0\0\0\0\0\x70\x01\x17\x10\x03\0\x02\0\0\0\x70\x01\x40\0\x18\x10\x03\0\x02\0\0\0\x26\x01\x40\0\x1a\x10\x02\0\x20\0\0\0\xdc\x0f\0\0\x1b\x10\x04\0\x01\0\0\0\0\0\0\0\x1c\x10\x04\0\x01\0\0\0\0\0\0\0\x1d\x10\x04\0\x01\0\0\0\xe8\xb8\x03\0\x1e\x10\x04\0\x01\0\0\0\0\0\0\0\x1f\x10\x04\0\x01\0\0\0\0\0\0\0\x20\x10\x04\0\x01\0\0\0\0\0\0\0\x21\x10\x04\0\x01\0\0\0\xb0\x27\0\0\x22\x10\x04\0\x01\0\0\0\x20\x6e\x0f\x04\x23\x10\x0a\0\x01\0\0\0\x1c\x10\0\0\x24\x10\x03\0\x01\0\0\0\x36\0\0\0\x25\x10\x0a\0\x01\0\0\0\x28\x10\0\0\x26\x10\x03\0\x01\0\0\0\0\0\0\0\x27\x10\x03\0\x01\0\0\0\0\0\0\0\x28\x10\x03\0\x01\0\0\0\0\0\x64\x01\x29\x10\x03\0\x01\0\0\0\x02\0\0\x02\x2a\x10\x03\0\x01\0\0\0\0\x02\x18\0\x2b\x10\x03\0\x06\0\0\0\x54\x10\0\0\x2c\x10\x03\0\x02\0\0\0\x0a\0\0\0\x2d\x10\x03\0\x01\0\0\0\0\x08\0\0\x2e\x10\x04\0\x01\0\0\0\0\x0a\0\0\x2f\x10\x04\0\x01\0\0\0\x80\x07\0\0\x30\x10\x03\0\x01\0\0\0\x02\0\0\0\x31\x10\x04\0\x08\0\0\0\x74\x10\0\0\x33\x10\x04\0\xd0\x02\0\0\xa0\x10\0\0\x38\x10\x03\0\x01\0\0\0\0\0\0\0\x3b\x10\x03\0\x01\0\0\0\x21\x01\xbe\x01\x3c\x10\x03\0\x01\0\0\0\xbe\x01\0\0\x3d\x10\x0a\0\x01\0\0\0\xe4\x1b\0\0\x3e\x10\x0a\0\x01\0\0\0\xec\x1b\0\0\0\0\0\0";
208 $this->assertEquals($entry->getValue(), $expected);
209 $this->assertEquals($entry->getText(), '758 bytes unknown MakerNote data');
211 $entry = $ifd0_0->getEntry(37510); // UserComment
212 $this->assertInstanceOf('lsolesen\pel\PelEntryUserComment', $entry);
213 $this->assertEquals($entry->getValue(), ' ');
214 $this->assertEquals($entry->getText(), ' ');
216 $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
217 $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
218 $this->assertEquals($entry->getValue(), 1);
219 $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
221 $entry = $ifd0_0->getEntry(40961); // ColorSpace
222 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
223 $this->assertEquals($entry->getValue(), 1);
224 $this->assertEquals($entry->getText(), 'sRGB');
226 $entry = $ifd0_0->getEntry(40962); // PixelXDimension
227 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
228 $this->assertEquals($entry->getValue(), 2560);
229 $this->assertEquals($entry->getText(), '2560');
231 $entry = $ifd0_0->getEntry(40963); // PixelYDimension
232 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
233 $this->assertEquals($entry->getValue(), 1920);
234 $this->assertEquals($entry->getText(), '1920');
236 $entry = $ifd0_0->getEntry(41728); // FileSource
237 $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
238 $this->assertEquals($entry->getValue(), "\x03");
239 $this->assertEquals($entry->getText(), 'DSC');
241 $entry = $ifd0_0->getEntry(41985); // CustomRendered
242 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
243 $this->assertEquals($entry->getValue(), 0);
244 $this->assertEquals($entry->getText(), 'Normal process');
246 $entry = $ifd0_0->getEntry(41986); // ExposureMode
247 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
248 $this->assertEquals($entry->getValue(), 0);
249 $this->assertEquals($entry->getText(), 'Auto exposure');
251 $entry = $ifd0_0->getEntry(41987); // WhiteBalance
252 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
253 $this->assertEquals($entry->getValue(), 0);
254 $this->assertEquals($entry->getText(), 'Auto white balance');
256 $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
257 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
258 $this->assertEquals($entry->getValue(), array(
262 $this->assertEquals($entry->getText(), '100/100');
264 $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
265 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
266 $this->assertEquals($entry->getValue(), 2);
267 $this->assertEquals($entry->getText(), 'Portrait');
269 $entry = $ifd0_0->getEntry(41991); // GainControl
270 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
271 $this->assertEquals($entry->getValue(), 0);
272 $this->assertEquals($entry->getText(), 'Normal');
274 $entry = $ifd0_0->getEntry(41992); // Contrast
275 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
276 $this->assertEquals($entry->getValue(), 0);
277 $this->assertEquals($entry->getText(), 'Normal');
279 $entry = $ifd0_0->getEntry(41993); // Saturation
280 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
281 $this->assertEquals($entry->getValue(), 0);
282 $this->assertEquals($entry->getText(), 'Normal');
284 $entry = $ifd0_0->getEntry(41994); // Sharpness
285 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
286 $this->assertEquals($entry->getValue(), 0);
287 $this->assertEquals($entry->getText(), 'Normal');
289 /* Sub IFDs of $ifd0_0. */
290 $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
291 $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
292 $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
294 /* Start of IDF $ifd0_0_0. */
295 $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
297 $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
298 $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
299 $this->assertEquals($entry->getValue(), 'R98');
300 $this->assertEquals($entry->getText(), 'R98');
302 $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
303 $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
304 $this->assertEquals($entry->getValue(), 1);
305 $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
307 /* Sub IFDs of $ifd0_0_0. */
308 $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
310 $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
313 $ifd0_0_1 = $ifd0_0_0->getNextIfd();
314 $this->assertNull($ifd0_0_1);
315 /* End of IFD $ifd0_0_0. */
317 $this->assertEquals($ifd0_0->getThumbnailData(), '');
320 $ifd0_1 = $ifd0_0->getNextIfd();
321 $this->assertNull($ifd0_1);
322 /* End of IFD $ifd0_0. */
324 $this->assertEquals($ifd0->getThumbnailData(), '');
327 $ifd1 = $ifd0->getNextIfd();
328 $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
329 /* End of IFD $ifd0. */
331 /* Start of IDF $ifd1. */
332 $this->assertEquals(count($ifd1->getEntries()), 4);
334 $entry = $ifd1->getEntry(259); // Compression
335 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
336 $this->assertEquals($entry->getValue(), 6);
337 $this->assertEquals($entry->getText(), 'JPEG compression');
339 $entry = $ifd1->getEntry(282); // XResolution
340 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
341 $this->assertEquals($entry->getValue(), array(
345 $this->assertEquals($entry->getText(), '72/1');
347 $entry = $ifd1->getEntry(283); // YResolution
348 $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
349 $this->assertEquals($entry->getValue(), array(
353 $this->assertEquals($entry->getText(), '72/1');
355 $entry = $ifd1->getEntry(296); // ResolutionUnit
356 $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
357 $this->assertEquals($entry->getValue(), 2);
358 $this->assertEquals($entry->getText(), 'Inch');
360 /* Sub IFDs of $ifd1. */
361 $this->assertEquals(count($ifd1->getSubIfds()), 0);
363 $thumb_data = file_get_contents(dirname(__FILE__) . '/olympus-c50z-thumb.jpg');
364 $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
367 $ifd2 = $ifd1->getNextIfd();
368 $this->assertNull($ifd2);
369 /* End of IFD $ifd1. */
371 $this->assertTrue(count(Pel::getExceptions()) == 0);