Cexif






4.65/5 (32投票s)
2003年3月16日
1分钟阅读

200039

7889
一个用于读取 JPEG 图像 EXIF 数据的类。
引言
Cexif
是一个用于读取存储在 JPEG 图像中的 EXIF 数据的小型类,通常由数码相机生成。
该代码基于 Matthias Wandel 编写的 Jhead。 Jhead 提供了许多开关来解析带有 EXIF 标签的图像,但它是纯 C 语言编写的。我只是将函数和全局变量重新排列成一个简单的类。
关于此主题的另一个有用的文章是 此处 [^],其中包含有关 EXIF 结构的一些细节。 “数字静止图像文件格式标准(用于数码静止相机的可交换图像文件格式:Exif)版本 2.1”的官方文档可以从 http://www.bbs-informatique.fr/pdf/photo/Exif_2-1.pdf [^] 下载。
您可以在 http://www.exif.org/samples.html 找到一些带有 EXIF 数据的图像。
使用代码
您可以使用这种类两种方式。最简单的方法是
Cexif exif; exif.DecodeExif(hFile);
其中 hFile
是一个有效的的文件句柄。如果文件包含 EXIF 数据,则 exif.m_exifinfo->IsExif
为 true
,您可以读取 exif.m_exifinfo
中的字段以生成报告。第二种方法是
EXIFINFO m_exifinfo; memset(&m_exifinfo,0,sizeof(EXIFINFO)); Cexif exif(&m_exifinfo); exif.DecodeExif(hFile);
在这种情况下,结果存储在变量 m_exifinfo
中,您可以删除 exif
对象而不会丢失 EXIF 数据。
更多 EXIF 标签
typedef struct tag_ExifInfo { char Version [5]; char CameraMake [32]; char CameraModel [40]; char DateTime [20]; int Height, Width; int Orientation; int IsColor; int Process; int FlashUsed; float FocalLength; float ExposureTime; float ApertureFNumber; float Distance; float CCDWidth; float ExposureBias; int Whitebalance; int MeteringMode; int ExposureProgram; int ISOequivalent; int CompressionLevel; float FocalplaneXRes; float FocalplaneYRes; float FocalplaneUnits; float Xresolution; float Yresolution; float ResolutionUnit; float Brightness; char Comments[MAX_COMMENT]; unsigned char * ThumbnailPointer; unsigned ThumbnailSize; bool IsExif; } EXIFINFO;
如果需要,可以扩展 EXIFINFO
结构以读取更多标签。
- 在
EXIFINFO
结构中声明一个新的字段(例如:float ExposureTime;
) - 在 exif.cpp 中定义一个新的标签(例如:
#define TAG_EXPOSURETIME 0x829A
)。 - 在
ProcessExifDir
函数中添加一个新的 case。
示例
case TAG_EXPOSURETIME: m_exifinfo->ExposureTime = (float)ConvertAnyFormat(ValuePtr, Format); break;
ConvertAnyFormat
会自动转换标签中存储的值。
待办事项
Cexif::EncodeExif
:将 EXIF 数据附加到标准的 JPEG 图像中。