|
171 | 171 | dataView,
|
172 | 172 | tiffOffset,
|
173 | 173 | offset,
|
174 |
| - littleEndian, |
175 |
| - data |
| 174 | + littleEndian |
176 | 175 | ) {
|
177 |
| - var tag = dataView.getUint16(offset, littleEndian) |
178 |
| - data.exif[tag] = loadImage.getExifValue( |
179 |
| - dataView, |
180 |
| - tiffOffset, |
181 |
| - offset, |
182 |
| - dataView.getUint16(offset + 2, littleEndian), // tag type |
183 |
| - dataView.getUint32(offset + 4, littleEndian), // tag length |
184 |
| - littleEndian |
185 |
| - ) |
| 176 | + return { |
| 177 | + number: dataView.getUint16(offset, littleEndian), |
| 178 | + value: loadImage.getExifValue( |
| 179 | + dataView, |
| 180 | + tiffOffset, |
| 181 | + offset, |
| 182 | + dataView.getUint16(offset + 2, littleEndian), // tag type |
| 183 | + dataView.getUint32(offset + 4, littleEndian), // tag length |
| 184 | + littleEndian |
| 185 | + ) |
| 186 | + } |
186 | 187 | }
|
187 | 188 |
|
188 | 189 | loadImage.parseExifTags = function (
|
|
192 | 193 | littleEndian,
|
193 | 194 | data
|
194 | 195 | ) {
|
195 |
| - var tagsNumber, dirEndOffset, i |
| 196 | + var tagsNumber, dirEndOffset, i, tagOffset, tag |
196 | 197 | if (dirOffset + 6 > dataView.byteLength) {
|
197 | 198 | console.log('Invalid Exif data: Invalid directory offset.')
|
198 | 199 | return
|
|
204 | 205 | return
|
205 | 206 | }
|
206 | 207 | for (i = 0; i < tagsNumber; i += 1) {
|
207 |
| - this.parseExifTag( |
| 208 | + tagOffset = dirOffset + 2 + 12 * i |
| 209 | + tag = this.parseExifTag( |
208 | 210 | dataView,
|
209 | 211 | tiffOffset,
|
210 |
| - dirOffset + 2 + 12 * i, // tag offset |
| 212 | + tagOffset, |
211 | 213 | littleEndian,
|
212 | 214 | data
|
213 | 215 | )
|
| 216 | + data.exif[tag.number] = tag.value |
| 217 | + if (data.exifOffsets) { |
| 218 | + data.exifOffsets[tag.number] = tagOffset |
| 219 | + } |
214 | 220 | }
|
215 | 221 | // Return the offset to the next directory:
|
216 | 222 | return dataView.getUint32(dirEndOffset, littleEndian)
|
|
259 | 265 | dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian)
|
260 | 266 | // Create the exif object to store the tags:
|
261 | 267 | data.exif = new loadImage.ExifMap()
|
| 268 | + if (!options.disableExifOffsets) { |
| 269 | + data.exifOffsets = new loadImage.ExifMap() |
| 270 | + data.exifTiffOffset = tiffOffset |
| 271 | + data.exifLittleEndian = littleEndian |
| 272 | + } |
262 | 273 | // Parse the tags of the main image directory and retrieve the
|
263 | 274 | // offset to the next directory, usually the thumbnail directory:
|
264 | 275 | dirOffset = loadImage.parseExifTags(
|
|
312 | 323 | loadImage.metaDataParsers.jpeg[0xffe1].push(loadImage.parseExifData)
|
313 | 324 |
|
314 | 325 | // Adds the following properties to the parseMetaData callback data:
|
315 |
| - // * exif: The exif tags, parsed by the parseExifData method |
| 326 | + // * exif: The parsed Exif tags |
| 327 | + // * exifOffsets: The parsed Exif tag offsets |
| 328 | + // * exifTiffOffset: TIFF header offset (used for offset pointers) |
| 329 | + // * exifLittleEndian: little endian order if true, big endian if false |
316 | 330 |
|
317 | 331 | // Adds the following options to the parseMetaData method:
|
318 | 332 | // * disableExif: Disables Exif parsing.
|
319 | 333 | // * disableExifThumbnail: Disables parsing of the Exif Thumbnail.
|
320 | 334 | // * disableExifSub: Disables parsing of the Exif Sub IFD.
|
321 | 335 | // * disableExifGps: Disables parsing of the Exif GPS Info IFD.
|
| 336 | + // * disableExifOffsets: Disables storing Exif tag offsets |
322 | 337 | })
|
0 commit comments