前一段时间要做基于flicker提供的带有exif信息的照片库给无地理信息的photos进行定位。
大部分exif的库都不是很好用,exiv2 (http://www.exiv2.org) 挺不错。但在windows下编译很烦。
//need Qt4/Qt5 support
#include <QtCore>
#include <iostream>
#include <exiv2/exiv2.hpp>
using namespace std;
using namespace Exiv2;
QStringList loadFromFile(const char* sfilename)
{
QStringList slist;
slist.clear();
QFile _file(sfilename);
if (!_file.open(QIODevice::ReadOnly))
{
cout<<"open file failed. error."<<endl;
return slist;
}
QTextStream _in(&_file);
while(!_in.atEnd())
{
QString str = _in.readLine().trimmed();
if(str.isEmpty()) continue;
slist.append(str);
}
cout<<"slist size = "<<slist.size()<<endl;
return slist;
}
int main()
{
Image::AutoPtr image = ImageFactory::open("/Users/Yaoyao/Desktop/IMG_2428.JPG");
if(image.get() == 0)
{
cout<<"read file error."<<endl;
return -1;
}
image->readMetadata();
ExifData ed = image->exifData();
if(ed.empty())
{
cout<<"ed empty error!"<<endl;
return -2;
}
//some tag location
cout<<ed["Exif.Image.GPSTag"]<<endl;
cout<<ed["Exif.GPSInfo.GPSLatitudeRef"]<<endl;
cout<<ed["Exif.GPSInfo.GPSLatitude"]<<endl;
cout<<ed["Exif.GPSInfo.GPSLongitudeRef"]<<endl;
cout<<ed["Exif.GPSInfo.GPSLongitude"]<<endl;
cout<<ed["Exif.GPSInfo.GPSAltitudeRef"]<<endl;
cout<<ed["Exif.GPSInfo.GPSAltitude"]<<endl;
cout<<ed["Exif.GPSInfo.GPSDateStamp"]<<endl;
//test
QStringList slist = loadFromFile("/Users/Yaoyao/Documents/Code/ReadPhotoExif/ReadPhotoExif/exif_tags.txt");
if(slist.size() == 0)
return -1;
foreach(QString str, slist)
{
try
{
cout<<str.toStdString().data()<<": "<<ed[str.toStdString().data()]<<endl;
}
catch (...)
{
//cout<<"[ EXCEPTION !!! ]"<<str.toStdString().data()<<endl;
continue;
}
}
image->clearExifData();
return 1;
}
其中tag标签支持:
http://www.exiv2.org/tags.html
Exif.Image.ProcessingSoftware
Exif.Image.NewSubfileType
Exif.Image.SubfileType
Exif.Image.ImageWidth
Exif.Image.ImageLength
Exif.Image.BitsPerSample
Exif.Image.Compression
Exif.Image.PhotometricInterpretation
Exif.Image.Thresholding
Exif.Image.CellWidth
Exif.Image.CellLength
Exif.Image.FillOrder
Exif.Image.DocumentName
Exif.Image.ImageDescription
Exif.Image.Make
Exif.Image.Model
Exif.Image.StripOffsets
Exif.Image.Orientation
Exif.Image.SamplesPerPixel
Exif.Image.RowsPerStrip
Exif.Image.StripByteCounts
Exif.Image.XResolution
Exif.Image.YResolution
Exif.Image.PlanarConfiguration
Exif.Image.GrayResponse