summaryrefslogtreecommitdiff
path: root/modules/autorotate/lib/pel/PelExif.php
blob: c07f88d98cba8591e3186dc75b7a3cbb1d5c7767 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<?php

/**
 *  PEL: PHP Exif Library.  A library with support for reading and
 *  writing all Exif headers in JPEG and TIFF images using PHP.
 *
 *  Copyright (C) 2004, 2005  Martin Geisler.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program in the file COPYING; if not, write to the
 *  Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 *  Boston, MA 02110-1301 USA
 */

/* $Id$ */


/**
 * Classes for dealing with Exif data.
 *
 * @author Martin Geisler <mgeisler@users.sourceforge.net>
 * @version $Revision$
 * @date $Date$
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public
 * License (GPL)
 * @package PEL
 */

/**#@+ Required class definitions. */
require_once('PelJpegContent.php');
require_once('PelException.php');
require_once('PelFormat.php');
require_once('PelEntry.php');
require_once('PelTiff.php');
require_once('PelIfd.php');
require_once('PelTag.php');
require_once('Pel.php');
/**#@-*/


/**
 * Class representing Exif data.
 *
 * Exif data resides as {@link PelJpegContent data} and consists of a
 * header followed by a number of {@link PelJpegIfd IFDs}.
 *
 * The interesting method in this class is {@link getTiff()} which
 * will return the {@link PelTiff} object which really holds the data
 * which one normally think of when talking about Exif data.  This is
 * because Exif data is stored as an extension of the TIFF file
 * format.
 *
 * @author Martin Geisler <mgeisler@users.sourceforge.net>
 * @package PEL
 */
class PelExif extends PelJpegContent {

    /**
     * Exif header.
     *
     * The Exif data must start with these six bytes to be considered
     * valid.
     */
    const EXIF_HEADER = "Exif\0\0";

    /**
     * The PelTiff object contained within.
     *
     * @var PelTiff
     */
    private $tiff = null;


    /**
     * Construct a new Exif object.
     *
     * The new object will be empty --- use the {@link load()} method to
     * load Exif data from a {@link PelDataWindow} object, or use the
     * {@link setTiff()} to change the {@link PelTiff} object, which is
     * the true holder of the Exif {@link PelEntry entries}.
     */
    function __construct() {

    }


    /**
     * Load and parse Exif data.
     *
     * This will populate the object with Exif data, contained as a
     * {@link PelTiff} object.  This TIFF object can be accessed with
     * the {@link getTiff()} method.
     */
    function load(PelDataWindow $d) {
        Pel::debug('Parsing %d bytes of Exif data...', $d->getSize());

        /* There must be at least 6 bytes for the Exif header. */
        if ($d->getSize() < 6)
        throw new PelInvalidDataException('Expected at least 6 bytes of Exif ' .
                                        'data, found just %d bytes.',
        $d->getSize());

        /* Verify the Exif header */
        if ($d->strcmp(0, self::EXIF_HEADER)) {
            $d->setWindowStart(strlen(self::EXIF_HEADER));
        } else {
            throw new PelInvalidDataException('Exif header not found.');
        }

        /* The rest of the data is TIFF data. */
        $this->tiff = new PelTiff();
        $this->tiff->load($d);
    }


    /**
     * Change the TIFF information.
     *
     * Exif data is really stored as TIFF data, and this method can be
     * used to change this data from one {@link PelTiff} object to
     * another.
     *
     * @param PelTiff the new TIFF object.
     */
    function setTiff(PelTiff $tiff) {
        $this->tiff = $tiff;
    }


    /**
     * Get the underlying TIFF object.
     *
     * The actual Exif data is stored in a {@link PelTiff} object, and
     * this method provides access to it.
     *
     * @return PelTiff the TIFF object with the Exif data.
     */
    function getTiff() {
        return $this->tiff;
    }


    /**
     * Produce bytes for the Exif data.
     *
     * @return string bytes representing this object.
     */
    function getBytes() {
        return self::EXIF_HEADER . $this->tiff->getBytes();
    }


    /**
     * Return a string representation of this object.
     *
     * @return string a string describing this object.  This is mostly
     * useful for debugging.
     */
    function __toString() {
        return Pel::tra("Dumping Exif data...\n") .
        $this->tiff->__toString();
    }

}