Skip to content

Commit d3366b0

Browse files
committed
Add Exif tag offsets to parsed meta data.
1 parent b649efe commit d3366b0

File tree

2 files changed

+44
-22
lines changed

2 files changed

+44
-22
lines changed

README.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,7 @@ loadImage.parseMetaData(
309309
)
310310
},
311311
{
312-
maxMetaDataSize: 262144,
313-
disableImageHead: false
312+
maxMetaDataSize: 262144
314313
}
315314
)
316315
```
@@ -328,19 +327,26 @@ The Meta data extension also adds additional options used for the
328327
### Exif parser
329328

330329
If you include the Load Image Exif Parser extension, the argument passed to the
331-
callback for **parseMetaData** will contain the additional property **exif** if
332-
Exif data could be found in the given image.
330+
callback for **parseMetaData** will contain the additional properties if Exif
331+
data could be found in the given image:
332+
333+
- **exif**: The parsed Exif tags
334+
- **exifOffsets**: The parsed Exif tag offsets
335+
- **exifTiffOffset**: TIFF header offset (used for offset pointers)
336+
- **exifLittleEndian**: little endian order if true, big endian if false
337+
333338
The **exif** object stores the parsed Exif tags:
334339

335340
```js
336-
var orientation = data.exif[0x0112]
341+
var orientation = data.exif[0x0112] // Orientation
337342
```
338343

339-
It also provides an **exif.get()** method to retrieve the tag value via the
340-
tag's mapped name:
344+
The **exif** and **exifOffsets** objects also provide a **get()** method to
345+
retrieve the tag value/offset via the tag's mapped name:
341346

342347
```js
343348
var orientation = data.exif.get('Orientation')
349+
var orientationOffset = data.exifOffsets.get('Orientation')
344350
```
345351

346352
By default, the only available mapped names are **Orientation** and
@@ -363,6 +369,7 @@ disable certain aspects of the parser:
363369
- **disableExifThumbnail**: Disables parsing of the Exif Thumbnail.
364370
- **disableExifSub**: Disables parsing of the Exif Sub IFD.
365371
- **disableExifGps**: Disables parsing of the Exif GPS Info IFD.
372+
- **disableExifOffsets**: Disables storing Exif tag offsets
366373

367374
### IPTC parser
368375

js/load-image-exif.js

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -171,18 +171,19 @@
171171
dataView,
172172
tiffOffset,
173173
offset,
174-
littleEndian,
175-
data
174+
littleEndian
176175
) {
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+
}
186187
}
187188

188189
loadImage.parseExifTags = function (
@@ -192,7 +193,7 @@
192193
littleEndian,
193194
data
194195
) {
195-
var tagsNumber, dirEndOffset, i
196+
var tagsNumber, dirEndOffset, i, tagOffset, tag
196197
if (dirOffset + 6 > dataView.byteLength) {
197198
console.log('Invalid Exif data: Invalid directory offset.')
198199
return
@@ -204,13 +205,18 @@
204205
return
205206
}
206207
for (i = 0; i < tagsNumber; i += 1) {
207-
this.parseExifTag(
208+
tagOffset = dirOffset + 2 + 12 * i
209+
tag = this.parseExifTag(
208210
dataView,
209211
tiffOffset,
210-
dirOffset + 2 + 12 * i, // tag offset
212+
tagOffset,
211213
littleEndian,
212214
data
213215
)
216+
data.exif[tag.number] = tag.value
217+
if (data.exifOffsets) {
218+
data.exifOffsets[tag.number] = tagOffset
219+
}
214220
}
215221
// Return the offset to the next directory:
216222
return dataView.getUint32(dirEndOffset, littleEndian)
@@ -259,6 +265,11 @@
259265
dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian)
260266
// Create the exif object to store the tags:
261267
data.exif = new loadImage.ExifMap()
268+
if (!options.disableExifOffsets) {
269+
data.exifOffsets = new loadImage.ExifMap()
270+
data.exifTiffOffset = tiffOffset
271+
data.exifLittleEndian = littleEndian
272+
}
262273
// Parse the tags of the main image directory and retrieve the
263274
// offset to the next directory, usually the thumbnail directory:
264275
dirOffset = loadImage.parseExifTags(
@@ -312,11 +323,15 @@
312323
loadImage.metaDataParsers.jpeg[0xffe1].push(loadImage.parseExifData)
313324

314325
// 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
316330

317331
// Adds the following options to the parseMetaData method:
318332
// * disableExif: Disables Exif parsing.
319333
// * disableExifThumbnail: Disables parsing of the Exif Thumbnail.
320334
// * disableExifSub: Disables parsing of the Exif Sub IFD.
321335
// * disableExifGps: Disables parsing of the Exif GPS Info IFD.
336+
// * disableExifOffsets: Disables storing Exif tag offsets
322337
})

0 commit comments

Comments
 (0)