C++ 阅读JPEG格式中的EXIF信息

需要对照片文件的拍摄时间进行读取,照片以".jpg"格式存储。之前以为直接读取文件创建时间就可以了,但是遍历文件得到的文件信息结构体存储的是文件在本地的一些时间,其中的文件创建时间再复制,编辑等操作之后就会发生改变,并非该照片原本的拍摄时间。后来搜索到Exif,百科中说,Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,简而言之,Exif=JPEG+拍摄参数。

用UltraEdit等二进制文件查看工具打开".jpg"格式的文件,可以发现在文件头有一部分存储了大量的非图像信息,这些其实是该图像的Exif字段,包括了拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。

网上有很多程序读取所有的拍摄参数,通过添加提供的.h和.cpp文件就可以被自己所用。由于只需要读取拍摄时间信息,就使用简单的按字符读取信息的方法就好了。

#define  TIMELINE_BEGIN 13
#define BASE 16
#define MAX_STRLEN 100

string Get_ExifTime(string fileName)
{
string ExifTime = "";

fstream fin(fileName.c_str(), ifstream::in | ifstream::binary);
if ( fin == NULL )
{
cerr << "error in open the JPG FILE" << endl;
exit(-1);
}

int offset = 0;
char str[MAX_STRLEN];
memset(str, 0, sizeof(str));

//根据文件数出来的offset
offset = TIMELINE_BEGIN * BASE + 4;
fin.seekg(offset, ifstream::beg);
fin.read(str, 19);
ExifTime = str;

fin.close();
return ExifTime;
}

 

posted on 2012-03-07 20:18  拼装小火车  阅读(7797)  评论(2编辑  收藏  举报