|
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