@digipair/skill-exif 0.82.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs.d.ts +1 -0
- package/index.cjs.js +37 -0
- package/index.d.ts +1 -0
- package/index.esm.js +1274 -0
- package/libs/skill-exif/src/index.d.ts +1 -0
- package/libs/skill-exif/src/lib/skill-exif.d.ts +2 -0
- package/package.json +14 -0
- package/schema.fr.json +34 -0
- package/schema.json +35 -0
package/index.esm.js
ADDED
|
@@ -0,0 +1,1274 @@
|
|
|
1
|
+
/*jslint browser: true, devel: true, bitwise: false, debug: true, eqeq: false, es5: true, evil: false, forin: false, newcap: false, nomen: true, plusplus: true, regexp: false, unparam: false, sloppy: true, stupid: false, sub: false, todo: true, vars: true, white: true */
|
|
2
|
+
|
|
3
|
+
var jpeg$1 = {
|
|
4
|
+
parseSections: function parseSections(stream, iterator) {
|
|
5
|
+
var len, markerType;
|
|
6
|
+
stream.setBigEndian(true);
|
|
7
|
+
//stop reading the stream at the SOS (Start of Stream) marker,
|
|
8
|
+
//because its length is not stored in the header so we can't
|
|
9
|
+
//know where to jump to. The only marker after that is just EOI (End Of Image) anyway
|
|
10
|
+
while(stream.remainingLength() > 0 && markerType !== 0xDA){
|
|
11
|
+
if (stream.nextUInt8() !== 0xFF) {
|
|
12
|
+
throw new Error("Invalid JPEG section offset");
|
|
13
|
+
}
|
|
14
|
+
markerType = stream.nextUInt8();
|
|
15
|
+
//don't read size from markers that have no datas
|
|
16
|
+
if (markerType >= 0xD0 && markerType <= 0xD9 || markerType === 0xDA) {
|
|
17
|
+
len = 0;
|
|
18
|
+
} else {
|
|
19
|
+
len = stream.nextUInt16() - 2;
|
|
20
|
+
}
|
|
21
|
+
iterator(markerType, stream.branch(0, len));
|
|
22
|
+
stream.skip(len);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
//stream should be located after SOF section size and in big endian mode, like passed to parseSections iterator
|
|
26
|
+
getSizeFromSOFSection: function getSizeFromSOFSection(stream) {
|
|
27
|
+
stream.skip(1);
|
|
28
|
+
return {
|
|
29
|
+
height: stream.nextUInt16(),
|
|
30
|
+
width: stream.nextUInt16()
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
getSectionName: function getSectionName(markerType) {
|
|
34
|
+
var name, index;
|
|
35
|
+
switch(markerType){
|
|
36
|
+
case 0xD8:
|
|
37
|
+
name = "SOI";
|
|
38
|
+
break;
|
|
39
|
+
case 0xC4:
|
|
40
|
+
name = "DHT";
|
|
41
|
+
break;
|
|
42
|
+
case 0xDB:
|
|
43
|
+
name = "DQT";
|
|
44
|
+
break;
|
|
45
|
+
case 0xDD:
|
|
46
|
+
name = "DRI";
|
|
47
|
+
break;
|
|
48
|
+
case 0xDA:
|
|
49
|
+
name = "SOS";
|
|
50
|
+
break;
|
|
51
|
+
case 0xFE:
|
|
52
|
+
name = "COM";
|
|
53
|
+
break;
|
|
54
|
+
case 0xD9:
|
|
55
|
+
name = "EOI";
|
|
56
|
+
break;
|
|
57
|
+
default:
|
|
58
|
+
if (markerType >= 0xE0 && markerType <= 0xEF) {
|
|
59
|
+
name = "APP";
|
|
60
|
+
index = markerType - 0xE0;
|
|
61
|
+
} else if (markerType >= 0xC0 && markerType <= 0xCF && markerType !== 0xC4 && markerType !== 0xC8 && markerType !== 0xCC) {
|
|
62
|
+
name = "SOF";
|
|
63
|
+
index = markerType - 0xC0;
|
|
64
|
+
} else if (markerType >= 0xD0 && markerType <= 0xD7) {
|
|
65
|
+
name = "RST";
|
|
66
|
+
index = markerType - 0xD0;
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
var nameStruct = {
|
|
71
|
+
name: name
|
|
72
|
+
};
|
|
73
|
+
if (typeof index === "number") {
|
|
74
|
+
nameStruct.index = index;
|
|
75
|
+
}
|
|
76
|
+
return nameStruct;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/*jslint browser: true, devel: true, bitwise: false, debug: true, eqeq: false, es5: true, evil: false, forin: false, newcap: false, nomen: true, plusplus: true, regexp: false, unparam: false, sloppy: true, stupid: false, sub: false, todo: true, vars: true, white: true */
|
|
81
|
+
|
|
82
|
+
function readExifValue(format, stream) {
|
|
83
|
+
switch(format){
|
|
84
|
+
case 1:
|
|
85
|
+
return stream.nextUInt8();
|
|
86
|
+
case 3:
|
|
87
|
+
return stream.nextUInt16();
|
|
88
|
+
case 4:
|
|
89
|
+
return stream.nextUInt32();
|
|
90
|
+
case 5:
|
|
91
|
+
return [
|
|
92
|
+
stream.nextUInt32(),
|
|
93
|
+
stream.nextUInt32()
|
|
94
|
+
];
|
|
95
|
+
case 6:
|
|
96
|
+
return stream.nextInt8();
|
|
97
|
+
case 8:
|
|
98
|
+
return stream.nextUInt16();
|
|
99
|
+
case 9:
|
|
100
|
+
return stream.nextUInt32();
|
|
101
|
+
case 10:
|
|
102
|
+
return [
|
|
103
|
+
stream.nextInt32(),
|
|
104
|
+
stream.nextInt32()
|
|
105
|
+
];
|
|
106
|
+
case 11:
|
|
107
|
+
return stream.nextFloat();
|
|
108
|
+
case 12:
|
|
109
|
+
return stream.nextDouble();
|
|
110
|
+
default:
|
|
111
|
+
throw new Error("Invalid format while decoding: " + format);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function getBytesPerComponent(format) {
|
|
115
|
+
switch(format){
|
|
116
|
+
case 1:
|
|
117
|
+
case 2:
|
|
118
|
+
case 6:
|
|
119
|
+
case 7:
|
|
120
|
+
return 1;
|
|
121
|
+
case 3:
|
|
122
|
+
case 8:
|
|
123
|
+
return 2;
|
|
124
|
+
case 4:
|
|
125
|
+
case 9:
|
|
126
|
+
case 11:
|
|
127
|
+
return 4;
|
|
128
|
+
case 5:
|
|
129
|
+
case 10:
|
|
130
|
+
case 12:
|
|
131
|
+
return 8;
|
|
132
|
+
default:
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function readExifTag(tiffMarker, stream) {
|
|
137
|
+
var tagType = stream.nextUInt16(), format = stream.nextUInt16(), bytesPerComponent = getBytesPerComponent(format), components = stream.nextUInt32(), valueBytes = bytesPerComponent * components, values, c;
|
|
138
|
+
/* if the value is bigger then 4 bytes, the value is in the data section of the IFD
|
|
139
|
+
and the value present in the tag is the offset starting from the tiff header. So we replace the stream
|
|
140
|
+
with a stream that is located at the given offset in the data section. s*/ if (valueBytes > 4) {
|
|
141
|
+
stream = tiffMarker.openWithOffset(stream.nextUInt32());
|
|
142
|
+
}
|
|
143
|
+
//we don't want to read strings as arrays
|
|
144
|
+
if (format === 2) {
|
|
145
|
+
values = stream.nextString(components);
|
|
146
|
+
//cut off \0 characters
|
|
147
|
+
var lastNull = values.indexOf("\0");
|
|
148
|
+
if (lastNull !== -1) {
|
|
149
|
+
values = values.substr(0, lastNull);
|
|
150
|
+
}
|
|
151
|
+
} else if (format === 7) {
|
|
152
|
+
values = stream.nextBuffer(components);
|
|
153
|
+
} else if (format !== 0) {
|
|
154
|
+
values = [];
|
|
155
|
+
for(c = 0; c < components; ++c){
|
|
156
|
+
values.push(readExifValue(format, stream));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//since our stream is a stateful object, we need to skip remaining bytes
|
|
160
|
+
//so our offset stays correct
|
|
161
|
+
if (valueBytes < 4) {
|
|
162
|
+
stream.skip(4 - valueBytes);
|
|
163
|
+
}
|
|
164
|
+
return [
|
|
165
|
+
tagType,
|
|
166
|
+
values,
|
|
167
|
+
format
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
function readIFDSection(tiffMarker, stream, iterator) {
|
|
171
|
+
var numberOfEntries = stream.nextUInt16(), tag, i;
|
|
172
|
+
for(i = 0; i < numberOfEntries; ++i){
|
|
173
|
+
tag = readExifTag(tiffMarker, stream);
|
|
174
|
+
iterator(tag[0], tag[1], tag[2]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function readHeader(stream) {
|
|
178
|
+
var exifHeader = stream.nextString(6);
|
|
179
|
+
if (exifHeader !== "Exif\0\0") {
|
|
180
|
+
throw new Error("Invalid EXIF header");
|
|
181
|
+
}
|
|
182
|
+
var tiffMarker = stream.mark();
|
|
183
|
+
var tiffHeader = stream.nextUInt16();
|
|
184
|
+
if (tiffHeader === 0x4949) {
|
|
185
|
+
stream.setBigEndian(false);
|
|
186
|
+
} else if (tiffHeader === 0x4D4D) {
|
|
187
|
+
stream.setBigEndian(true);
|
|
188
|
+
} else {
|
|
189
|
+
throw new Error("Invalid TIFF header");
|
|
190
|
+
}
|
|
191
|
+
if (stream.nextUInt16() !== 0x002A) {
|
|
192
|
+
throw new Error("Invalid TIFF data");
|
|
193
|
+
}
|
|
194
|
+
return tiffMarker;
|
|
195
|
+
}
|
|
196
|
+
var exif$2 = {
|
|
197
|
+
IFD0: 1,
|
|
198
|
+
IFD1: 2,
|
|
199
|
+
GPSIFD: 3,
|
|
200
|
+
SubIFD: 4,
|
|
201
|
+
InteropIFD: 5,
|
|
202
|
+
parseTags: function parseTags(stream, iterator) {
|
|
203
|
+
var tiffMarker;
|
|
204
|
+
try {
|
|
205
|
+
tiffMarker = readHeader(stream);
|
|
206
|
+
} catch (e) {
|
|
207
|
+
return false; //ignore APP1 sections with invalid headers
|
|
208
|
+
}
|
|
209
|
+
var subIfdOffset, gpsOffset, interopOffset;
|
|
210
|
+
var ifd0Stream = tiffMarker.openWithOffset(stream.nextUInt32()), IFD0 = this.IFD0;
|
|
211
|
+
readIFDSection(tiffMarker, ifd0Stream, function(tagType, value, format) {
|
|
212
|
+
switch(tagType){
|
|
213
|
+
case 0x8825:
|
|
214
|
+
gpsOffset = value[0];
|
|
215
|
+
break;
|
|
216
|
+
case 0x8769:
|
|
217
|
+
subIfdOffset = value[0];
|
|
218
|
+
break;
|
|
219
|
+
default:
|
|
220
|
+
iterator(IFD0, tagType, value, format);
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
var ifd1Offset = ifd0Stream.nextUInt32();
|
|
225
|
+
if (ifd1Offset !== 0) {
|
|
226
|
+
var ifd1Stream = tiffMarker.openWithOffset(ifd1Offset);
|
|
227
|
+
readIFDSection(tiffMarker, ifd1Stream, iterator.bind(null, this.IFD1));
|
|
228
|
+
}
|
|
229
|
+
if (gpsOffset) {
|
|
230
|
+
var gpsStream = tiffMarker.openWithOffset(gpsOffset);
|
|
231
|
+
readIFDSection(tiffMarker, gpsStream, iterator.bind(null, this.GPSIFD));
|
|
232
|
+
}
|
|
233
|
+
if (subIfdOffset) {
|
|
234
|
+
var subIfdStream = tiffMarker.openWithOffset(subIfdOffset), InteropIFD = this.InteropIFD;
|
|
235
|
+
readIFDSection(tiffMarker, subIfdStream, function(tagType, value, format) {
|
|
236
|
+
if (tagType === 0xA005) {
|
|
237
|
+
interopOffset = value[0];
|
|
238
|
+
} else {
|
|
239
|
+
iterator(InteropIFD, tagType, value, format);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (interopOffset) {
|
|
244
|
+
var interopStream = tiffMarker.openWithOffset(interopOffset);
|
|
245
|
+
readIFDSection(tiffMarker, interopStream, iterator.bind(null, this.InteropIFD));
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
function parseNumber(s) {
|
|
252
|
+
return parseInt(s, 10);
|
|
253
|
+
}
|
|
254
|
+
//in seconds
|
|
255
|
+
var hours = 3600;
|
|
256
|
+
var minutes = 60;
|
|
257
|
+
//take date (year, month, day) and time (hour, minutes, seconds) digits in UTC
|
|
258
|
+
//and return a timestamp in seconds
|
|
259
|
+
function parseDateTimeParts(dateParts, timeParts) {
|
|
260
|
+
dateParts = dateParts.map(parseNumber);
|
|
261
|
+
timeParts = timeParts.map(parseNumber);
|
|
262
|
+
var year = dateParts[0];
|
|
263
|
+
var month = dateParts[1] - 1;
|
|
264
|
+
var day = dateParts[2];
|
|
265
|
+
var hours = timeParts[0];
|
|
266
|
+
var minutes = timeParts[1];
|
|
267
|
+
var seconds = timeParts[2];
|
|
268
|
+
var date = Date.UTC(year, month, day, hours, minutes, seconds, 0);
|
|
269
|
+
var timestamp = date / 1000;
|
|
270
|
+
return timestamp;
|
|
271
|
+
}
|
|
272
|
+
//parse date with "2004-09-04T23:39:06-08:00" format,
|
|
273
|
+
//one of the formats supported by ISO 8601, and
|
|
274
|
+
//convert to utc timestamp in seconds
|
|
275
|
+
function parseDateWithTimezoneFormat(dateTimeStr) {
|
|
276
|
+
var dateParts = dateTimeStr.substr(0, 10).split("-");
|
|
277
|
+
var timeParts = dateTimeStr.substr(11, 8).split(":");
|
|
278
|
+
var timezoneStr = dateTimeStr.substr(19, 6);
|
|
279
|
+
var timezoneParts = timezoneStr.split(":").map(parseNumber);
|
|
280
|
+
var timezoneOffset = timezoneParts[0] * hours + timezoneParts[1] * minutes;
|
|
281
|
+
var timestamp = parseDateTimeParts(dateParts, timeParts);
|
|
282
|
+
//minus because the timezoneOffset describes
|
|
283
|
+
//how much the described time is ahead of UTC
|
|
284
|
+
timestamp -= timezoneOffset;
|
|
285
|
+
if (typeof timestamp === "number" && !isNaN(timestamp)) {
|
|
286
|
+
return timestamp;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//parse date with "YYYY:MM:DD hh:mm:ss" format, convert to utc timestamp in seconds
|
|
290
|
+
function parseDateWithSpecFormat(dateTimeStr) {
|
|
291
|
+
var parts = dateTimeStr.split(" "), dateParts = parts[0].split(":"), timeParts = parts[1].split(":");
|
|
292
|
+
var timestamp = parseDateTimeParts(dateParts, timeParts);
|
|
293
|
+
if (typeof timestamp === "number" && !isNaN(timestamp)) {
|
|
294
|
+
return timestamp;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function parseExifDate(dateTimeStr) {
|
|
298
|
+
//some easy checks to determine two common date formats
|
|
299
|
+
//is the date in the standard "YYYY:MM:DD hh:mm:ss" format?
|
|
300
|
+
var isSpecFormat = dateTimeStr.length === 19 && dateTimeStr.charAt(4) === ":";
|
|
301
|
+
//is the date in the non-standard format,
|
|
302
|
+
//"2004-09-04T23:39:06-08:00" to include a timezone?
|
|
303
|
+
var isTimezoneFormat = dateTimeStr.length === 25 && dateTimeStr.charAt(10) === "T";
|
|
304
|
+
if (isTimezoneFormat) {
|
|
305
|
+
return parseDateWithTimezoneFormat(dateTimeStr);
|
|
306
|
+
} else if (isSpecFormat) {
|
|
307
|
+
return parseDateWithSpecFormat(dateTimeStr);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
var date$1 = {
|
|
311
|
+
parseDateWithSpecFormat: parseDateWithSpecFormat,
|
|
312
|
+
parseDateWithTimezoneFormat: parseDateWithTimezoneFormat,
|
|
313
|
+
parseExifDate: parseExifDate
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
var exif$1 = exif$2;
|
|
317
|
+
var date = date$1;
|
|
318
|
+
var degreeTags = [
|
|
319
|
+
{
|
|
320
|
+
section: exif$1.GPSIFD,
|
|
321
|
+
type: 0x0002,
|
|
322
|
+
name: "GPSLatitude",
|
|
323
|
+
refType: 0x0001,
|
|
324
|
+
refName: "GPSLatitudeRef",
|
|
325
|
+
posVal: "N"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
section: exif$1.GPSIFD,
|
|
329
|
+
type: 0x0004,
|
|
330
|
+
name: "GPSLongitude",
|
|
331
|
+
refType: 0x0003,
|
|
332
|
+
refName: "GPSLongitudeRef",
|
|
333
|
+
posVal: "E"
|
|
334
|
+
}
|
|
335
|
+
];
|
|
336
|
+
var dateTags = [
|
|
337
|
+
{
|
|
338
|
+
section: exif$1.SubIFD,
|
|
339
|
+
type: 0x0132,
|
|
340
|
+
name: "ModifyDate"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
section: exif$1.SubIFD,
|
|
344
|
+
type: 0x9003,
|
|
345
|
+
name: "DateTimeOriginal"
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
section: exif$1.SubIFD,
|
|
349
|
+
type: 0x9004,
|
|
350
|
+
name: "CreateDate"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
section: exif$1.SubIFD,
|
|
354
|
+
type: 0x0132,
|
|
355
|
+
name: "ModifyDate"
|
|
356
|
+
}
|
|
357
|
+
];
|
|
358
|
+
var simplify$1 = {
|
|
359
|
+
castDegreeValues: function castDegreeValues(getTagValue, setTagValue) {
|
|
360
|
+
degreeTags.forEach(function(t) {
|
|
361
|
+
var degreeVal = getTagValue(t);
|
|
362
|
+
if (degreeVal) {
|
|
363
|
+
var degreeRef = getTagValue({
|
|
364
|
+
section: t.section,
|
|
365
|
+
type: t.refType,
|
|
366
|
+
name: t.refName
|
|
367
|
+
});
|
|
368
|
+
var degreeNumRef = degreeRef === t.posVal ? 1 : -1;
|
|
369
|
+
var degree = (degreeVal[0] + degreeVal[1] / 60 + degreeVal[2] / 3600) * degreeNumRef;
|
|
370
|
+
setTagValue(t, degree);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
},
|
|
374
|
+
castDateValues: function castDateValues(getTagValue, setTagValue) {
|
|
375
|
+
dateTags.forEach(function(t) {
|
|
376
|
+
var dateStrVal = getTagValue(t);
|
|
377
|
+
if (dateStrVal) {
|
|
378
|
+
//some easy checks to determine two common date formats
|
|
379
|
+
var timestamp = date.parseExifDate(dateStrVal);
|
|
380
|
+
if (typeof timestamp !== "undefined") {
|
|
381
|
+
setTagValue(t, timestamp);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
},
|
|
386
|
+
simplifyValue: function simplifyValue(values, format) {
|
|
387
|
+
if (Array.isArray(values)) {
|
|
388
|
+
values = values.map(function(value) {
|
|
389
|
+
if (format === 10 || format === 5) {
|
|
390
|
+
return value[0] / value[1];
|
|
391
|
+
}
|
|
392
|
+
return value;
|
|
393
|
+
});
|
|
394
|
+
if (values.length === 1) {
|
|
395
|
+
values = values[0];
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return values;
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
var exifTags = {
|
|
403
|
+
exif: {
|
|
404
|
+
0x0001: "InteropIndex",
|
|
405
|
+
0x0002: "InteropVersion",
|
|
406
|
+
0x000B: "ProcessingSoftware",
|
|
407
|
+
0x00FE: "SubfileType",
|
|
408
|
+
0x00FF: "OldSubfileType",
|
|
409
|
+
0x0100: "ImageWidth",
|
|
410
|
+
0x0101: "ImageHeight",
|
|
411
|
+
0x0102: "BitsPerSample",
|
|
412
|
+
0x0103: "Compression",
|
|
413
|
+
0x0106: "PhotometricInterpretation",
|
|
414
|
+
0x0107: "Thresholding",
|
|
415
|
+
0x0108: "CellWidth",
|
|
416
|
+
0x0109: "CellLength",
|
|
417
|
+
0x010A: "FillOrder",
|
|
418
|
+
0x010D: "DocumentName",
|
|
419
|
+
0x010E: "ImageDescription",
|
|
420
|
+
0x010F: "Make",
|
|
421
|
+
0x0110: "Model",
|
|
422
|
+
0x0111: "StripOffsets",
|
|
423
|
+
0x0112: "Orientation",
|
|
424
|
+
0x0115: "SamplesPerPixel",
|
|
425
|
+
0x0116: "RowsPerStrip",
|
|
426
|
+
0x0117: "StripByteCounts",
|
|
427
|
+
0x0118: "MinSampleValue",
|
|
428
|
+
0x0119: "MaxSampleValue",
|
|
429
|
+
0x011A: "XResolution",
|
|
430
|
+
0x011B: "YResolution",
|
|
431
|
+
0x011C: "PlanarConfiguration",
|
|
432
|
+
0x011D: "PageName",
|
|
433
|
+
0x011E: "XPosition",
|
|
434
|
+
0x011F: "YPosition",
|
|
435
|
+
0x0120: "FreeOffsets",
|
|
436
|
+
0x0121: "FreeByteCounts",
|
|
437
|
+
0x0122: "GrayResponseUnit",
|
|
438
|
+
0x0123: "GrayResponseCurve",
|
|
439
|
+
0x0124: "T4Options",
|
|
440
|
+
0x0125: "T6Options",
|
|
441
|
+
0x0128: "ResolutionUnit",
|
|
442
|
+
0x0129: "PageNumber",
|
|
443
|
+
0x012C: "ColorResponseUnit",
|
|
444
|
+
0x012D: "TransferFunction",
|
|
445
|
+
0x0131: "Software",
|
|
446
|
+
0x0132: "ModifyDate",
|
|
447
|
+
0x013B: "Artist",
|
|
448
|
+
0x013C: "HostComputer",
|
|
449
|
+
0x013D: "Predictor",
|
|
450
|
+
0x013E: "WhitePoint",
|
|
451
|
+
0x013F: "PrimaryChromaticities",
|
|
452
|
+
0x0140: "ColorMap",
|
|
453
|
+
0x0141: "HalftoneHints",
|
|
454
|
+
0x0142: "TileWidth",
|
|
455
|
+
0x0143: "TileLength",
|
|
456
|
+
0x0144: "TileOffsets",
|
|
457
|
+
0x0145: "TileByteCounts",
|
|
458
|
+
0x0146: "BadFaxLines",
|
|
459
|
+
0x0147: "CleanFaxData",
|
|
460
|
+
0x0148: "ConsecutiveBadFaxLines",
|
|
461
|
+
0x014A: "SubIFD",
|
|
462
|
+
0x014C: "InkSet",
|
|
463
|
+
0x014D: "InkNames",
|
|
464
|
+
0x014E: "NumberofInks",
|
|
465
|
+
0x0150: "DotRange",
|
|
466
|
+
0x0151: "TargetPrinter",
|
|
467
|
+
0x0152: "ExtraSamples",
|
|
468
|
+
0x0153: "SampleFormat",
|
|
469
|
+
0x0154: "SMinSampleValue",
|
|
470
|
+
0x0155: "SMaxSampleValue",
|
|
471
|
+
0x0156: "TransferRange",
|
|
472
|
+
0x0157: "ClipPath",
|
|
473
|
+
0x0158: "XClipPathUnits",
|
|
474
|
+
0x0159: "YClipPathUnits",
|
|
475
|
+
0x015A: "Indexed",
|
|
476
|
+
0x015B: "JPEGTables",
|
|
477
|
+
0x015F: "OPIProxy",
|
|
478
|
+
0x0190: "GlobalParametersIFD",
|
|
479
|
+
0x0191: "ProfileType",
|
|
480
|
+
0x0192: "FaxProfile",
|
|
481
|
+
0x0193: "CodingMethods",
|
|
482
|
+
0x0194: "VersionYear",
|
|
483
|
+
0x0195: "ModeNumber",
|
|
484
|
+
0x01B1: "Decode",
|
|
485
|
+
0x01B2: "DefaultImageColor",
|
|
486
|
+
0x01B3: "T82Options",
|
|
487
|
+
0x01B5: "JPEGTables",
|
|
488
|
+
0x0200: "JPEGProc",
|
|
489
|
+
0x0201: "ThumbnailOffset",
|
|
490
|
+
0x0202: "ThumbnailLength",
|
|
491
|
+
0x0203: "JPEGRestartInterval",
|
|
492
|
+
0x0205: "JPEGLosslessPredictors",
|
|
493
|
+
0x0206: "JPEGPointTransforms",
|
|
494
|
+
0x0207: "JPEGQTables",
|
|
495
|
+
0x0208: "JPEGDCTables",
|
|
496
|
+
0x0209: "JPEGACTables",
|
|
497
|
+
0x0211: "YCbCrCoefficients",
|
|
498
|
+
0x0212: "YCbCrSubSampling",
|
|
499
|
+
0x0213: "YCbCrPositioning",
|
|
500
|
+
0x0214: "ReferenceBlackWhite",
|
|
501
|
+
0x022F: "StripRowCounts",
|
|
502
|
+
0x02BC: "ApplicationNotes",
|
|
503
|
+
0x03E7: "USPTOMiscellaneous",
|
|
504
|
+
0x1000: "RelatedImageFileFormat",
|
|
505
|
+
0x1001: "RelatedImageWidth",
|
|
506
|
+
0x1002: "RelatedImageHeight",
|
|
507
|
+
0x4746: "Rating",
|
|
508
|
+
0x4747: "XP_DIP_XML",
|
|
509
|
+
0x4748: "StitchInfo",
|
|
510
|
+
0x4749: "RatingPercent",
|
|
511
|
+
0x800D: "ImageID",
|
|
512
|
+
0x80A3: "WangTag1",
|
|
513
|
+
0x80A4: "WangAnnotation",
|
|
514
|
+
0x80A5: "WangTag3",
|
|
515
|
+
0x80A6: "WangTag4",
|
|
516
|
+
0x80E3: "Matteing",
|
|
517
|
+
0x80E4: "DataType",
|
|
518
|
+
0x80E5: "ImageDepth",
|
|
519
|
+
0x80E6: "TileDepth",
|
|
520
|
+
0x827D: "Model2",
|
|
521
|
+
0x828D: "CFARepeatPatternDim",
|
|
522
|
+
0x828E: "CFAPattern2",
|
|
523
|
+
0x828F: "BatteryLevel",
|
|
524
|
+
0x8290: "KodakIFD",
|
|
525
|
+
0x8298: "Copyright",
|
|
526
|
+
0x829A: "ExposureTime",
|
|
527
|
+
0x829D: "FNumber",
|
|
528
|
+
0x82A5: "MDFileTag",
|
|
529
|
+
0x82A6: "MDScalePixel",
|
|
530
|
+
0x82A7: "MDColorTable",
|
|
531
|
+
0x82A8: "MDLabName",
|
|
532
|
+
0x82A9: "MDSampleInfo",
|
|
533
|
+
0x82AA: "MDPrepDate",
|
|
534
|
+
0x82AB: "MDPrepTime",
|
|
535
|
+
0x82AC: "MDFileUnits",
|
|
536
|
+
0x830E: "PixelScale",
|
|
537
|
+
0x8335: "AdventScale",
|
|
538
|
+
0x8336: "AdventRevision",
|
|
539
|
+
0x835C: "UIC1Tag",
|
|
540
|
+
0x835D: "UIC2Tag",
|
|
541
|
+
0x835E: "UIC3Tag",
|
|
542
|
+
0x835F: "UIC4Tag",
|
|
543
|
+
0x83BB: "IPTC-NAA",
|
|
544
|
+
0x847E: "IntergraphPacketData",
|
|
545
|
+
0x847F: "IntergraphFlagRegisters",
|
|
546
|
+
0x8480: "IntergraphMatrix",
|
|
547
|
+
0x8481: "INGRReserved",
|
|
548
|
+
0x8482: "ModelTiePoint",
|
|
549
|
+
0x84E0: "Site",
|
|
550
|
+
0x84E1: "ColorSequence",
|
|
551
|
+
0x84E2: "IT8Header",
|
|
552
|
+
0x84E3: "RasterPadding",
|
|
553
|
+
0x84E4: "BitsPerRunLength",
|
|
554
|
+
0x84E5: "BitsPerExtendedRunLength",
|
|
555
|
+
0x84E6: "ColorTable",
|
|
556
|
+
0x84E7: "ImageColorIndicator",
|
|
557
|
+
0x84E8: "BackgroundColorIndicator",
|
|
558
|
+
0x84E9: "ImageColorValue",
|
|
559
|
+
0x84EA: "BackgroundColorValue",
|
|
560
|
+
0x84EB: "PixelIntensityRange",
|
|
561
|
+
0x84EC: "TransparencyIndicator",
|
|
562
|
+
0x84ED: "ColorCharacterization",
|
|
563
|
+
0x84EE: "HCUsage",
|
|
564
|
+
0x84EF: "TrapIndicator",
|
|
565
|
+
0x84F0: "CMYKEquivalent",
|
|
566
|
+
0x8546: "SEMInfo",
|
|
567
|
+
0x8568: "AFCP_IPTC",
|
|
568
|
+
0x85B8: "PixelMagicJBIGOptions",
|
|
569
|
+
0x85D8: "ModelTransform",
|
|
570
|
+
0x8602: "WB_GRGBLevels",
|
|
571
|
+
0x8606: "LeafData",
|
|
572
|
+
0x8649: "PhotoshopSettings",
|
|
573
|
+
0x8769: "ExifOffset",
|
|
574
|
+
0x8773: "ICC_Profile",
|
|
575
|
+
0x877F: "TIFF_FXExtensions",
|
|
576
|
+
0x8780: "MultiProfiles",
|
|
577
|
+
0x8781: "SharedData",
|
|
578
|
+
0x8782: "T88Options",
|
|
579
|
+
0x87AC: "ImageLayer",
|
|
580
|
+
0x87AF: "GeoTiffDirectory",
|
|
581
|
+
0x87B0: "GeoTiffDoubleParams",
|
|
582
|
+
0x87B1: "GeoTiffAsciiParams",
|
|
583
|
+
0x8822: "ExposureProgram",
|
|
584
|
+
0x8824: "SpectralSensitivity",
|
|
585
|
+
0x8825: "GPSInfo",
|
|
586
|
+
0x8827: "ISO",
|
|
587
|
+
0x8828: "Opto-ElectricConvFactor",
|
|
588
|
+
0x8829: "Interlace",
|
|
589
|
+
0x882A: "TimeZoneOffset",
|
|
590
|
+
0x882B: "SelfTimerMode",
|
|
591
|
+
0x8830: "SensitivityType",
|
|
592
|
+
0x8831: "StandardOutputSensitivity",
|
|
593
|
+
0x8832: "RecommendedExposureIndex",
|
|
594
|
+
0x8833: "ISOSpeed",
|
|
595
|
+
0x8834: "ISOSpeedLatitudeyyy",
|
|
596
|
+
0x8835: "ISOSpeedLatitudezzz",
|
|
597
|
+
0x885C: "FaxRecvParams",
|
|
598
|
+
0x885D: "FaxSubAddress",
|
|
599
|
+
0x885E: "FaxRecvTime",
|
|
600
|
+
0x888A: "LeafSubIFD",
|
|
601
|
+
0x9000: "ExifVersion",
|
|
602
|
+
0x9003: "DateTimeOriginal",
|
|
603
|
+
0x9004: "CreateDate",
|
|
604
|
+
0x9101: "ComponentsConfiguration",
|
|
605
|
+
0x9102: "CompressedBitsPerPixel",
|
|
606
|
+
0x9201: "ShutterSpeedValue",
|
|
607
|
+
0x9202: "ApertureValue",
|
|
608
|
+
0x9203: "BrightnessValue",
|
|
609
|
+
0x9204: "ExposureCompensation",
|
|
610
|
+
0x9205: "MaxApertureValue",
|
|
611
|
+
0x9206: "SubjectDistance",
|
|
612
|
+
0x9207: "MeteringMode",
|
|
613
|
+
0x9208: "LightSource",
|
|
614
|
+
0x9209: "Flash",
|
|
615
|
+
0x920A: "FocalLength",
|
|
616
|
+
0x920B: "FlashEnergy",
|
|
617
|
+
0x920C: "SpatialFrequencyResponse",
|
|
618
|
+
0x920D: "Noise",
|
|
619
|
+
0x920E: "FocalPlaneXResolution",
|
|
620
|
+
0x920F: "FocalPlaneYResolution",
|
|
621
|
+
0x9210: "FocalPlaneResolutionUnit",
|
|
622
|
+
0x9211: "ImageNumber",
|
|
623
|
+
0x9212: "SecurityClassification",
|
|
624
|
+
0x9213: "ImageHistory",
|
|
625
|
+
0x9214: "SubjectArea",
|
|
626
|
+
0x9215: "ExposureIndex",
|
|
627
|
+
0x9216: "TIFF-EPStandardID",
|
|
628
|
+
0x9217: "SensingMethod",
|
|
629
|
+
0x923A: "CIP3DataFile",
|
|
630
|
+
0x923B: "CIP3Sheet",
|
|
631
|
+
0x923C: "CIP3Side",
|
|
632
|
+
0x923F: "StoNits",
|
|
633
|
+
0x927C: "MakerNote",
|
|
634
|
+
0x9286: "UserComment",
|
|
635
|
+
0x9290: "SubSecTime",
|
|
636
|
+
0x9291: "SubSecTimeOriginal",
|
|
637
|
+
0x9292: "SubSecTimeDigitized",
|
|
638
|
+
0x932F: "MSDocumentText",
|
|
639
|
+
0x9330: "MSPropertySetStorage",
|
|
640
|
+
0x9331: "MSDocumentTextPosition",
|
|
641
|
+
0x935C: "ImageSourceData",
|
|
642
|
+
0x9C9B: "XPTitle",
|
|
643
|
+
0x9C9C: "XPComment",
|
|
644
|
+
0x9C9D: "XPAuthor",
|
|
645
|
+
0x9C9E: "XPKeywords",
|
|
646
|
+
0x9C9F: "XPSubject",
|
|
647
|
+
0xA000: "FlashpixVersion",
|
|
648
|
+
0xA001: "ColorSpace",
|
|
649
|
+
0xA002: "ExifImageWidth",
|
|
650
|
+
0xA003: "ExifImageHeight",
|
|
651
|
+
0xA004: "RelatedSoundFile",
|
|
652
|
+
0xA005: "InteropOffset",
|
|
653
|
+
0xA20B: "FlashEnergy",
|
|
654
|
+
0xA20C: "SpatialFrequencyResponse",
|
|
655
|
+
0xA20D: "Noise",
|
|
656
|
+
0xA20E: "FocalPlaneXResolution",
|
|
657
|
+
0xA20F: "FocalPlaneYResolution",
|
|
658
|
+
0xA210: "FocalPlaneResolutionUnit",
|
|
659
|
+
0xA211: "ImageNumber",
|
|
660
|
+
0xA212: "SecurityClassification",
|
|
661
|
+
0xA213: "ImageHistory",
|
|
662
|
+
0xA214: "SubjectLocation",
|
|
663
|
+
0xA215: "ExposureIndex",
|
|
664
|
+
0xA216: "TIFF-EPStandardID",
|
|
665
|
+
0xA217: "SensingMethod",
|
|
666
|
+
0xA300: "FileSource",
|
|
667
|
+
0xA301: "SceneType",
|
|
668
|
+
0xA302: "CFAPattern",
|
|
669
|
+
0xA401: "CustomRendered",
|
|
670
|
+
0xA402: "ExposureMode",
|
|
671
|
+
0xA403: "WhiteBalance",
|
|
672
|
+
0xA404: "DigitalZoomRatio",
|
|
673
|
+
0xA405: "FocalLengthIn35mmFormat",
|
|
674
|
+
0xA406: "SceneCaptureType",
|
|
675
|
+
0xA407: "GainControl",
|
|
676
|
+
0xA408: "Contrast",
|
|
677
|
+
0xA409: "Saturation",
|
|
678
|
+
0xA40A: "Sharpness",
|
|
679
|
+
0xA40B: "DeviceSettingDescription",
|
|
680
|
+
0xA40C: "SubjectDistanceRange",
|
|
681
|
+
0xA420: "ImageUniqueID",
|
|
682
|
+
0xA430: "OwnerName",
|
|
683
|
+
0xA431: "SerialNumber",
|
|
684
|
+
0xA432: "LensInfo",
|
|
685
|
+
0xA433: "LensMake",
|
|
686
|
+
0xA434: "LensModel",
|
|
687
|
+
0xA435: "LensSerialNumber",
|
|
688
|
+
0xA480: "GDALMetadata",
|
|
689
|
+
0xA481: "GDALNoData",
|
|
690
|
+
0xA500: "Gamma",
|
|
691
|
+
0xAFC0: "ExpandSoftware",
|
|
692
|
+
0xAFC1: "ExpandLens",
|
|
693
|
+
0xAFC2: "ExpandFilm",
|
|
694
|
+
0xAFC3: "ExpandFilterLens",
|
|
695
|
+
0xAFC4: "ExpandScanner",
|
|
696
|
+
0xAFC5: "ExpandFlashLamp",
|
|
697
|
+
0xBC01: "PixelFormat",
|
|
698
|
+
0xBC02: "Transformation",
|
|
699
|
+
0xBC03: "Uncompressed",
|
|
700
|
+
0xBC04: "ImageType",
|
|
701
|
+
0xBC80: "ImageWidth",
|
|
702
|
+
0xBC81: "ImageHeight",
|
|
703
|
+
0xBC82: "WidthResolution",
|
|
704
|
+
0xBC83: "HeightResolution",
|
|
705
|
+
0xBCC0: "ImageOffset",
|
|
706
|
+
0xBCC1: "ImageByteCount",
|
|
707
|
+
0xBCC2: "AlphaOffset",
|
|
708
|
+
0xBCC3: "AlphaByteCount",
|
|
709
|
+
0xBCC4: "ImageDataDiscard",
|
|
710
|
+
0xBCC5: "AlphaDataDiscard",
|
|
711
|
+
0xC427: "OceScanjobDesc",
|
|
712
|
+
0xC428: "OceApplicationSelector",
|
|
713
|
+
0xC429: "OceIDNumber",
|
|
714
|
+
0xC42A: "OceImageLogic",
|
|
715
|
+
0xC44F: "Annotations",
|
|
716
|
+
0xC4A5: "PrintIM",
|
|
717
|
+
0xC580: "USPTOOriginalContentType",
|
|
718
|
+
0xC612: "DNGVersion",
|
|
719
|
+
0xC613: "DNGBackwardVersion",
|
|
720
|
+
0xC614: "UniqueCameraModel",
|
|
721
|
+
0xC615: "LocalizedCameraModel",
|
|
722
|
+
0xC616: "CFAPlaneColor",
|
|
723
|
+
0xC617: "CFALayout",
|
|
724
|
+
0xC618: "LinearizationTable",
|
|
725
|
+
0xC619: "BlackLevelRepeatDim",
|
|
726
|
+
0xC61A: "BlackLevel",
|
|
727
|
+
0xC61B: "BlackLevelDeltaH",
|
|
728
|
+
0xC61C: "BlackLevelDeltaV",
|
|
729
|
+
0xC61D: "WhiteLevel",
|
|
730
|
+
0xC61E: "DefaultScale",
|
|
731
|
+
0xC61F: "DefaultCropOrigin",
|
|
732
|
+
0xC620: "DefaultCropSize",
|
|
733
|
+
0xC621: "ColorMatrix1",
|
|
734
|
+
0xC622: "ColorMatrix2",
|
|
735
|
+
0xC623: "CameraCalibration1",
|
|
736
|
+
0xC624: "CameraCalibration2",
|
|
737
|
+
0xC625: "ReductionMatrix1",
|
|
738
|
+
0xC626: "ReductionMatrix2",
|
|
739
|
+
0xC627: "AnalogBalance",
|
|
740
|
+
0xC628: "AsShotNeutral",
|
|
741
|
+
0xC629: "AsShotWhiteXY",
|
|
742
|
+
0xC62A: "BaselineExposure",
|
|
743
|
+
0xC62B: "BaselineNoise",
|
|
744
|
+
0xC62C: "BaselineSharpness",
|
|
745
|
+
0xC62D: "BayerGreenSplit",
|
|
746
|
+
0xC62E: "LinearResponseLimit",
|
|
747
|
+
0xC62F: "CameraSerialNumber",
|
|
748
|
+
0xC630: "DNGLensInfo",
|
|
749
|
+
0xC631: "ChromaBlurRadius",
|
|
750
|
+
0xC632: "AntiAliasStrength",
|
|
751
|
+
0xC633: "ShadowScale",
|
|
752
|
+
0xC634: "DNGPrivateData",
|
|
753
|
+
0xC635: "MakerNoteSafety",
|
|
754
|
+
0xC640: "RawImageSegmentation",
|
|
755
|
+
0xC65A: "CalibrationIlluminant1",
|
|
756
|
+
0xC65B: "CalibrationIlluminant2",
|
|
757
|
+
0xC65C: "BestQualityScale",
|
|
758
|
+
0xC65D: "RawDataUniqueID",
|
|
759
|
+
0xC660: "AliasLayerMetadata",
|
|
760
|
+
0xC68B: "OriginalRawFileName",
|
|
761
|
+
0xC68C: "OriginalRawFileData",
|
|
762
|
+
0xC68D: "ActiveArea",
|
|
763
|
+
0xC68E: "MaskedAreas",
|
|
764
|
+
0xC68F: "AsShotICCProfile",
|
|
765
|
+
0xC690: "AsShotPreProfileMatrix",
|
|
766
|
+
0xC691: "CurrentICCProfile",
|
|
767
|
+
0xC692: "CurrentPreProfileMatrix",
|
|
768
|
+
0xC6BF: "ColorimetricReference",
|
|
769
|
+
0xC6D2: "PanasonicTitle",
|
|
770
|
+
0xC6D3: "PanasonicTitle2",
|
|
771
|
+
0xC6F3: "CameraCalibrationSig",
|
|
772
|
+
0xC6F4: "ProfileCalibrationSig",
|
|
773
|
+
0xC6F5: "ProfileIFD",
|
|
774
|
+
0xC6F6: "AsShotProfileName",
|
|
775
|
+
0xC6F7: "NoiseReductionApplied",
|
|
776
|
+
0xC6F8: "ProfileName",
|
|
777
|
+
0xC6F9: "ProfileHueSatMapDims",
|
|
778
|
+
0xC6FA: "ProfileHueSatMapData1",
|
|
779
|
+
0xC6FB: "ProfileHueSatMapData2",
|
|
780
|
+
0xC6FC: "ProfileToneCurve",
|
|
781
|
+
0xC6FD: "ProfileEmbedPolicy",
|
|
782
|
+
0xC6FE: "ProfileCopyright",
|
|
783
|
+
0xC714: "ForwardMatrix1",
|
|
784
|
+
0xC715: "ForwardMatrix2",
|
|
785
|
+
0xC716: "PreviewApplicationName",
|
|
786
|
+
0xC717: "PreviewApplicationVersion",
|
|
787
|
+
0xC718: "PreviewSettingsName",
|
|
788
|
+
0xC719: "PreviewSettingsDigest",
|
|
789
|
+
0xC71A: "PreviewColorSpace",
|
|
790
|
+
0xC71B: "PreviewDateTime",
|
|
791
|
+
0xC71C: "RawImageDigest",
|
|
792
|
+
0xC71D: "OriginalRawFileDigest",
|
|
793
|
+
0xC71E: "SubTileBlockSize",
|
|
794
|
+
0xC71F: "RowInterleaveFactor",
|
|
795
|
+
0xC725: "ProfileLookTableDims",
|
|
796
|
+
0xC726: "ProfileLookTableData",
|
|
797
|
+
0xC740: "OpcodeList1",
|
|
798
|
+
0xC741: "OpcodeList2",
|
|
799
|
+
0xC74E: "OpcodeList3",
|
|
800
|
+
0xC761: "NoiseProfile",
|
|
801
|
+
0xC763: "TimeCodes",
|
|
802
|
+
0xC764: "FrameRate",
|
|
803
|
+
0xC772: "TStop",
|
|
804
|
+
0xC789: "ReelName",
|
|
805
|
+
0xC791: "OriginalDefaultFinalSize",
|
|
806
|
+
0xC792: "OriginalBestQualitySize",
|
|
807
|
+
0xC793: "OriginalDefaultCropSize",
|
|
808
|
+
0xC7A1: "CameraLabel",
|
|
809
|
+
0xC7A3: "ProfileHueSatMapEncoding",
|
|
810
|
+
0xC7A4: "ProfileLookTableEncoding",
|
|
811
|
+
0xC7A5: "BaselineExposureOffset",
|
|
812
|
+
0xC7A6: "DefaultBlackRender",
|
|
813
|
+
0xC7A7: "NewRawImageDigest",
|
|
814
|
+
0xC7A8: "RawToPreviewGain",
|
|
815
|
+
0xC7B5: "DefaultUserCrop",
|
|
816
|
+
0xEA1C: "Padding",
|
|
817
|
+
0xEA1D: "OffsetSchema",
|
|
818
|
+
0xFDE8: "OwnerName",
|
|
819
|
+
0xFDE9: "SerialNumber",
|
|
820
|
+
0xFDEA: "Lens",
|
|
821
|
+
0xFE00: "KDC_IFD",
|
|
822
|
+
0xFE4C: "RawFile",
|
|
823
|
+
0xFE4D: "Converter",
|
|
824
|
+
0xFE4E: "WhiteBalance",
|
|
825
|
+
0xFE51: "Exposure",
|
|
826
|
+
0xFE52: "Shadows",
|
|
827
|
+
0xFE53: "Brightness",
|
|
828
|
+
0xFE54: "Contrast",
|
|
829
|
+
0xFE55: "Saturation",
|
|
830
|
+
0xFE56: "Sharpness",
|
|
831
|
+
0xFE57: "Smoothness",
|
|
832
|
+
0xFE58: "MoireFilter"
|
|
833
|
+
},
|
|
834
|
+
gps: {
|
|
835
|
+
0x0000: "GPSVersionID",
|
|
836
|
+
0x0001: "GPSLatitudeRef",
|
|
837
|
+
0x0002: "GPSLatitude",
|
|
838
|
+
0x0003: "GPSLongitudeRef",
|
|
839
|
+
0x0004: "GPSLongitude",
|
|
840
|
+
0x0005: "GPSAltitudeRef",
|
|
841
|
+
0x0006: "GPSAltitude",
|
|
842
|
+
0x0007: "GPSTimeStamp",
|
|
843
|
+
0x0008: "GPSSatellites",
|
|
844
|
+
0x0009: "GPSStatus",
|
|
845
|
+
0x000A: "GPSMeasureMode",
|
|
846
|
+
0x000B: "GPSDOP",
|
|
847
|
+
0x000C: "GPSSpeedRef",
|
|
848
|
+
0x000D: "GPSSpeed",
|
|
849
|
+
0x000E: "GPSTrackRef",
|
|
850
|
+
0x000F: "GPSTrack",
|
|
851
|
+
0x0010: "GPSImgDirectionRef",
|
|
852
|
+
0x0011: "GPSImgDirection",
|
|
853
|
+
0x0012: "GPSMapDatum",
|
|
854
|
+
0x0013: "GPSDestLatitudeRef",
|
|
855
|
+
0x0014: "GPSDestLatitude",
|
|
856
|
+
0x0015: "GPSDestLongitudeRef",
|
|
857
|
+
0x0016: "GPSDestLongitude",
|
|
858
|
+
0x0017: "GPSDestBearingRef",
|
|
859
|
+
0x0018: "GPSDestBearing",
|
|
860
|
+
0x0019: "GPSDestDistanceRef",
|
|
861
|
+
0x001A: "GPSDestDistance",
|
|
862
|
+
0x001B: "GPSProcessingMethod",
|
|
863
|
+
0x001C: "GPSAreaInformation",
|
|
864
|
+
0x001D: "GPSDateStamp",
|
|
865
|
+
0x001E: "GPSDifferential",
|
|
866
|
+
0x001F: "GPSHPositioningError"
|
|
867
|
+
}
|
|
868
|
+
};
|
|
869
|
+
|
|
870
|
+
/*jslint browser: true, devel: true, bitwise: false, debug: true, eqeq: false, es5: true, evil: false, forin: false, newcap: false, nomen: true, plusplus: true, regexp: false, unparam: false, sloppy: true, stupid: false, sub: false, todo: true, vars: true, white: true */
|
|
871
|
+
|
|
872
|
+
var jpeg = jpeg$1, exif = exif$2, simplify = simplify$1;
|
|
873
|
+
function ExifResult(startMarker, tags, imageSize, thumbnailOffset, thumbnailLength, thumbnailType, app1Offset) {
|
|
874
|
+
this.startMarker = startMarker;
|
|
875
|
+
this.tags = tags;
|
|
876
|
+
this.imageSize = imageSize;
|
|
877
|
+
this.thumbnailOffset = thumbnailOffset;
|
|
878
|
+
this.thumbnailLength = thumbnailLength;
|
|
879
|
+
this.thumbnailType = thumbnailType;
|
|
880
|
+
this.app1Offset = app1Offset;
|
|
881
|
+
}
|
|
882
|
+
ExifResult.prototype = {
|
|
883
|
+
hasThumbnail: function hasThumbnail(mime) {
|
|
884
|
+
if (!this.thumbnailOffset || !this.thumbnailLength) {
|
|
885
|
+
return false;
|
|
886
|
+
}
|
|
887
|
+
if (typeof mime !== "string") {
|
|
888
|
+
return true;
|
|
889
|
+
}
|
|
890
|
+
if (mime.toLowerCase().trim() === "image/jpeg") {
|
|
891
|
+
return this.thumbnailType === 6;
|
|
892
|
+
}
|
|
893
|
+
if (mime.toLowerCase().trim() === "image/tiff") {
|
|
894
|
+
return this.thumbnailType === 1;
|
|
895
|
+
}
|
|
896
|
+
return false;
|
|
897
|
+
},
|
|
898
|
+
getThumbnailOffset: function getThumbnailOffset() {
|
|
899
|
+
return this.app1Offset + 6 + this.thumbnailOffset;
|
|
900
|
+
},
|
|
901
|
+
getThumbnailLength: function getThumbnailLength() {
|
|
902
|
+
return this.thumbnailLength;
|
|
903
|
+
},
|
|
904
|
+
getThumbnailBuffer: function getThumbnailBuffer() {
|
|
905
|
+
return this._getThumbnailStream().nextBuffer(this.thumbnailLength);
|
|
906
|
+
},
|
|
907
|
+
_getThumbnailStream: function _getThumbnailStream() {
|
|
908
|
+
return this.startMarker.openWithOffset(this.getThumbnailOffset());
|
|
909
|
+
},
|
|
910
|
+
getImageSize: function getImageSize() {
|
|
911
|
+
return this.imageSize;
|
|
912
|
+
},
|
|
913
|
+
getThumbnailSize: function getThumbnailSize() {
|
|
914
|
+
var stream = this._getThumbnailStream(), size;
|
|
915
|
+
jpeg.parseSections(stream, function(sectionType, sectionStream) {
|
|
916
|
+
if (jpeg.getSectionName(sectionType).name === "SOF") {
|
|
917
|
+
size = jpeg.getSizeFromSOFSection(sectionStream);
|
|
918
|
+
}
|
|
919
|
+
});
|
|
920
|
+
return size;
|
|
921
|
+
}
|
|
922
|
+
};
|
|
923
|
+
function Parser$1(stream) {
|
|
924
|
+
this.stream = stream;
|
|
925
|
+
this.flags = {
|
|
926
|
+
readBinaryTags: false,
|
|
927
|
+
resolveTagNames: true,
|
|
928
|
+
simplifyValues: true,
|
|
929
|
+
imageSize: true,
|
|
930
|
+
hidePointers: true,
|
|
931
|
+
returnTags: true
|
|
932
|
+
};
|
|
933
|
+
}
|
|
934
|
+
Parser$1.prototype = {
|
|
935
|
+
enableBinaryFields: function enableBinaryFields(enable) {
|
|
936
|
+
this.flags.readBinaryTags = !!enable;
|
|
937
|
+
return this;
|
|
938
|
+
},
|
|
939
|
+
enablePointers: function enablePointers(enable) {
|
|
940
|
+
this.flags.hidePointers = !enable;
|
|
941
|
+
return this;
|
|
942
|
+
},
|
|
943
|
+
enableTagNames: function enableTagNames(enable) {
|
|
944
|
+
this.flags.resolveTagNames = !!enable;
|
|
945
|
+
return this;
|
|
946
|
+
},
|
|
947
|
+
enableImageSize: function enableImageSize(enable) {
|
|
948
|
+
this.flags.imageSize = !!enable;
|
|
949
|
+
return this;
|
|
950
|
+
},
|
|
951
|
+
enableReturnTags: function enableReturnTags(enable) {
|
|
952
|
+
this.flags.returnTags = !!enable;
|
|
953
|
+
return this;
|
|
954
|
+
},
|
|
955
|
+
enableSimpleValues: function enableSimpleValues(enable) {
|
|
956
|
+
this.flags.simplifyValues = !!enable;
|
|
957
|
+
return this;
|
|
958
|
+
},
|
|
959
|
+
parse: function parse() {
|
|
960
|
+
var start = this.stream.mark(), stream = start.openWithOffset(0), flags = this.flags, tags, imageSize, thumbnailOffset, thumbnailLength, thumbnailType, app1Offset, tagNames, getTagValue, setTagValue;
|
|
961
|
+
if (flags.resolveTagNames) {
|
|
962
|
+
tagNames = exifTags;
|
|
963
|
+
}
|
|
964
|
+
if (flags.resolveTagNames) {
|
|
965
|
+
tags = {};
|
|
966
|
+
getTagValue = function getTagValue(t) {
|
|
967
|
+
return tags[t.name];
|
|
968
|
+
};
|
|
969
|
+
setTagValue = function setTagValue(t, value) {
|
|
970
|
+
tags[t.name] = value;
|
|
971
|
+
};
|
|
972
|
+
} else {
|
|
973
|
+
tags = [];
|
|
974
|
+
getTagValue = function getTagValue(t) {
|
|
975
|
+
var i;
|
|
976
|
+
for(i = 0; i < tags.length; ++i){
|
|
977
|
+
if (tags[i].type === t.type && tags[i].section === t.section) {
|
|
978
|
+
return tags.value;
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
};
|
|
982
|
+
setTagValue = function setTagValue(t, value) {
|
|
983
|
+
var i;
|
|
984
|
+
for(i = 0; i < tags.length; ++i){
|
|
985
|
+
if (tags[i].type === t.type && tags[i].section === t.section) {
|
|
986
|
+
tags.value = value;
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
};
|
|
991
|
+
}
|
|
992
|
+
jpeg.parseSections(stream, function(sectionType, sectionStream) {
|
|
993
|
+
var validExifHeaders, sectionOffset = sectionStream.offsetFrom(start);
|
|
994
|
+
if (sectionType === 0xE1) {
|
|
995
|
+
validExifHeaders = exif.parseTags(sectionStream, function(ifdSection, tagType, value, format) {
|
|
996
|
+
//ignore binary fields if disabled
|
|
997
|
+
if (!flags.readBinaryTags && format === 7) {
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
if (tagType === 0x0201) {
|
|
1001
|
+
thumbnailOffset = value[0];
|
|
1002
|
+
if (flags.hidePointers) {
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
} else if (tagType === 0x0202) {
|
|
1006
|
+
thumbnailLength = value[0];
|
|
1007
|
+
if (flags.hidePointers) {
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
} else if (tagType === 0x0103) {
|
|
1011
|
+
thumbnailType = value[0];
|
|
1012
|
+
if (flags.hidePointers) {
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
//if flag is set to not store tags, return here after storing pointers
|
|
1017
|
+
if (!flags.returnTags) {
|
|
1018
|
+
return;
|
|
1019
|
+
}
|
|
1020
|
+
if (flags.simplifyValues) {
|
|
1021
|
+
value = simplify.simplifyValue(value, format);
|
|
1022
|
+
}
|
|
1023
|
+
if (flags.resolveTagNames) {
|
|
1024
|
+
var sectionTagNames = ifdSection === exif.GPSIFD ? tagNames.gps : tagNames.exif;
|
|
1025
|
+
var name = sectionTagNames[tagType];
|
|
1026
|
+
if (!name) {
|
|
1027
|
+
name = tagNames.exif[tagType];
|
|
1028
|
+
}
|
|
1029
|
+
if (!tags.hasOwnProperty(name)) {
|
|
1030
|
+
tags[name] = value;
|
|
1031
|
+
}
|
|
1032
|
+
} else {
|
|
1033
|
+
tags.push({
|
|
1034
|
+
section: ifdSection,
|
|
1035
|
+
type: tagType,
|
|
1036
|
+
value: value
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1039
|
+
});
|
|
1040
|
+
if (validExifHeaders) {
|
|
1041
|
+
app1Offset = sectionOffset;
|
|
1042
|
+
}
|
|
1043
|
+
} else if (flags.imageSize && jpeg.getSectionName(sectionType).name === "SOF") {
|
|
1044
|
+
imageSize = jpeg.getSizeFromSOFSection(sectionStream);
|
|
1045
|
+
}
|
|
1046
|
+
});
|
|
1047
|
+
if (flags.simplifyValues) {
|
|
1048
|
+
simplify.castDegreeValues(getTagValue, setTagValue);
|
|
1049
|
+
simplify.castDateValues(getTagValue, setTagValue);
|
|
1050
|
+
}
|
|
1051
|
+
return new ExifResult(start, tags, imageSize, thumbnailOffset, thumbnailLength, thumbnailType, app1Offset);
|
|
1052
|
+
}
|
|
1053
|
+
};
|
|
1054
|
+
var parser = Parser$1;
|
|
1055
|
+
|
|
1056
|
+
/*jslint browser: true, devel: true, bitwise: false, debug: true, eqeq: false, es5: true, evil: false, forin: false, newcap: false, nomen: true, plusplus: true, regexp: false, unparam: false, sloppy: true, stupid: false, sub: false, todo: true, vars: true, white: true */
|
|
1057
|
+
|
|
1058
|
+
function DOMBufferStream(arrayBuffer, offset, length, bigEndian, global, parentOffset) {
|
|
1059
|
+
this.global = global;
|
|
1060
|
+
offset = offset || 0;
|
|
1061
|
+
length = length || arrayBuffer.byteLength - offset;
|
|
1062
|
+
this.arrayBuffer = arrayBuffer.slice(offset, offset + length);
|
|
1063
|
+
this.view = new global.DataView(this.arrayBuffer, 0, this.arrayBuffer.byteLength);
|
|
1064
|
+
this.setBigEndian(bigEndian);
|
|
1065
|
+
this.offset = 0;
|
|
1066
|
+
this.parentOffset = (parentOffset || 0) + offset;
|
|
1067
|
+
}
|
|
1068
|
+
DOMBufferStream.prototype = {
|
|
1069
|
+
setBigEndian: function setBigEndian(bigEndian) {
|
|
1070
|
+
this.littleEndian = !bigEndian;
|
|
1071
|
+
},
|
|
1072
|
+
nextUInt8: function nextUInt8() {
|
|
1073
|
+
var value = this.view.getUint8(this.offset);
|
|
1074
|
+
this.offset += 1;
|
|
1075
|
+
return value;
|
|
1076
|
+
},
|
|
1077
|
+
nextInt8: function nextInt8() {
|
|
1078
|
+
var value = this.view.getInt8(this.offset);
|
|
1079
|
+
this.offset += 1;
|
|
1080
|
+
return value;
|
|
1081
|
+
},
|
|
1082
|
+
nextUInt16: function nextUInt16() {
|
|
1083
|
+
var value = this.view.getUint16(this.offset, this.littleEndian);
|
|
1084
|
+
this.offset += 2;
|
|
1085
|
+
return value;
|
|
1086
|
+
},
|
|
1087
|
+
nextUInt32: function nextUInt32() {
|
|
1088
|
+
var value = this.view.getUint32(this.offset, this.littleEndian);
|
|
1089
|
+
this.offset += 4;
|
|
1090
|
+
return value;
|
|
1091
|
+
},
|
|
1092
|
+
nextInt16: function nextInt16() {
|
|
1093
|
+
var value = this.view.getInt16(this.offset, this.littleEndian);
|
|
1094
|
+
this.offset += 2;
|
|
1095
|
+
return value;
|
|
1096
|
+
},
|
|
1097
|
+
nextInt32: function nextInt32() {
|
|
1098
|
+
var value = this.view.getInt32(this.offset, this.littleEndian);
|
|
1099
|
+
this.offset += 4;
|
|
1100
|
+
return value;
|
|
1101
|
+
},
|
|
1102
|
+
nextFloat: function nextFloat() {
|
|
1103
|
+
var value = this.view.getFloat32(this.offset, this.littleEndian);
|
|
1104
|
+
this.offset += 4;
|
|
1105
|
+
return value;
|
|
1106
|
+
},
|
|
1107
|
+
nextDouble: function nextDouble() {
|
|
1108
|
+
var value = this.view.getFloat64(this.offset, this.littleEndian);
|
|
1109
|
+
this.offset += 8;
|
|
1110
|
+
return value;
|
|
1111
|
+
},
|
|
1112
|
+
nextBuffer: function nextBuffer(length) {
|
|
1113
|
+
//this won't work in IE10
|
|
1114
|
+
var value = this.arrayBuffer.slice(this.offset, this.offset + length);
|
|
1115
|
+
this.offset += length;
|
|
1116
|
+
return value;
|
|
1117
|
+
},
|
|
1118
|
+
remainingLength: function remainingLength() {
|
|
1119
|
+
return this.arrayBuffer.byteLength - this.offset;
|
|
1120
|
+
},
|
|
1121
|
+
nextString: function nextString(length) {
|
|
1122
|
+
var value = this.arrayBuffer.slice(this.offset, this.offset + length);
|
|
1123
|
+
value = String.fromCharCode.apply(null, new this.global.Uint8Array(value));
|
|
1124
|
+
this.offset += length;
|
|
1125
|
+
return value;
|
|
1126
|
+
},
|
|
1127
|
+
mark: function mark() {
|
|
1128
|
+
var self = this;
|
|
1129
|
+
return {
|
|
1130
|
+
openWithOffset: function openWithOffset(offset) {
|
|
1131
|
+
offset = (offset || 0) + this.offset;
|
|
1132
|
+
return new DOMBufferStream(self.arrayBuffer, offset, self.arrayBuffer.byteLength - offset, !self.littleEndian, self.global, self.parentOffset);
|
|
1133
|
+
},
|
|
1134
|
+
offset: this.offset,
|
|
1135
|
+
getParentOffset: function getParentOffset() {
|
|
1136
|
+
return self.parentOffset;
|
|
1137
|
+
}
|
|
1138
|
+
};
|
|
1139
|
+
},
|
|
1140
|
+
offsetFrom: function offsetFrom(marker) {
|
|
1141
|
+
return this.parentOffset + this.offset - (marker.offset + marker.getParentOffset());
|
|
1142
|
+
},
|
|
1143
|
+
skip: function skip(amount) {
|
|
1144
|
+
this.offset += amount;
|
|
1145
|
+
},
|
|
1146
|
+
branch: function branch(offset, length) {
|
|
1147
|
+
length = typeof length === "number" ? length : this.arrayBuffer.byteLength - (this.offset + offset);
|
|
1148
|
+
return new DOMBufferStream(this.arrayBuffer, this.offset + offset, length, !this.littleEndian, this.global, this.parentOffset);
|
|
1149
|
+
}
|
|
1150
|
+
};
|
|
1151
|
+
var domBufferstream = DOMBufferStream;
|
|
1152
|
+
|
|
1153
|
+
function BufferStream(buffer, offset, length, bigEndian) {
|
|
1154
|
+
this.buffer = buffer;
|
|
1155
|
+
this.offset = offset || 0;
|
|
1156
|
+
length = typeof length === "number" ? length : buffer.length;
|
|
1157
|
+
this.endPosition = this.offset + length;
|
|
1158
|
+
this.setBigEndian(bigEndian);
|
|
1159
|
+
}
|
|
1160
|
+
BufferStream.prototype = {
|
|
1161
|
+
setBigEndian: function setBigEndian(bigEndian) {
|
|
1162
|
+
this.bigEndian = !!bigEndian;
|
|
1163
|
+
},
|
|
1164
|
+
nextUInt8: function nextUInt8() {
|
|
1165
|
+
var value = this.buffer.readUInt8(this.offset);
|
|
1166
|
+
this.offset += 1;
|
|
1167
|
+
return value;
|
|
1168
|
+
},
|
|
1169
|
+
nextInt8: function nextInt8() {
|
|
1170
|
+
var value = this.buffer.readInt8(this.offset);
|
|
1171
|
+
this.offset += 1;
|
|
1172
|
+
return value;
|
|
1173
|
+
},
|
|
1174
|
+
nextUInt16: function nextUInt16() {
|
|
1175
|
+
var value = this.bigEndian ? this.buffer.readUInt16BE(this.offset) : this.buffer.readUInt16LE(this.offset);
|
|
1176
|
+
this.offset += 2;
|
|
1177
|
+
return value;
|
|
1178
|
+
},
|
|
1179
|
+
nextUInt32: function nextUInt32() {
|
|
1180
|
+
var value = this.bigEndian ? this.buffer.readUInt32BE(this.offset) : this.buffer.readUInt32LE(this.offset);
|
|
1181
|
+
this.offset += 4;
|
|
1182
|
+
return value;
|
|
1183
|
+
},
|
|
1184
|
+
nextInt16: function nextInt16() {
|
|
1185
|
+
var value = this.bigEndian ? this.buffer.readInt16BE(this.offset) : this.buffer.readInt16LE(this.offset);
|
|
1186
|
+
this.offset += 2;
|
|
1187
|
+
return value;
|
|
1188
|
+
},
|
|
1189
|
+
nextInt32: function nextInt32() {
|
|
1190
|
+
var value = this.bigEndian ? this.buffer.readInt32BE(this.offset) : this.buffer.readInt32LE(this.offset);
|
|
1191
|
+
this.offset += 4;
|
|
1192
|
+
return value;
|
|
1193
|
+
},
|
|
1194
|
+
nextFloat: function nextFloat() {
|
|
1195
|
+
var value = this.bigEndian ? this.buffer.readFloatBE(this.offset) : this.buffer.readFloatLE(this.offset);
|
|
1196
|
+
this.offset += 4;
|
|
1197
|
+
return value;
|
|
1198
|
+
},
|
|
1199
|
+
nextDouble: function nextDouble() {
|
|
1200
|
+
var value = this.bigEndian ? this.buffer.readDoubleBE(this.offset) : this.buffer.readDoubleLE(this.offset);
|
|
1201
|
+
this.offset += 8;
|
|
1202
|
+
return value;
|
|
1203
|
+
},
|
|
1204
|
+
nextBuffer: function nextBuffer(length) {
|
|
1205
|
+
var value = this.buffer.slice(this.offset, this.offset + length);
|
|
1206
|
+
this.offset += length;
|
|
1207
|
+
return value;
|
|
1208
|
+
},
|
|
1209
|
+
remainingLength: function remainingLength() {
|
|
1210
|
+
return this.endPosition - this.offset;
|
|
1211
|
+
},
|
|
1212
|
+
nextString: function nextString(length) {
|
|
1213
|
+
var value = this.buffer.toString("utf8", this.offset, this.offset + length);
|
|
1214
|
+
this.offset += length;
|
|
1215
|
+
return value;
|
|
1216
|
+
},
|
|
1217
|
+
mark: function mark() {
|
|
1218
|
+
var self = this;
|
|
1219
|
+
return {
|
|
1220
|
+
openWithOffset: function openWithOffset(offset) {
|
|
1221
|
+
offset = (offset || 0) + this.offset;
|
|
1222
|
+
return new BufferStream(self.buffer, offset, self.endPosition - offset, self.bigEndian);
|
|
1223
|
+
},
|
|
1224
|
+
offset: this.offset
|
|
1225
|
+
};
|
|
1226
|
+
},
|
|
1227
|
+
offsetFrom: function offsetFrom(marker) {
|
|
1228
|
+
return this.offset - marker.offset;
|
|
1229
|
+
},
|
|
1230
|
+
skip: function skip(amount) {
|
|
1231
|
+
this.offset += amount;
|
|
1232
|
+
},
|
|
1233
|
+
branch: function branch(offset, length) {
|
|
1234
|
+
length = typeof length === "number" ? length : this.endPosition - (this.offset + offset);
|
|
1235
|
+
return new BufferStream(this.buffer, this.offset + offset, length, this.bigEndian);
|
|
1236
|
+
}
|
|
1237
|
+
};
|
|
1238
|
+
var bufferstream = BufferStream;
|
|
1239
|
+
|
|
1240
|
+
function _instanceof(left, right) {
|
|
1241
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
1242
|
+
return !!right[Symbol.hasInstance](left);
|
|
1243
|
+
} else {
|
|
1244
|
+
return left instanceof right;
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
var Parser = parser;
|
|
1248
|
+
function getGlobal() {
|
|
1249
|
+
return (0, eval)("this");
|
|
1250
|
+
}
|
|
1251
|
+
var exifParser = {
|
|
1252
|
+
create: function create(buffer, global) {
|
|
1253
|
+
global = global || getGlobal();
|
|
1254
|
+
if (_instanceof(buffer, global.ArrayBuffer)) {
|
|
1255
|
+
var DOMBufferStream = domBufferstream;
|
|
1256
|
+
return new Parser(new DOMBufferStream(buffer, 0, buffer.byteLength, true, global));
|
|
1257
|
+
} else {
|
|
1258
|
+
var NodeBufferStream = bufferstream;
|
|
1259
|
+
return new Parser(new NodeBufferStream(buffer, 0, buffer.length, true));
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
};
|
|
1263
|
+
|
|
1264
|
+
let ExifService = class ExifService {
|
|
1265
|
+
async parse(params, _pinsSettingsList, context) {
|
|
1266
|
+
const { content } = params;
|
|
1267
|
+
const buffer = Buffer.from(content.replace(/^data:.*;base64,/, ''), 'base64');
|
|
1268
|
+
const parse = exifParser.create(buffer);
|
|
1269
|
+
return parse.parse();
|
|
1270
|
+
}
|
|
1271
|
+
};
|
|
1272
|
+
const parse = (params, pinsSettingsList, context)=>new ExifService().parse(params, pinsSettingsList, context);
|
|
1273
|
+
|
|
1274
|
+
export { parse };
|