GDAL
|
00001 /****************************************************************************** 00002 * $Id: gdalexif.h 24549 2012-06-09 20:14:14Z rouault $ 00003 * 00004 * Project: JPEG JFIF Driver 00005 * Purpose: Implement GDAL JPEG Support based on IJG libjpeg. 00006 * Author: Frank Warmerdam, warmerdam@pobox.com 00007 * 00008 ****************************************************************************** 00009 * Copyright (c) 2000, Frank Warmerdam 00010 * 00011 * Permission is hereby granted, free of charge, to any person obtaining a 00012 * copy of this software and associated documentation files (the "Software"), 00013 * to deal in the Software without restriction, including without limitation 00014 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00015 * and/or sell copies of the Software, and to permit persons to whom the 00016 * Software is furnished to do so, subject to the following conditions: 00017 * 00018 * The above copyright notice and this permission notice shall be included 00019 * in all copies or substantial portions of the Software. 00020 * 00021 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00022 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00023 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00024 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00025 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00026 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00027 * DEALINGS IN THE SOFTWARE. 00028 ****************************************************************************/ 00029 00030 #define EXIFOFFSETTAG 0x8769 00031 #define INTEROPERABILITYOFFSET 0xA005 00032 #define GPSOFFSETTAG 0x8825 00033 #define MAXSTRINGLENGTH 65535 00034 00035 #ifdef RENAME_INTERNAL_LIBTIFF_SYMBOLS 00036 #include "../frmts/gtiff/libtiff/gdal_libtiff_symbol_rename.h" 00037 #endif 00038 00039 static const struct gpsname { 00040 GUInt16 tag; 00041 const char* name; 00042 } gpstags [] = { 00043 { 0x00, "EXIF_GPSVersionID" }, 00044 { 0x01, "EXIF_GPSLatitudeRef" }, 00045 { 0x02, "EXIF_GPSLatitude" }, 00046 { 0x03, "EXIF_GPSLongitudeRef" }, 00047 { 0x04, "EXIF_GPSLongitude" }, 00048 { 0x05, "EXIF_GPSAltitudeRef" }, 00049 { 0x06, "EXIF_GPSAltitude" }, 00050 { 0x07, "EXIF_GPSTimeStamp" }, 00051 { 0x08, "EXIF_GPSSatellites" }, 00052 { 0x09, "EXIF_GPSStatus" }, 00053 { 0x0a, "EXIF_GPSMeasureMode" }, 00054 { 0x0b, "EXIF_GPSDOP" }, 00055 { 0x0c, "EXIF_GPSSpeedRef"}, 00056 { 0x0d, "EXIF_GPSSpeed"}, 00057 { 0x0e, "EXIF_GPSTrackRef"}, 00058 { 0x0f, "EXIF_GPSTrack"}, 00059 { 0x10, "EXIF_GPSImgDirectionRef"}, 00060 { 0x11, "EXIF_GPSImgDirection"}, 00061 { 0x12, "EXIF_GPSMapDatum"}, 00062 { 0x13, "EXIF_GPSDestLatitudeRef"}, 00063 { 0x14, "EXIF_GPSDestLatitude"}, 00064 { 0x15, "EXIF_GPSDestLongitudeRef"}, 00065 { 0x16, "EXIF_GPSDestLongitude"}, 00066 { 0x17, "EXIF_GPSDestBearingRef"}, 00067 { 0x18, "EXIF_GPSDestBearing"}, 00068 { 0x19, "EXIF_GPSDestDistanceRef"}, 00069 { 0x1a, "EXIF_GPSDestDistance"}, 00070 { 0x1b, "EXIF_GPSProcessingMethod"}, 00071 { 0x1c, "EXIF_GPSAreaInformation"}, 00072 { 0x1d, "EXIF_GPSDateStamp"}, 00073 { 0x1e, "EXIF_GPSDifferential"}, 00074 { 0xffff, ""} 00075 }; 00076 00077 static const struct tagname { 00078 GUInt16 tag; 00079 const char* name; 00080 } tagnames [] = { 00081 00082 // { 0x100, "EXIF_Image_Width"}, 00083 // { 0x101, "EXIF_Image_Length"}, 00084 { 0x102, "EXIF_BitsPerSample"}, 00085 { 0x103, "EXIF_Compression"}, 00086 { 0x106, "EXIF_PhotometricInterpretation"}, 00087 { 0x10A, "EXIF_Fill_Order"}, 00088 { 0x10D, "EXIF_Document_Name"}, 00089 { 0x10E, "EXIF_ImageDescription"}, 00090 { 0x10F, "EXIF_Make"}, 00091 { 0x110, "EXIF_Model"}, 00092 { 0x111, "EXIF_StripOffsets"}, 00093 { 0x112, "EXIF_Orientation"}, 00094 { 0x115, "EXIF_SamplesPerPixel"}, 00095 { 0x116, "EXIF_RowsPerStrip"}, 00096 { 0x117, "EXIF_StripByteCounts"}, 00097 { 0x11A, "EXIF_XResolution"}, 00098 { 0x11B, "EXIF_YResolution"}, 00099 { 0x11C, "EXIF_PlanarConfiguration"}, 00100 { 0x128, "EXIF_ResolutionUnit"}, 00101 { 0x12D, "EXIF_TransferFunction"}, 00102 { 0x131, "EXIF_Software"}, 00103 { 0x132, "EXIF_DateTime"}, 00104 { 0x13B, "EXIF_Artist"}, 00105 { 0x13E, "EXIF_WhitePoint"}, 00106 { 0x13F, "EXIF_PrimaryChromaticities"}, 00107 { 0x156, "EXIF_Transfer_Range"}, 00108 { 0x200, "EXIF_JPEG_Proc"}, 00109 { 0x201, "EXIF_JPEGInterchangeFormat"}, 00110 { 0x202, "EXIF_JPEGInterchangeFormatLength"}, 00111 { 0x211, "EXIF_YCbCrCoefficients"}, 00112 { 0x212, "EXIF_YCbCrSubSampling"}, 00113 { 0x213, "EXIF_YCbCrPositioning"}, 00114 { 0x214, "EXIF_ReferenceBlackWhite"}, 00115 { 0x828D, "EXIF_CFA_Repeat_Pattern_Dim"}, 00116 { 0x828E, "EXIF_CFA_Pattern"}, 00117 { 0x828F, "EXIF_Battery_Level"}, 00118 { 0x8298, "EXIF_Copyright"}, 00119 { 0x829A, "EXIF_ExposureTime"}, 00120 { 0x829D, "EXIF_FNumber"}, 00121 { 0x83BB, "EXIF_IPTC/NAA"}, 00122 // { 0x8769, "EXIF_Offset"}, 00123 { 0x8773, "EXIF_Inter_Color_Profile"}, 00124 { 0x8822, "EXIF_ExposureProgram"}, 00125 { 0x8824, "EXIF_SpectralSensitivity"}, 00126 // { 0x8825, "EXIF_GPSOffset"}, 00127 { 0x8827, "EXIF_ISOSpeedRatings"}, 00128 { 0x8828, "EXIF_OECF"}, 00129 { 0x9000, "EXIF_ExifVersion"}, 00130 { 0x9003, "EXIF_DateTimeOriginal"}, 00131 { 0x9004, "EXIF_DateTimeDigitized"}, 00132 { 0x9101, "EXIF_ComponentsConfiguration"}, 00133 { 0x9102, "EXIF_CompressedBitsPerPixel"}, 00134 { 0x9201, "EXIF_ShutterSpeedValue"}, 00135 { 0x9202, "EXIF_ApertureValue"}, 00136 { 0x9203, "EXIF_BrightnessValue"}, 00137 { 0x9204, "EXIF_ExposureBiasValue"}, 00138 { 0x9205, "EXIF_MaxApertureValue"}, 00139 { 0x9206, "EXIF_SubjectDistance"}, 00140 { 0x9207, "EXIF_MeteringMode"}, 00141 { 0x9208, "EXIF_LightSource"}, 00142 { 0x9209, "EXIF_Flash"}, 00143 { 0x920A, "EXIF_FocalLength"}, 00144 { 0x9214, "EXIF_SubjectArea"}, 00145 { 0x927C, "EXIF_MakerNote"}, 00146 { 0x9286, "EXIF_UserComment"}, 00147 { 0x9290, "EXIF_SubSecTime"}, 00148 { 0x9291, "EXIF_SubSecTime_Original"}, 00149 { 0x9292, "EXIF_SubSecTime_Digitized"}, 00150 { 0xA000, "EXIF_FlashpixVersion"}, 00151 { 0xA001, "EXIF_ColorSpace"}, 00152 { 0xA002, "EXIF_PixelXDimension"}, 00153 { 0xA003, "EXIF_PixelYDimension"}, 00154 { 0xA004, "EXIF_RelatedSoundFile"}, 00155 // { 0xA005, "EXIF_InteroperabilityOffset"}, 00156 { 0xA20B, "EXIF_FlashEnergy"}, // 0x920B in TIFF/EP 00157 { 0xA20C, "EXIF_SpatialFrequencyResponse"}, // 0x920C - - 00158 { 0xA20E, "EXIF_FocalPlaneXResolution"}, // 0x920E - - 00159 { 0xA20F, "EXIF_FocalPlaneYResolution"}, // 0x920F - - 00160 { 0xA210, "EXIF_FocalPlaneResolutionUnit"}, // 0x9210 - - 00161 { 0xA214, "EXIF_SubjectLocation"}, // 0x9214 - - 00162 { 0xA215, "EXIF_ExposureIndex"}, // 0x9215 - - 00163 { 0xA217, "EXIF_SensingMethod"}, // 0x9217 - - 00164 { 0xA300, "EXIF_FileSource"}, 00165 { 0xA301, "EXIF_SceneType"}, 00166 { 0xA302, "EXIF_CFAPattern"}, 00167 { 0xA401, "EXIF_CustomRendered"}, 00168 { 0xA402, "EXIF_ExposureMode"}, 00169 { 0XA403, "EXIF_WhiteBalance"}, 00170 { 0xA404, "EXIF_DigitalZoomRatio"}, 00171 { 0xA405, "EXIF_FocalLengthIn35mmFilm"}, 00172 { 0xA406, "EXIF_SceneCaptureType"}, 00173 { 0xA407, "EXIF_GainControl"}, 00174 { 0xA408, "EXIF_Contrast"}, 00175 { 0xA409, "EXIF_Saturation"}, 00176 { 0xA40A, "EXIF_Sharpness"}, 00177 { 0xA40B, "EXIF_DeviceSettingDescription"}, 00178 { 0xA40C, "EXIF_SubjectDistanceRange"}, 00179 { 0xA420, "EXIF_ImageUniqueID"}, 00180 { 0x0000, ""} 00181 }; 00182 00183 00184 static const struct intr_tag { 00185 GInt16 tag; 00186 const char* name; 00187 } intr_tags [] = { 00188 00189 { 0x1, "EXIF_Interoperability_Index"}, 00190 { 0x2, "EXIF_Interoperability_Version"}, 00191 { 0x1000, "EXIF_Related_Image_File_Format"}, 00192 { 0x1001, "EXIF_Related_Image_Width"}, 00193 { 0x1002, "EXIF_Related_Image_Length"}, 00194 { 0x0000, ""} 00195 }; 00196 00197 typedef enum { 00198 TIFF_NOTYPE = 0, /* placeholder */ 00199 TIFF_BYTE = 1, /* 8-bit unsigned integer */ 00200 TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ 00201 TIFF_SHORT = 3, /* 16-bit unsigned integer */ 00202 TIFF_LONG = 4, /* 32-bit unsigned integer */ 00203 TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ 00204 TIFF_SBYTE = 6, /* !8-bit signed integer */ 00205 TIFF_UNDEFINED = 7, /* !8-bit untyped data */ 00206 TIFF_SSHORT = 8, /* !16-bit signed integer */ 00207 TIFF_SLONG = 9, /* !32-bit signed integer */ 00208 TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ 00209 TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ 00210 TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */ 00211 TIFF_IFD = 13 /* %32-bit unsigned integer (offset) */ 00212 } TIFFDataType; 00213 00214 /* 00215 * TIFF Image File Directories are comprised of a table of field 00216 * descriptors of the form shown below. The table is sorted in 00217 * ascending order by tag. The values associated with each entry are 00218 * disjoint and may appear anywhere in the file (so long as they are 00219 * placed on a word boundary). 00220 * 00221 * If the value is 4 bytes or less, then it is placed in the offset 00222 * field to save space. If the value is less than 4 bytes, it is 00223 * left-justified in the offset field. 00224 */ 00225 typedef struct { 00226 GUInt16 tdir_tag; /* see below */ 00227 GUInt16 tdir_type; /* data type; see below */ 00228 GUInt32 tdir_count; /* number of items; length in spec */ 00229 GUInt32 tdir_offset; /* byte offset to field data */ 00230 } TIFFDirEntry; 00231 00232 CPL_C_START 00233 extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */ 00234 extern void TIFFSwabShort(GUInt16*); 00235 extern void TIFFSwabLong(GUInt32*); 00236 extern void TIFFSwabDouble(double*); 00237 extern void TIFFSwabArrayOfShort(GUInt16*, unsigned long); 00238 extern void TIFFSwabArrayOfLong(GUInt32*, unsigned long); 00239 extern void TIFFSwabArrayOfDouble(double*, unsigned long); 00240 CPL_C_END 00241