|
Packit |
01d647 |
// ***************************************************************** -*- C++ -*-
|
|
Packit |
01d647 |
// exifdata.cpp
|
|
Packit |
01d647 |
// Sample program to format exif data in various external formats
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
#include <exiv2/exiv2.hpp>
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
#include <iostream>
|
|
Packit |
01d647 |
#include <iomanip>
|
|
Packit |
01d647 |
#include <cassert>
|
|
Packit |
01d647 |
#include <string>
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
typedef std::map<std::string,int> format_t;
|
|
Packit |
01d647 |
typedef format_t::const_iterator format_i;
|
|
Packit |
01d647 |
typedef enum { wolf , csv , json , xml } format_e;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
void syntax(const char* argv[],format_t& formats)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::cout << "Usage: " << argv[0] << " file format" << std::endl;
|
|
Packit |
01d647 |
int count = 0;
|
|
Packit |
01d647 |
std::cout << "formats: ";
|
|
Packit |
01d647 |
for ( format_i i = formats.begin() ; i != formats.end() ; i++ ) {
|
|
Packit |
01d647 |
std::cout << ( count++ ? " | " : "") << i->first ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
std::cout << std::endl;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
size_t formatInit(Exiv2::ExifData& exifData)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
size_t result = 0;
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != exifData.end() ; ++i) {
|
|
Packit |
01d647 |
result ++ ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
return result ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
///////////////////////////////////////////////////////////////////////
|
|
Packit |
01d647 |
std::string escapeCSV(Exiv2::ExifData::const_iterator it,bool bValue)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string result ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::ostringstream os;
|
|
Packit |
01d647 |
if ( bValue ) os << it->value() ; else os << it->key() ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string s = os.str();
|
|
Packit |
01d647 |
for ( size_t i = 0 ;i < s.length() ; i ++ ) {
|
|
Packit |
01d647 |
if ( s[i] == ',' ) result += '\\';
|
|
Packit |
01d647 |
result += s[i];
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return result ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string formatCSV(Exiv2::ExifData& exifData)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
size_t count = 0;
|
|
Packit |
01d647 |
size_t length = formatInit(exifData);
|
|
Packit |
01d647 |
std::ostringstream result;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = exifData.begin(); count++ < length; ++i) {
|
|
Packit |
01d647 |
result << escapeCSV(i,false) << (count != length ? ", " : "" ) ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
result << std::endl;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
count = 0;
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = exifData.begin(); count++ < length ; ++i) {
|
|
Packit |
01d647 |
result << escapeCSV(i,true) << (count != length ? ", " : "" ) ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
return result.str();
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
///////////////////////////////////////////////////////////////////////
|
|
Packit |
01d647 |
std::string formatWolf(Exiv2::ExifData& exifData)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
size_t count = 0;
|
|
Packit |
01d647 |
size_t length = formatInit(exifData);
|
|
Packit |
01d647 |
std::ostringstream result;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
result << "{ " << std::endl;
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = exifData.begin(); count++ < length ; ++i) {
|
|
Packit |
01d647 |
result << " " << i->key() << " -> " << i->value() << (count != length ? "," : "" ) << std::endl ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
result << "}";
|
|
Packit |
01d647 |
return result.str();
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
///////////////////////////////////////////////////////////////////////
|
|
Packit |
01d647 |
std::string escapeJSON(Exiv2::ExifData::const_iterator it,bool bValue=true)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string result ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::ostringstream os;
|
|
Packit |
01d647 |
if ( bValue ) os << it->value() ; else os << it->key() ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string s = os.str();
|
|
Packit |
01d647 |
for ( size_t i = 0 ;i < s.length() ; i ++ ) {
|
|
Packit |
01d647 |
if ( s[i] == '"' ) result += "\\\"";
|
|
Packit |
01d647 |
result += s[i];
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string q = "\"";
|
|
Packit |
01d647 |
return q + result + q ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string formatJSON(Exiv2::ExifData& exifData)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
size_t count = 0;
|
|
Packit |
01d647 |
size_t length = formatInit(exifData);
|
|
Packit |
01d647 |
std::ostringstream result;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
result << "{" << std::endl ;
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = exifData.begin(); count++ < length ; ++i) {
|
|
Packit |
01d647 |
result << " " << escapeJSON(i,false) << ":" << escapeJSON(i,true) << ( count != length ? "," : "" ) << std::endl ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
result << "}";
|
|
Packit |
01d647 |
return result.str();
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
///////////////////////////////////////////////////////////////////////
|
|
Packit |
01d647 |
std::string escapeXML(Exiv2::ExifData::const_iterator it,bool bValue=true)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string result ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::ostringstream os;
|
|
Packit |
01d647 |
if ( bValue ) os << it->value() ; else os << it->key() ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string s = os.str();
|
|
Packit |
01d647 |
for ( size_t i = 0 ;i < s.length() ; i ++ ) {
|
|
Packit |
01d647 |
if ( s[i] == '<' ) result += "≶";
|
|
Packit |
01d647 |
if ( s[i] == '>' ) result += ">";
|
|
Packit |
01d647 |
result += s[i];
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return result ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string formatXML(Exiv2::ExifData& exifData)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
size_t count = 0;
|
|
Packit |
01d647 |
size_t length = formatInit(exifData);
|
|
Packit |
01d647 |
std::ostringstream result;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
result << "<exif>" << std::endl;
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = exifData.begin(); count++ < length ; ++i) {
|
|
Packit |
01d647 |
std::string key = escapeXML(i,false);
|
|
Packit |
01d647 |
std::string value = escapeXML(i,true);
|
|
Packit |
01d647 |
result << " <" << key << ">" << value << "<" << key << "/>" << std::endl ;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
result << "</exif>" << std::endl;
|
|
Packit |
01d647 |
return result.str();
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
///////////////////////////////////////////////////////////////////////
|
|
Packit |
01d647 |
int main(int argc,const char* argv[])
|
|
Packit |
01d647 |
{
|
|
Packit Service |
fb147c |
Exiv2::XmpParser::initialize();
|
|
Packit Service |
fb147c |
::atexit(Exiv2::XmpParser::terminate);
|
|
Packit Service |
fb147c |
|
|
Packit |
01d647 |
format_t formats;
|
|
Packit |
01d647 |
formats["wolf"] = wolf;
|
|
Packit |
01d647 |
formats["csv" ] = csv ;
|
|
Packit |
01d647 |
formats["json"] = json;
|
|
Packit |
01d647 |
formats["xml" ] = xml ;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
int result = 0 ;
|
|
Packit |
01d647 |
if (argc != 3) {
|
|
Packit |
01d647 |
syntax(argv,formats) ;
|
|
Packit |
01d647 |
result = 1;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
const char* file = argv[1];
|
|
Packit |
01d647 |
const char* format = argv[2];
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
if ( !result && formats.find(format) == formats.end() ) {
|
|
Packit |
01d647 |
std::cout << "Unrecognised format " << format << std::endl;
|
|
Packit |
01d647 |
syntax(argv,formats);
|
|
Packit |
01d647 |
result = 2;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
if ( !result ) try {
|
|
Packit |
01d647 |
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(file);
|
|
Packit |
01d647 |
assert(image.get() != 0);
|
|
Packit |
01d647 |
image->readMetadata();
|
|
Packit |
01d647 |
Exiv2::ExifData &exifData = image->exifData();
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
switch ( formats.find(format)->second ) {
|
|
Packit |
01d647 |
case wolf : std::cout << formatWolf(exifData) << std::endl; break;
|
|
Packit |
01d647 |
case csv : std::cout << formatCSV (exifData) << std::endl; break;
|
|
Packit |
01d647 |
case json : std::cout << formatJSON(exifData) << std::endl; break;
|
|
Packit |
01d647 |
case xml : std::cout << formatXML (exifData) << std::endl; break;
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
default : std::cout << "*** error: format not implemented yet: " << format << " ***" << std::endl;
|
|
Packit |
01d647 |
result = 3;
|
|
Packit |
01d647 |
break;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
} catch (Exiv2::AnyError& e) {
|
|
Packit |
01d647 |
std::cerr << "*** error exiv2 exception '" << e << "' ***" << std::endl;
|
|
Packit |
01d647 |
result = 4;
|
|
Packit |
01d647 |
} catch ( ... ) {
|
|
Packit |
01d647 |
std::cerr << "*** error exception" << std::endl;
|
|
Packit |
01d647 |
result = 5;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return result;
|
|
Packit |
01d647 |
}
|