65.9K
CodeProject 正在变化。 阅读更多。
Home

Cexif

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (32投票s)

2003年3月16日

1分钟阅读

viewsIcon

200039

downloadIcon

7889

一个用于读取 JPEG 图像 EXIF 数据的类。

Sample Image - cexif.png

引言

Cexif 是一个用于读取存储在 JPEG 图像中的 EXIF 数据的小型类,通常由数码相机生成。

该代码基于 Matthias Wandel 编写的 JheadJhead 提供了许多开关来解析带有 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->IsExiftrue,您可以读取 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 结构以读取更多标签。

  1. EXIFINFO 结构中声明一个新的字段(例如:float ExposureTime;
  2. exif.cpp 中定义一个新的标签(例如:#define TAG_EXPOSURETIME 0x829A)。
  3. ProcessExifDir 函数中添加一个新的 case。

示例

case TAG_EXPOSURETIME:
m_exifinfo->ExposureTime = (float)ConvertAnyFormat(ValuePtr, Format);
break;

ConvertAnyFormat 会自动转换标签中存储的值。

待办事项

  • Cexif::EncodeExif:将 EXIF 数据附加到标准的 JPEG 图像中。
© . All rights reserved.