3699f903fda734118b16f11ed2d5c11c959c23fa
[yaffs-website] / test / image-tests / LeicaDLuxTest.php
1 <?php
2
3 /*
4  * PEL: PHP Exif Library. A library with support for reading and
5  * writing all Exif headers in JPEG and TIFF images using PHP.
6  *
7  * Copyright (C) 2005, 2006 Martin Geisler.
8  *
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.
13  *
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.
18  *
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
23  */
24
25 use lsolesen\pel\Pel;
26 use lsolesen\pel\PelJpeg;
27
28 class LeicaDLuxTest extends \PHPUnit_Framework_TestCase
29 {
30     public function testRead()
31     {
32         Pel::clearExceptions();
33         Pel::setStrictParsing(false);
34         $jpeg = new PelJpeg(dirname(__FILE__) . '/leica-d-lux.jpg');
35
36         $exif = $jpeg->getExif();
37         $this->assertInstanceOf('lsolesen\pel\PelExif', $exif);
38
39         $tiff = $exif->getTiff();
40         $this->assertInstanceOf('lsolesen\pel\PelTiff', $tiff);
41
42         /* The first IFD. */
43         $ifd0 = $tiff->getIfd();
44         $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0);
45
46         /* Start of IDF $ifd0. */
47         $this->assertEquals(count($ifd0->getEntries()), 10);
48
49         $entry = $ifd0->getEntry(271); // Make
50         $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
51         $this->assertEquals($entry->getValue(), 'LEICA');
52         $this->assertEquals($entry->getText(), 'LEICA');
53
54         $entry = $ifd0->getEntry(272); // Model
55         $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
56         $this->assertEquals($entry->getValue(), 'D-LUX');
57         $this->assertEquals($entry->getText(), 'D-LUX');
58
59         $entry = $ifd0->getEntry(274); // Orientation
60         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
61         $this->assertEquals($entry->getValue(), 1);
62         $this->assertEquals($entry->getText(), 'top - left');
63
64         $entry = $ifd0->getEntry(282); // XResolution
65         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
66         $this->assertEquals($entry->getValue(), array(
67             0 => 72,
68             1 => 1
69         ));
70         $this->assertEquals($entry->getText(), '72/1');
71
72         $entry = $ifd0->getEntry(283); // YResolution
73         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
74         $this->assertEquals($entry->getValue(), array(
75             0 => 72,
76             1 => 1
77         ));
78         $this->assertEquals($entry->getText(), '72/1');
79
80         $entry = $ifd0->getEntry(296); // ResolutionUnit
81         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
82         $this->assertEquals($entry->getValue(), 2);
83         $this->assertEquals($entry->getText(), 'Inch');
84
85         $entry = $ifd0->getEntry(305); // Software
86         $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
87         $this->assertEquals($entry->getValue(), 'Ver1.06');
88         $this->assertEquals($entry->getText(), 'Ver1.06');
89
90         $entry = $ifd0->getEntry(306); // DateTime
91         $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
92         $this->assertEquals($entry->getValue(), 1099994128);
93         $this->assertEquals($entry->getText(), '2004:11:09 09:55:28');
94
95         $entry = $ifd0->getEntry(531); // YCbCrPositioning
96         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
97         $this->assertEquals($entry->getValue(), 2);
98         $this->assertEquals($entry->getText(), 'co-sited');
99
100         $entry = $ifd0->getEntry(50341); // PrintIM
101         $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
102         $expected = "\x50\x72\x69\x6e\x74\x49\x4d\0\x30\x32\x35\x30\0\0\x0e\0\x01\0\x16\0\x16\0\x02\0\0\0\0\0\x03\0\x64\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\xac\0\0\0\x0c\0\0\0\0\0\x0d\0\0\0\0\0\x0e\0\xc4\0\0\0\0\x01\x05\0\0\0\x01\x01\x01\0\0\0\x10\x01\x80\0\0\0\x09\x11\0\0\x10\x27\0\0\x0b\x0f\0\0\x10\x27\0\0\x37\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";
103         $this->assertEquals($entry->getValue(), $expected);
104         $this->assertEquals($entry->getText(), '(undefined)');
105
106         /* Sub IFDs of $ifd0. */
107         $this->assertEquals(count($ifd0->getSubIfds()), 1);
108         $ifd0_0 = $ifd0->getSubIfd(2); // IFD Exif
109         $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0);
110
111         /* Start of IDF $ifd0_0. */
112         $this->assertEquals(count($ifd0_0->getEntries()), 37);
113
114         $entry = $ifd0_0->getEntry(33434); // ExposureTime
115         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
116         $this->assertEquals($entry->getValue(), array(
117             0 => 10,
118             1 => 1000
119         ));
120         $this->assertEquals($entry->getText(), '1/100 sec.');
121
122         $entry = $ifd0_0->getEntry(33437); // FNumber
123         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
124         $this->assertEquals($entry->getValue(), array(
125             0 => 97,
126             1 => 10
127         ));
128         $this->assertEquals($entry->getText(), 'f/9.7');
129
130         $entry = $ifd0_0->getEntry(34850); // ExposureProgram
131         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
132         $this->assertEquals($entry->getValue(), 2);
133         $this->assertEquals($entry->getText(), 'Normal program');
134
135         $entry = $ifd0_0->getEntry(34855); // ISOSpeedRatings
136         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
137         $this->assertEquals($entry->getValue(), 100);
138         $this->assertEquals($entry->getText(), '100');
139
140         $entry = $ifd0_0->getEntry(36864); // ExifVersion
141         $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
142         $this->assertEquals($entry->getValue(), 2.2);
143         $this->assertEquals($entry->getText(), 'Exif Version 2.2');
144
145         $entry = $ifd0_0->getEntry(36867); // DateTimeOriginal
146         $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
147         $this->assertEquals($entry->getValue(), 1099994128);
148         $this->assertEquals($entry->getText(), '2004:11:09 09:55:28');
149
150         $entry = $ifd0_0->getEntry(36868); // DateTimeDigitized
151         $this->assertInstanceOf('lsolesen\pel\PelEntryTime', $entry);
152         $this->assertEquals($entry->getValue(), 1099994128);
153         $this->assertEquals($entry->getText(), '2004:11:09 09:55:28');
154
155         $entry = $ifd0_0->getEntry(37121); // ComponentsConfiguration
156         $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
157         $this->assertEquals($entry->getValue(), "\x01\x02\x03\0" . '');
158         $this->assertEquals($entry->getText(), 'Y Cb Cr -');
159
160         $entry = $ifd0_0->getEntry(37122); // CompressedBitsPerPixel
161         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
162         $this->assertEquals($entry->getValue(), array(
163             0 => 21,
164             1 => 10
165         ));
166         $this->assertEquals($entry->getText(), '21/10');
167
168         $entry = $ifd0_0->getEntry(37377); // ShutterSpeedValue
169         $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
170         $this->assertEquals($entry->getValue(), array(
171             0 => 6644,
172             1 => 1000
173         ));
174         $this->assertEquals($entry->getText(), '6644/1000 sec. (APEX: 10)');
175
176         $entry = $ifd0_0->getEntry(37378); // ApertureValue
177         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
178         $this->assertEquals($entry->getValue(), array(
179             0 => 66,
180             1 => 10
181         ));
182         $this->assertEquals($entry->getText(), 'f/9.8');
183
184         $entry = $ifd0_0->getEntry(37380); // ExposureBiasValue
185         $this->assertInstanceOf('lsolesen\pel\PelEntrySRational', $entry);
186         $this->assertEquals($entry->getValue(), array(
187             0 => 0,
188             1 => 100
189         ));
190         $this->assertEquals($entry->getText(), '0.0');
191
192         $entry = $ifd0_0->getEntry(37381); // MaxApertureValue
193         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
194         $this->assertEquals($entry->getValue(), array(
195             0 => 30,
196             1 => 10
197         ));
198         $this->assertEquals($entry->getText(), '30/10');
199
200         $entry = $ifd0_0->getEntry(37383); // MeteringMode
201         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
202         $this->assertEquals($entry->getValue(), 3);
203         $this->assertEquals($entry->getText(), 'Spot');
204
205         $entry = $ifd0_0->getEntry(37384); // LightSource
206         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
207         $this->assertEquals($entry->getValue(), 1);
208         $this->assertEquals($entry->getText(), 'Daylight');
209
210         $entry = $ifd0_0->getEntry(37385); // Flash
211         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
212         $this->assertEquals($entry->getValue(), 24);
213         $this->assertEquals($entry->getText(), 'Flash did not fire, auto mode.');
214
215         $entry = $ifd0_0->getEntry(37386); // FocalLength
216         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
217         $this->assertEquals($entry->getValue(), array(
218             0 => 88,
219             1 => 10
220         ));
221         $this->assertEquals($entry->getText(), '8.8 mm');
222
223         $entry = $ifd0_0->getEntry(37500); // MakerNote
224         $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
225         $expected = "\x4c\x45\x49\x43\x41\0\0\0\x0b\0\x01\0\x03\0\x01\0\0\0\x03\0\0\0\x02\0\x07\0\x04\0\0\0\x30\x31\x30\x30\x03\0\x03\0\x01\0\0\0\x01\0\0\0\x07\0\x03\0\x01\0\0\0\x01\0\0\0\x0f\0\x01\0\x02\0\0\0\0\x10\0\0\x1a\0\x03\0\x01\0\0\0\x02\0\0\0\x1c\0\x03\0\x01\0\0\0\x02\0\0\0\x1f\0\x03\0\x01\0\0\0\x01\0\0\0\x20\0\x03\0\x01\0\0\0\x02\0\0\0\x21\0\x07\0\x72\0\0\0\x5e\x04\0\0\x22\0\x03\0\x01\0\0\0\0\0\0\0\x57\x42\x02\x62\x01\x36\0\xb9\0\x92\0\xa8\0\x8c\0\xdc\0\xa0\0\x4b\x01\x9c\x01\xd5\x02\x3b\x01\x1c\x02\x44\x01\x1d\x0b\xab\x1b\x6c\x16\xb8\0\0\x41\x46\x01\x96\x04\x8e\x20\x06\0\0\x53\x54\0\0\0\0\0\0\x01\x24\0\0\0\0\0\0\0\x05\0\x05\0\0\x41\x45\x06\xa7\0\x4c\0\0\x02\x28\x09\x01\0\x93\x01\x44\0\0\x08\x08\x08\x08\x03\x03\0\0\0\xe0\0\0\x20\x20\0\x0a\0\0\x45\x50\x01\x0a\0\0";
226         $this->assertEquals($entry->getValue(), $expected);
227         $this->assertEquals($entry->getText(), '256 bytes unknown MakerNote data');
228
229         $entry = $ifd0_0->getEntry(40960); // FlashPixVersion
230         $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
231         $this->assertEquals($entry->getValue(), 1);
232         $this->assertEquals($entry->getText(), 'FlashPix Version 1.0');
233
234         $entry = $ifd0_0->getEntry(40961); // ColorSpace
235         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
236         $this->assertEquals($entry->getValue(), 1);
237         $this->assertEquals($entry->getText(), 'sRGB');
238
239         $entry = $ifd0_0->getEntry(40962); // PixelXDimension
240         $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
241         $this->assertEquals($entry->getValue(), 640);
242         $this->assertEquals($entry->getText(), '640');
243
244         $entry = $ifd0_0->getEntry(40963); // PixelYDimension
245         $this->assertInstanceOf('lsolesen\pel\PelEntryLong', $entry);
246         $this->assertEquals($entry->getValue(), 480);
247         $this->assertEquals($entry->getText(), '480');
248
249         $entry = $ifd0_0->getEntry(41495); // SensingMethod
250         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
251         $this->assertEquals($entry->getValue(), 2);
252         $this->assertEquals($entry->getText(), 'One-chip color area sensor');
253
254         $entry = $ifd0_0->getEntry(41728); // FileSource
255         $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
256         $this->assertEquals($entry->getValue(), "\x03");
257         $this->assertEquals($entry->getText(), 'DSC');
258
259         $entry = $ifd0_0->getEntry(41729); // SceneType
260         $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
261         $this->assertEquals($entry->getValue(), "\x01");
262         $this->assertEquals($entry->getText(), 'Directly photographed');
263
264         $entry = $ifd0_0->getEntry(41730); // CFAPattern
265         $this->assertInstanceOf('lsolesen\pel\PelEntryUndefined', $entry);
266         $this->assertEquals($entry->getValue(), "\0\x02\0\x02\0\x01\x01\x02");
267         $this->assertEquals($entry->getText(), '(undefined)');
268
269         $entry = $ifd0_0->getEntry(41985); // CustomRendered
270         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
271         $this->assertEquals($entry->getValue(), 0);
272         $this->assertEquals($entry->getText(), 'Normal process');
273
274         $entry = $ifd0_0->getEntry(41986); // ExposureMode
275         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
276         $this->assertEquals($entry->getValue(), 0);
277         $this->assertEquals($entry->getText(), 'Auto exposure');
278
279         $entry = $ifd0_0->getEntry(41987); // WhiteBalance
280         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
281         $this->assertEquals($entry->getValue(), 0);
282         $this->assertEquals($entry->getText(), 'Auto white balance');
283
284         $entry = $ifd0_0->getEntry(41988); // DigitalZoomRatio
285         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
286         $this->assertEquals($entry->getValue(), array(
287             0 => 0,
288             1 => 10
289         ));
290         $this->assertEquals($entry->getText(), '0/10');
291
292         $entry = $ifd0_0->getEntry(41989); // FocalLengthIn35mmFilm
293         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
294         $this->assertEquals($entry->getValue(), 53);
295         $this->assertEquals($entry->getText(), '53');
296
297         $entry = $ifd0_0->getEntry(41990); // SceneCaptureType
298         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
299         $this->assertEquals($entry->getValue(), 0);
300         $this->assertEquals($entry->getText(), 'Standard');
301
302         $entry = $ifd0_0->getEntry(41991); // GainControl
303         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
304         $this->assertEquals($entry->getValue(), 0);
305         $this->assertEquals($entry->getText(), 'Normal');
306
307         $entry = $ifd0_0->getEntry(41992); // Contrast
308         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
309         $this->assertEquals($entry->getValue(), 0);
310         $this->assertEquals($entry->getText(), 'Normal');
311
312         $entry = $ifd0_0->getEntry(41993); // Saturation
313         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
314         $this->assertEquals($entry->getValue(), 0);
315         $this->assertEquals($entry->getText(), 'Normal');
316
317         $entry = $ifd0_0->getEntry(41994); // Sharpness
318         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
319         $this->assertEquals($entry->getValue(), 0);
320         $this->assertEquals($entry->getText(), 'Normal');
321
322         $entry = $ifd0_0->getEntry(41996); // SubjectDistanceRange
323         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
324         $this->assertEquals($entry->getValue(), 2);
325         $this->assertEquals($entry->getText(), 'Close view');
326
327         /* Sub IFDs of $ifd0_0. */
328         $this->assertEquals(count($ifd0_0->getSubIfds()), 1);
329         $ifd0_0_0 = $ifd0_0->getSubIfd(4); // IFD Interoperability
330         $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd0_0_0);
331
332         /* Start of IDF $ifd0_0_0. */
333         $this->assertEquals(count($ifd0_0_0->getEntries()), 2);
334
335         $entry = $ifd0_0_0->getEntry(1); // InteroperabilityIndex
336         $this->assertInstanceOf('lsolesen\pel\PelEntryAscii', $entry);
337         $this->assertEquals($entry->getValue(), 'R98');
338         $this->assertEquals($entry->getText(), 'R98');
339
340         $entry = $ifd0_0_0->getEntry(2); // InteroperabilityVersion
341         $this->assertInstanceOf('lsolesen\pel\PelEntryVersion', $entry);
342         $this->assertEquals($entry->getValue(), 1);
343         $this->assertEquals($entry->getText(), 'Interoperability Version 1.0');
344
345         /* Sub IFDs of $ifd0_0_0. */
346         $this->assertEquals(count($ifd0_0_0->getSubIfds()), 0);
347
348         $this->assertEquals($ifd0_0_0->getThumbnailData(), '');
349
350         /* Next IFD. */
351         $ifd0_0_1 = $ifd0_0_0->getNextIfd();
352         $this->assertNull($ifd0_0_1);
353         /* End of IFD $ifd0_0_0. */
354
355         $this->assertEquals($ifd0_0->getThumbnailData(), '');
356
357         /* Next IFD. */
358         $ifd0_1 = $ifd0_0->getNextIfd();
359         $this->assertNull($ifd0_1);
360         /* End of IFD $ifd0_0. */
361
362         $this->assertEquals($ifd0->getThumbnailData(), '');
363
364         /* Next IFD. */
365         $ifd1 = $ifd0->getNextIfd();
366         $this->assertInstanceOf('lsolesen\pel\PelIfd', $ifd1);
367         /* End of IFD $ifd0. */
368
369         /* Start of IDF $ifd1. */
370         $this->assertEquals(count($ifd1->getEntries()), 5);
371
372         $entry = $ifd1->getEntry(259); // Compression
373         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
374         $this->assertEquals($entry->getValue(), 6);
375         $this->assertEquals($entry->getText(), 'JPEG compression');
376
377         $entry = $ifd1->getEntry(282); // XResolution
378         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
379         $this->assertEquals($entry->getValue(), array(
380             0 => 72,
381             1 => 1
382         ));
383         $this->assertEquals($entry->getText(), '72/1');
384
385         $entry = $ifd1->getEntry(283); // YResolution
386         $this->assertInstanceOf('lsolesen\pel\PelEntryRational', $entry);
387         $this->assertEquals($entry->getValue(), array(
388             0 => 72,
389             1 => 1
390         ));
391         $this->assertEquals($entry->getText(), '72/1');
392
393         $entry = $ifd1->getEntry(296); // ResolutionUnit
394         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
395         $this->assertEquals($entry->getValue(), 2);
396         $this->assertEquals($entry->getText(), 'Inch');
397
398         $entry = $ifd1->getEntry(531); // YCbCrPositioning
399         $this->assertInstanceOf('lsolesen\pel\PelEntryShort', $entry);
400         $this->assertEquals($entry->getValue(), 2);
401         $this->assertEquals($entry->getText(), 'co-sited');
402
403         /* Sub IFDs of $ifd1. */
404         $this->assertEquals(count($ifd1->getSubIfds()), 0);
405
406         $thumb_data = file_get_contents(dirname(__FILE__) . '/leica-d-lux-thumb.jpg');
407         $this->assertEquals($ifd1->getThumbnailData(), $thumb_data);
408
409         /* Next IFD. */
410         $ifd2 = $ifd1->getNextIfd();
411         $this->assertNull($ifd2);
412         /* End of IFD $ifd1. */
413
414         $this->assertTrue(count(Pel::getExceptions()) == 0);
415     }
416 }