196
197
// EXIF tag reading
197
198
// ----------------------------------------------------------
201
Read a single exif tag
203
BOOL tiff_read_exif_tag(TIFF *tif, TagLib::MDMODEL md_model, FIBITMAP *dib, TagLib& tagLib, TIFFDirectory *td, ttag_t tag) {
204
const TIFFFieldInfo *fip;
207
void *raw_data = NULL;
209
if(tag == TIFFTAG_EXIFIFD) return TRUE;
211
// get the tag key - use NULL to avoid reading GeoTIFF tags
212
const char *key = tagLib.getTagFieldName(md_model, (WORD)tag, NULL);
213
if(key == NULL) return TRUE;
215
fip = TIFFFieldWithTag(tif, tag);
216
if(fip == NULL) return TRUE;
218
if(fip->field_passcount) {
219
if (fip->field_readcount != TIFF_VARIABLE2) {
220
// assume TIFF_VARIABLE
221
uint16 value_count16;
222
if(TIFFGetField(tif, tag, &value_count16, &raw_data) != 1) return TRUE;
223
value_count = value_count16;
225
if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) return TRUE;
228
if (fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2) {
230
} else if (fip->field_readcount == TIFF_SPP) {
231
value_count = td->td_samplesperpixel;
233
value_count = fip->field_readcount;
235
if (fip->field_type == TIFF_ASCII
236
|| fip->field_readcount == TIFF_VARIABLE
237
|| fip->field_readcount == TIFF_VARIABLE2
238
|| fip->field_readcount == TIFF_SPP
239
|| value_count > 1) {
240
if(TIFFGetField(tif, tag, &raw_data) != 1) return TRUE;
242
raw_data = _TIFFmalloc(_TIFFDataSize(fip->field_type) * value_count);
244
if(TIFFGetField(tif, tag, raw_data) != 1) {
252
FITAG *fitag = FreeImage_CreateTag();
259
FreeImage_SetTagID(fitag, (WORD)tag);
260
FreeImage_SetTagKey(fitag, key);
262
switch(fip->field_type) {
264
FreeImage_SetTagType(fitag, FIDT_BYTE);
265
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
266
FreeImage_SetTagCount(fitag, value_count);
267
FreeImage_SetTagValue(fitag, raw_data);
271
FreeImage_SetTagType(fitag, FIDT_UNDEFINED);
272
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
273
FreeImage_SetTagCount(fitag, value_count);
274
FreeImage_SetTagValue(fitag, raw_data);
278
FreeImage_SetTagType(fitag, FIDT_SBYTE);
279
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
280
FreeImage_SetTagCount(fitag, value_count);
281
FreeImage_SetTagValue(fitag, raw_data);
285
FreeImage_SetTagType(fitag, FIDT_SHORT);
286
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
287
FreeImage_SetTagCount(fitag, value_count);
288
FreeImage_SetTagValue(fitag, raw_data);
292
FreeImage_SetTagType(fitag, FIDT_SSHORT);
293
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
294
FreeImage_SetTagCount(fitag, value_count);
295
FreeImage_SetTagValue(fitag, raw_data);
299
FreeImage_SetTagType(fitag, FIDT_LONG);
300
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
301
FreeImage_SetTagCount(fitag, value_count);
302
FreeImage_SetTagValue(fitag, raw_data);
306
FreeImage_SetTagType(fitag, FIDT_IFD);
307
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
308
FreeImage_SetTagCount(fitag, value_count);
309
FreeImage_SetTagValue(fitag, raw_data);
313
FreeImage_SetTagType(fitag, FIDT_SLONG);
314
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
315
FreeImage_SetTagCount(fitag, value_count);
316
FreeImage_SetTagValue(fitag, raw_data);
321
// LibTIFF converts rational to floats : reconvert floats to rationals
322
DWORD *rvalue = (DWORD*)malloc(2 * value_count * sizeof(DWORD));
323
for(uint32 i = 0; i < value_count; i++) {
324
float *fv = (float*)raw_data;
325
FIRational rational(fv[i]);
326
rvalue[2*i] = rational.getNumerator();
327
rvalue[2*i+1] = rational.getDenominator();
329
FreeImage_SetTagType(fitag, FIDT_RATIONAL);
330
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
331
FreeImage_SetTagCount(fitag, value_count);
332
FreeImage_SetTagValue(fitag, rvalue);
339
// LibTIFF converts rational to floats : reconvert floats to rationals
340
LONG *rvalue = (LONG*)malloc(2 * value_count * sizeof(LONG));
341
for(uint32 i = 0; i < value_count; i++) {
342
float *fv = (float*)raw_data;
343
FIRational rational(fv[i]);
344
rvalue[2*i] = rational.getNumerator();
345
rvalue[2*i+1] = rational.getDenominator();
347
FreeImage_SetTagType(fitag, FIDT_RATIONAL);
348
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
349
FreeImage_SetTagCount(fitag, value_count);
350
FreeImage_SetTagValue(fitag, rvalue);
356
FreeImage_SetTagType(fitag, FIDT_FLOAT);
357
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
358
FreeImage_SetTagCount(fitag, value_count);
359
FreeImage_SetTagValue(fitag, raw_data);
363
FreeImage_SetTagType(fitag, FIDT_DOUBLE);
364
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
365
FreeImage_SetTagCount(fitag, value_count);
366
FreeImage_SetTagValue(fitag, raw_data);
371
size_t length = strlen((char*)raw_data) + 1;
372
FreeImage_SetTagType(fitag, FIDT_ASCII);
373
FreeImage_SetTagLength(fitag, (DWORD)length);
374
FreeImage_SetTagCount(fitag, (DWORD)length);
375
FreeImage_SetTagValue(fitag, raw_data);
380
const char *description = tagLib.getTagDescription(md_model, (WORD)tag);
382
FreeImage_SetTagDescription(fitag, description);
385
FreeImage_SetMetadata(tagLib.getFreeImageModel(md_model), dib, FreeImage_GetTagKey(fitag), fitag);
388
FreeImage_DeleteTag(fitag);
396
Read all known exif tags
199
398
BOOL tiff_read_exif_tags(TIFF *tif, TagLib::MDMODEL md_model, FIBITMAP *dib) {
203
TagLib& tagLib = TagLib::instance();
205
TIFFDirectory *td = &tif->tif_dir;
207
count = (short) TIFFGetTagListCount(tif);
208
for(i = 0; i < count; i++) {
209
ttag_t tag = TIFFGetTagListEntry(tif, i);
210
const TIFFFieldInfo *fip;
215
if(tag == TIFFTAG_EXIFIFD) continue;
217
// get the tag key - use NULL to avoid reading GeoTIFF tags
218
const char *key = tagLib.getTagFieldName(md_model, (WORD)tag, NULL);
219
if(key == NULL) continue;
221
fip = TIFFFieldWithTag(tif, tag);
225
if(fip->field_passcount) {
226
if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
229
if (fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2)
231
else if (fip->field_readcount == TIFF_SPP)
232
value_count = td->td_samplesperpixel;
234
value_count = fip->field_readcount;
235
if (fip->field_type == TIFF_ASCII
236
|| fip->field_readcount == TIFF_VARIABLE
237
|| fip->field_readcount == TIFF_VARIABLE2
238
|| fip->field_readcount == TIFF_SPP
239
|| value_count > 1) {
240
if(TIFFGetField(tif, tag, &raw_data) != 1)
243
raw_data = _TIFFmalloc(_TIFFDataSize(fip->field_type) * value_count);
245
if(TIFFGetField(tif, tag, raw_data) != 1) {
253
FITAG *fitag = FreeImage_CreateTag();
260
FreeImage_SetTagID(fitag, (WORD)tag);
261
FreeImage_SetTagKey(fitag, key);
263
switch(fip->field_type) {
265
FreeImage_SetTagType(fitag, FIDT_BYTE);
266
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
267
FreeImage_SetTagCount(fitag, value_count);
268
FreeImage_SetTagValue(fitag, raw_data);
272
FreeImage_SetTagType(fitag, FIDT_UNDEFINED);
273
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
274
FreeImage_SetTagCount(fitag, value_count);
275
FreeImage_SetTagValue(fitag, raw_data);
279
FreeImage_SetTagType(fitag, FIDT_SBYTE);
280
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
281
FreeImage_SetTagCount(fitag, value_count);
282
FreeImage_SetTagValue(fitag, raw_data);
286
FreeImage_SetTagType(fitag, FIDT_SHORT);
287
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
288
FreeImage_SetTagCount(fitag, value_count);
289
FreeImage_SetTagValue(fitag, raw_data);
293
FreeImage_SetTagType(fitag, FIDT_SSHORT);
294
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
295
FreeImage_SetTagCount(fitag, value_count);
296
FreeImage_SetTagValue(fitag, raw_data);
300
FreeImage_SetTagType(fitag, FIDT_LONG);
301
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
302
FreeImage_SetTagCount(fitag, value_count);
303
FreeImage_SetTagValue(fitag, raw_data);
307
FreeImage_SetTagType(fitag, FIDT_IFD);
308
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
309
FreeImage_SetTagCount(fitag, value_count);
310
FreeImage_SetTagValue(fitag, raw_data);
314
FreeImage_SetTagType(fitag, FIDT_SLONG);
315
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
316
FreeImage_SetTagCount(fitag, value_count);
317
FreeImage_SetTagValue(fitag, raw_data);
322
// LibTIFF converts rational to floats : reconvert floats to rationals
323
DWORD *rvalue = (DWORD*)malloc(2 * value_count * sizeof(DWORD));
324
for(uint32 i = 0; i < value_count; i++) {
325
float *fv = (float*)raw_data;
326
FIRational rational(fv[i]);
327
rvalue[2*i] = rational.getNumerator();
328
rvalue[2*i+1] = rational.getDenominator();
330
FreeImage_SetTagType(fitag, FIDT_RATIONAL);
331
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
332
FreeImage_SetTagCount(fitag, value_count);
333
FreeImage_SetTagValue(fitag, rvalue);
340
// LibTIFF converts rational to floats : reconvert floats to rationals
341
LONG *rvalue = (LONG*)malloc(2 * value_count * sizeof(LONG));
342
for(uint32 i = 0; i < value_count; i++) {
343
float *fv = (float*)raw_data;
344
FIRational rational(fv[i]);
345
rvalue[2*i] = rational.getNumerator();
346
rvalue[2*i+1] = rational.getDenominator();
348
FreeImage_SetTagType(fitag, FIDT_RATIONAL);
349
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
350
FreeImage_SetTagCount(fitag, value_count);
351
FreeImage_SetTagValue(fitag, rvalue);
357
FreeImage_SetTagType(fitag, FIDT_FLOAT);
358
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
359
FreeImage_SetTagCount(fitag, value_count);
360
FreeImage_SetTagValue(fitag, raw_data);
364
FreeImage_SetTagType(fitag, FIDT_DOUBLE);
365
FreeImage_SetTagLength(fitag, TIFFDataWidth(fip->field_type) * value_count);
366
FreeImage_SetTagCount(fitag, value_count);
367
FreeImage_SetTagValue(fitag, raw_data);
372
int length = strlen((char*)raw_data) + 1;
373
FreeImage_SetTagType(fitag, FIDT_ASCII);
374
FreeImage_SetTagLength(fitag, length);
375
FreeImage_SetTagCount(fitag, length);
376
FreeImage_SetTagValue(fitag, raw_data);
381
const char *description = tagLib.getTagDescription(md_model, (WORD)tag);
383
FreeImage_SetTagDescription(fitag, description);
386
FreeImage_SetMetadata(tagLib.getFreeImageModel(md_model), dib, FreeImage_GetTagKey(fitag), fitag);
389
FreeImage_DeleteTag(fitag);
402
TagLib& tagLib = TagLib::instance();
404
TIFFDirectory *td = &tif->tif_dir;
406
count = (short) TIFFGetTagListCount(tif);
407
for(i = 0; i < count; i++) {
408
ttag_t tag = TIFFGetTagListEntry(tif, i);
410
if (!tiff_read_exif_tag(tif, md_model, dib, tagLib, td, tag))
414
// we want to know values of standard tags too!!
415
if(md_model == FIMD_EXIF_MAIN) {
416
if(td->td_orientation && !tiff_read_exif_tag(tif, md_model, dib, tagLib, td, TIFFTAG_ORIENTATION))