1
// ==========================================================
2
// Tag manipulation functions
4
// Design and implementation by
5
// - Herv� Drolon <drolon@infonie.fr>
7
// This file is part of FreeImage 3
9
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
10
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
11
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
12
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
13
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
14
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
15
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
16
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
19
// Use at your own risk!
20
// ==========================================================
22
#ifndef FREEIMAGETAG_H
23
#define FREEIMAGETAG_H
25
// ==========================================================
27
// ==========================================================
29
// ----------------------------------------------------------
30
// TIFF Rev. 6.0 Attribute Information Used in Exif
31
// ----------------------------------------------------------
33
// Tags relating to image data structure
35
#define TAG_IMAGE_WIDTH 0x0100
36
#define TAG_IMAGE_HEIGHT 0x0101
37
#define TAG_BITS_PER_SAMPLE 0x0102
38
#define TAG_COMPRESSION 0x0103
39
#define TAG_PHOTOMETRIC_INTERPRETATION 0x0106
40
#define TAG_ORIENTATION 0x0112
41
#define TAG_SAMPLES_PER_PIXEL 0x0115
42
#define TAG_PLANAR_CONFIGURATION 0x011C
43
#define TAG_YCBCR_SUBSAMPLING 0x0212
44
#define TAG_YCBCR_POSITIONING 0x0213
45
#define TAG_X_RESOLUTION 0x011A
46
#define TAG_Y_RESOLUTION 0x011B
47
#define TAG_RESOLUTION_UNIT 0x0128
49
// Tags relating to recording offset
51
#define TAG_STRIP_OFFSETS 0x0111
52
#define TAG_ROWS_PER_STRIP 0x0116
53
#define TAG_STRIP_BYTE_COUNTS 0x0117
54
#define TAG_JPEG_INTERCHANGE_FORMAT 0x0201
55
#define TAG_JPEG_INTERCHANGE_FORMAT_LENGTH 0x0202
57
// Tags relating to image data characteristics
59
#define TAG_TRANSFER_FUNCTION 0x012D
60
#define TAG_WHITE_POINT 0x013E
61
#define TAG_PRIMARY_CHROMATICITIES 0x013F
62
#define TAG_YCBCR_COEFFICIENTS 0x0211
63
#define TAG_REFERENCE_BLACK_WHITE 0x0214
67
#define TAG_DATETIME 0x0132
68
#define TAG_IMAGE_DESCRIPTION 0x010E
69
#define TAG_MAKE 0x010F
70
#define TAG_MODEL 0x0110
71
#define TAG_SOFTWARE 0x0131
72
#define TAG_ARTIST 0x013B
73
#define TAG_COPYRIGHT 0x8298
75
// ----------------------------------------------------------
76
// Exif IFD Attribute Information
77
// ----------------------------------------------------------
79
// Tags relating to version
81
#define TAG_EXIF_VERSION 0x9000
82
#define TAG_FLASHPIX_VERSION 0xA000
84
// Tag relating to image data characteristics
86
#define TAG_COLOR_SPACE 0xA001
88
// Tags relating to image configuration
90
#define TAG_COMPONENTS_CONFIGURATION 0x9101
91
#define TAG_COMPRESSED_BITS_PER_PIXEL 0x9102
92
#define TAG_PIXEL_X_DIMENSION 0xA002
93
#define TAG_PIXEL_Y_DIMENSION 0xA003
95
// Tags relating to user information
97
#define TAG_MARKER_NOTE 0x927C
98
#define TAG_USER_COMMENT 0x9286
100
// Tag relating to related file information
102
#define TAG_RELATED_SOUND_FILE 0xA004
104
// Tags relating to date and time
106
#define TAG_DATETIME_ORIGINAL 0x9003
107
#define TAG_DATETIME_DIGITIZED 0x9004
108
#define TAG_SUBSECOND_TIME 0x9290
109
#define TAG_SUBSECOND_TIME_ORIGINAL 0x9291
110
#define TAG_SUBSECOND_TIME_DIGITIZED 0x9292
112
// Tags relating to picture-taking conditions
114
#define TAG_EXPOSURE_TIME 0x829A
115
#define TAG_FNUMBER 0x829D
116
#define TAG_EXPOSURE_PROGRAM 0x8822
117
#define TAG_SPECTRAL_SENSITIVITY 0x8824
118
#define TAG_ISO_SPEED_RATINGS 0x8827
119
#define TAG_OECF 0x8828
120
#define TAG_SHUTTER_SPEED_VALUE 0x9201
121
#define TAG_APERTURE_VALUE 0x9202
122
#define TAG_BRIGHTNESS_VALUE 0x9203
123
#define TAG_EXPOSURE_BIAS_VALUE 0x9204
124
#define TAG_MAX_APERTURE_VALUE 0x9205
125
#define TAG_SUBJECT_DISTANCE 0x9206
126
#define TAG_METERING_MODE 0x9207
127
#define TAG_LIGHT_SOURCE 0x9208
128
#define TAG_FLASH 0x9209
129
#define TAG_FOCAL_LENGTH 0x920A
130
#define TAG_SUBJECT_AREA 0x9214
131
#define TAG_FLASH_ENERGY 0xA20B
132
#define TAG_SPATIAL_FREQ_RESPONSE 0xA20C
133
#define TAG_FOCAL_PLANE_X_RES 0xA20E
134
#define TAG_FOCAL_PLANE_Y_RES 0xA20F
135
#define TAG_FOCAL_PLANE_UNIT 0xA210
136
#define TAG_SUBJECT_LOCATION 0xA214
137
#define TAG_EXPOSURE_INDEX 0xA215
138
#define TAG_SENSING_METHOD 0xA217
139
#define TAG_FILE_SOURCE 0xA300
140
#define TAG_SCENE_TYPE 0xA301
141
#define TAG_CFA_PATTERN 0xA302
142
#define TAG_CUSTOM_RENDERED 0xA401
143
#define TAG_EXPOSURE_MODE 0xA402
144
#define TAG_WHITE_BALANCE 0xA403
145
#define TAG_DIGITAL_ZOOM_RATIO 0xA404
146
#define TAG_FOCAL_LENGTH_IN_35MM_FILM 0xA405
147
#define TAG_SCENE_CAPTURE_TYPE 0xA406
148
#define TAG_GAIN_CONTROL 0xA407
149
#define TAG_CONTRAST 0xA408
150
#define TAG_SATURATION 0xA409
151
#define TAG_SHARPNESS 0xA40A
152
#define TAG_DEVICE_SETTING_DESCRIPTION 0xA40B
153
#define TAG_SUBJECT_DISTANCE_RANGE 0xA40C
157
#define TAG_IMAGE_UNIQUE_ID 0xA420
159
// ----------------------------------------------------------
160
// GPS Attribute Information
161
// ----------------------------------------------------------
163
#define TAG_GPS_VERSION_ID 0x0000
164
#define TAG_GPS_LATITUDE_REF 0x0001
165
#define TAG_GPS_LATITUDE 0x0002
166
#define TAG_GPS_LONGITUDE_REF 0x0003
167
#define TAG_GPS_LONGITUDE 0x0004
168
#define TAG_GPS_ALTITUDE_REF 0x0005
169
#define TAG_GPS_ALTITUDE 0x0006
170
#define TAG_GPS_TIME_STAMP 0x0007
171
#define TAG_GPS_SATELLITES 0x0008
172
#define TAG_GPS_STATUS 0x0009
173
#define TAG_GPS_MEASURE_MODE 0x000A
174
#define TAG_GPS_DOP 0x000B
175
#define TAG_GPS_SPEED_REF 0x000C
176
#define TAG_GPS_SPEED 0x000D
177
#define TAG_GPS_TRACK_REF 0x000E
178
#define TAG_GPS_TRACK 0x000F
179
#define TAG_GPS_IMG_DIRECTION_REF 0x0010
180
#define TAG_GPS_IMG_DIRECTION 0x0011
181
#define TAG_GPS_MAP_DATUM 0x0012
182
#define TAG_GPS_DEST_LATITUDE_REF 0x0013
183
#define TAG_GPS_DEST_LATITUDE 0x0014
184
#define TAG_GPS_DEST_LONGITUDE_REF 0x0015
185
#define TAG_GPS_DEST_LONGITUDE 0x0016
186
#define TAG_GPS_DEST_BEARING_REF 0x0017
187
#define TAG_GPS_DEST_BEARING 0x0018
188
#define TAG_GPS_DEST_DISTANCE_REF 0x0019
189
#define TAG_GPS_DEST_DISTANCE 0x001A
190
#define TAG_GPS_PROCESSING_METHOD 0x001B
191
#define TAG_GPS_AREA_INFORMATION 0x001C
192
#define TAG_GPS_DATE_STAMP 0x001D
193
#define TAG_GPS_DIFFERENTIAL 0x001E
195
// ==========================================================
197
// ==========================================================
199
#define TAG_RECORD_VERSION 0x0200
200
#define TAG_CAPTION 0x0278
201
#define TAG_WRITER 0x027A
202
#define TAG_HEADLINE 0x0269
203
#define TAG_SPECIAL_INSTRUCTIONS 0x0228
204
#define TAG_BY_LINE 0x0250
205
#define TAG_BY_LINE_TITLE 0x0255
206
#define TAG_CREDIT 0x026E
207
#define TAG_SOURCE 0x0273
208
#define TAG_OBJECT_NAME 0x0205
209
#define TAG_DATE_CREATED 0x0237
210
#define TAG_CITY 0x025A
211
#define TAG_PROVINCE_OR_STATE 0x025F
212
#define TAG_COUNTRY_OR_PRIMARY_LOCATION 0x0265
213
#define TAG_ORIGINAL_TRANSMISSION_REFERENCE 0x0267
214
#define TAG_CATEGORY 0x020F
215
#define TAG_SUPPLEMENTAL_CATEGORIES 0x0214
216
#define TAG_URGENCY 0x020A
217
#define TAG_KEYWORDS 0x0219
218
#define TAG_COPYRIGHT_NOTICE 0x0274
219
#define TAG_RELEASE_DATE 0x021E
220
#define TAG_RELEASE_TIME 0x0223
221
#define TAG_TIME_CREATED 0x023C
222
#define TAG_ORIGINATING_PROGRAM 0x0241
224
// ==========================================================
226
// ==========================================================
228
// tags 33550 is a private tag registered to SoftDesk, Inc
229
#define TIFFTAG_GEOPIXELSCALE 33550
230
// tags 33920-33921 are private tags registered to Intergraph, Inc
231
#define TIFFTAG_INTERGRAPH_MATRIX 33920
232
#define TIFFTAG_GEOTIEPOINTS 33922
233
// tags 34263-34264 are private tags registered to NASA-JPL Carto Group
234
#define TIFFTAG_JPL_CARTO_IFD 34263
235
#define TIFFTAG_GEOTRANSMATRIX 34264 /* New Matrix Tag replaces 33920 */
236
// tags 34735-3438 are private tags registered to SPOT Image, Inc
237
#define TIFFTAG_GEOKEYDIRECTORY 34735
238
#define TIFFTAG_GEODOUBLEPARAMS 34736
239
#define TIFFTAG_GEOASCIIPARAMS 34737
241
// ==========================================================
242
// FreeImage Animation tags
243
// ==========================================================
245
#define ANIMTAG_LOGICALWIDTH 0x0001
246
#define ANIMTAG_LOGICALHEIGHT 0x0002
247
#define ANIMTAG_GLOBALPALETTE 0x0003
248
#define ANIMTAG_LOOP 0x0004
249
#define ANIMTAG_FRAMELEFT 0x1001
250
#define ANIMTAG_FRAMETOP 0x1002
251
#define ANIMTAG_NOLOCALPALETTE 0x1003
252
#define ANIMTAG_INTERLACED 0x1004
253
#define ANIMTAG_FRAMETIME 0x1005
254
#define ANIMTAG_DISPOSALMETHOD 0x1006
256
// --------------------------------------------------------------------------
257
// Helper functions to deal with the FITAG structure
258
// --------------------------------------------------------------------------
261
Describes the tag format descriptor
262
@param type Tag data type
263
@return Returns the width of a single element, in bytes
264
@see FREE_IMAGE_MDTYPE
266
int FreeImage_TagDataWidth(WORD type);
268
// --------------------------------------------------------------------------
271
Structure to hold a tag information
273
typedef struct tagTagInfo {
274
WORD tag; // Tag ID (required)
275
char *fieldname; // Field name (required)
276
char *description; // Field description (may be NULL)
281
Class to hold tag information (based on Meyers� Singleton).<br>
285
TagLib& s = TagLib::instance();
286
TagInfo *tag_info = s.getTagInfo(EXIF_MAIN, 0x0100);
295
internal tag info tables registered in TagLib
303
EXIF_MAKERNOTE_CANON,
304
EXIF_MAKERNOTE_CASIOTYPE1,
305
EXIF_MAKERNOTE_CASIOTYPE2,
306
EXIF_MAKERNOTE_FUJIFILM,
307
EXIF_MAKERNOTE_KYOCERA,
308
EXIF_MAKERNOTE_MINOLTA,
309
EXIF_MAKERNOTE_NIKONTYPE1,
310
EXIF_MAKERNOTE_NIKONTYPE2,
311
EXIF_MAKERNOTE_NIKONTYPE3,
312
EXIF_MAKERNOTE_OLYMPUS,
313
EXIF_MAKERNOTE_PANASONIC,
314
EXIF_MAKERNOTE_ASAHI,
315
EXIF_MAKERNOTE_PENTAX,
324
typedef std::map<WORD, TagInfo*> TAGINFO;
325
typedef std::map<int, TAGINFO*> TABLEMAP;
327
/// store hash tables for all known tag info tables
332
Constructor (private)<br>
333
This is where the tag info tables are initialized.
334
@see addMetadataModel
338
/// Assignement operator (disabled)
339
void operator=(TagLib&);
341
/// Copy constructor (disabled)
342
TagLib(const TagLib&);
345
Used in the constructor to initialize the tag tables
346
@param md_model Internal metadata model
347
@param tag_table Tag info table
348
@return Returns TRUE if successful, returns FALSE otherwise
350
BOOL addMetadataModel(MDMODEL md_model, TagInfo *tag_table);
357
@return Returns a reference to the TagLib instance
359
static TagLib& instance();
362
Given a tag ID, returns its TagInfo descriptor
363
@param md_model Internal metadata model
365
@return Returns the TagInfo descriptor if successful, returns NULL otherwise
367
const TagInfo* getTagInfo(MDMODEL md_model, WORD tagID);
370
Given a tag ID, returns its tag field name.
371
When the tag is unknown and defaultKey is not NULL, a string such as "Tag 0x1234" is returned.
372
This string is contained in the provided defaultKey buffer (assumed to be an array of at least 16 chars).
373
@param md_model Internal metadata model
375
@param defaultKey Assumed to be an array of 16 chars. If not NULL, build a key for unknown tags
376
@return Returns the tag field name if successful, returns an 'unknown tag' string contained in defaultKey otherwise
378
const char* getTagFieldName(MDMODEL md_model, WORD tagID, char *defaultKey);
381
Given a tag ID, returns its description.
382
When the tag has no description, a NULL value is returned.
383
@param md_model Internal metadata model
385
@return Returns the tag description if successful, returns NULL otherwise
387
const char* getTagDescription(MDMODEL md_model, WORD tagID);
390
Given a tag field name, returns its tag ID.
391
When the tag doesn't exists, a value '-1' is returned.
392
@param md_model Internal metadata model
393
@param key tag field name
394
@return Returns the tag ID if successful, returns -1 otherwise
396
int getTagID(MDMODEL md_model, const char *key);
399
Perform a conversion between internal metadata models and FreeImage public metadata models
400
@param md_model Internal metadata model
402
FREE_IMAGE_MDMODEL getFreeImageModel(MDMODEL model);
406
// --------------------------------------------------------------------------
408
// --------------------------------------------------------------------------
410
/// Name of the XMP field
411
static char *g_TagLib_XMPFieldName = "XMLPacket";
413
// --------------------------------------------------------------------------
415
// --------------------------------------------------------------------------
417
#if defined(__cplusplus)
422
BOOL jpeg_read_exif_profile(FIBITMAP *dib, const BYTE *dataptr, unsigned int datalen);
424
// JPEG / TIFF IPTC profile
425
BOOL read_iptc_profile(FIBITMAP *dib, const BYTE *dataptr, unsigned int datalen);
426
BOOL write_iptc_profile(FIBITMAP *dib, BYTE **profile, unsigned *profile_size);
428
#if defined(__cplusplus)
433
#endif // FREEIMAGETAG_H