You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
exiv2/src/write2-test.cpp

200 lines
6.1 KiB
C++

// ***************************************************************** -*- C++ -*-
/*
Abstract : ExifData write unit tests for Exif data created from scratch
File : write2-test.cpp
Version : $Name: $ $Revision: 1.6 $
Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
History : 26-Jun-04, ahu: created
*/
// *****************************************************************************
// included header files
#include "exif.hpp"
#include <iostream>
#include <iomanip>
#include <string>
void write(const std::string& file, Exiv2::ExifData& ed);
void print(const std::string& file);
// *****************************************************************************
// Main
int main(int argc, char* const argv[])
{
try {
if (argc != 2) {
std::cout << "Usage: " << argv[0] << " file\n";
return 1;
}
std::string file(argv[1]);
std::cout <<"----- One IFD0 tag\n";
Exiv2::ExifData ed1;
Exiv2::Exifdatum md1(Exiv2::ExifKey("Exif.Image.Model"));
md1.setValue("Test 1");
ed1.add(md1);
write(file, ed1);
print(file);
std::cout <<"\n----- One Exif tag\n";
Exiv2::ExifData ed2;
Exiv2::Exifdatum md2(Exiv2::ExifKey("Exif.Photo.DateTimeOriginal"));
md2.setValue("Test 2");
ed2.add(md2);
write(file, ed2);
print(file);
std::cout <<"\n----- One Canon MakerNote tag\n";
Exiv2::ExifData edMn1;
Exiv2::Exifdatum mdMn1(Exiv2::ExifKey("Exif.Image.Make"));
mdMn1.setValue("Canon");
edMn1.add(mdMn1);
Exiv2::Exifdatum mdMn2(Exiv2::ExifKey("Exif.Image.Model"));
mdMn2.setValue("Canon PowerShot S40");
edMn1.add(mdMn2);
Exiv2::Exifdatum mdMn3(Exiv2::ExifKey("Exif.Canon.0xabcd"));
mdMn3.setValue("A Canon makernote tag");
edMn1.add(mdMn3);
write(file, edMn1);
print(file);
std::cout <<"\n----- One Fujifilm MakerNote tag\n";
Exiv2::ExifData edMn2;
Exiv2::Exifdatum mdMn4(Exiv2::ExifKey("Exif.Image.Make"));
mdMn4.setValue("FUJIFILM");
edMn2.add(mdMn4);
Exiv2::Exifdatum mdMn5(Exiv2::ExifKey("Exif.Image.Model"));
mdMn5.setValue("FinePixS2Pro");
edMn2.add(mdMn5);
Exiv2::Exifdatum mdMn6(Exiv2::ExifKey("Exif.Fujifilm.0x1000"));
mdMn6.setValue("A Fujifilm QUALITY tag");
edMn2.add(mdMn6);
write(file, edMn2);
print(file);
std::cout <<"\n----- One Sigma/Foveon MakerNote tag\n";
Exiv2::ExifData edMn3;
Exiv2::Exifdatum mdMn7(Exiv2::ExifKey("Exif.Image.Make"));
mdMn7.setValue("SIGMA");
edMn3.add(mdMn7);
Exiv2::Exifdatum mdMn8(Exiv2::ExifKey("Exif.Image.Model"));
mdMn8.setValue("SIGMA SD10");
edMn3.add(mdMn8);
Exiv2::Exifdatum mdMn9(Exiv2::ExifKey("Exif.Sigma.0x0018"));
mdMn9.setValue("Software? Exiv2!");
edMn3.add(mdMn9);
write(file, edMn3);
print(file);
std::cout <<"\n----- One Nikon1 MakerNote tag\n";
Exiv2::ExifData edMn4;
Exiv2::Exifdatum mdMn10(Exiv2::ExifKey("Exif.Image.Make"));
mdMn10.setValue("NIKON");
edMn4.add(mdMn10);
Exiv2::Exifdatum mdMn11(Exiv2::ExifKey("Exif.Image.Model"));
mdMn11.setValue("E990");
edMn4.add(mdMn11);
Exiv2::Exifdatum mdMn12(Exiv2::ExifKey("Exif.Nikon1.0x0080"));
mdMn12.setValue("ImageAdjustment by Exiv2");
edMn4.add(mdMn12);
write(file, edMn4);
print(file);
std::cout <<"\n----- One Nikon2 MakerNote tag\n";
Exiv2::ExifData edMn5;
Exiv2::Exifdatum mdMn13(Exiv2::ExifKey("Exif.Image.Make"));
mdMn13.setValue("NIKON");
edMn5.add(mdMn13);
Exiv2::Exifdatum mdMn14(Exiv2::ExifKey("Exif.Image.Model"));
mdMn14.setValue("E950");
edMn5.add(mdMn14);
Exiv2::Exifdatum mdMn15(Exiv2::ExifKey("Exif.Nikon2.0xffff"));
mdMn15.setValue("An obscure Nikon2 tag");
edMn5.add(mdMn15);
write(file, edMn5);
print(file);
std::cout <<"\n----- One Nikon3 MakerNote tag\n";
Exiv2::ExifData edMn6;
Exiv2::Exifdatum mdMn16(Exiv2::ExifKey("Exif.Image.Make"));
mdMn16.setValue("NIKON CORPORATION");
edMn6.add(mdMn16);
Exiv2::Exifdatum mdMn17(Exiv2::ExifKey("Exif.Image.Model"));
mdMn17.setValue("NIKON D70");
edMn6.add(mdMn17);
Exiv2::Exifdatum mdMn18(Exiv2::ExifKey("Exif.Nikon3.0x0004"));
mdMn18.setValue("A boring Nikon3 Quality tag");
edMn6.add(mdMn18);
write(file, edMn6);
print(file);
std::cout <<"\n----- One IOP tag\n";
Exiv2::ExifData ed3;
Exiv2::Exifdatum md3(Exiv2::ExifKey("Exif.Iop.InteroperabilityVersion"));
md3.setValue("Test 3");
ed3.add(md3);
write(file, ed3);
print(file);
std::cout <<"\n----- One GPS tag\n";
Exiv2::ExifData ed4;
Exiv2::Exifdatum md4(Exiv2::ExifKey("Exif.GPSInfo.GPSVersionID"));
md4.setValue("Test 4");
ed4.add(md4);
write(file, ed4);
print(file);
// Todo: Fix this
std::cout <<"\n----- One IFD1 tag\n";
Exiv2::ExifData ed5;
Exiv2::Exifdatum md5(Exiv2::ExifKey("Exif.Thumbnail.Artist"));
md5.setValue("Test 5");
ed5.add(md5);
Exiv2::Exifdatum md6(Exiv2::ExifKey("Exif.Image.Model"));
21 years ago
md6.setValue("Test 5 (Fix me!)");
ed5.add(md6);
write(file, ed5);
print(file);
return 0;
}
catch (Exiv2::Error& e) {
std::cout << "Caught Exiv2 exception '" << e << "'\n";
return -1;
}
}
void write(const std::string& file, Exiv2::ExifData& ed)
{
int rc = ed.write(file);
if (rc) {
std::string error = Exiv2::ExifData::strError(rc, file);
throw Exiv2::Error(error);
}
}
void print(const std::string& file)
{
Exiv2::ExifData ed;
int rc = ed.read(file);
if (rc) {
std::string error = Exiv2::ExifData::strError(rc, file);
throw Exiv2::Error(error);
}
Exiv2::ExifData::const_iterator end = ed.end();
for (Exiv2::ExifData::const_iterator i = ed.begin(); i != end; ++i) {
std::cout << std::setw(53) << std::setfill(' ') << std::left
<< i->key() << " "
<< std::setw(12) << std::setfill(' ') << std::left
<< i->ifdName() << " "
<< "0x" << std::setw(4) << std::setfill('0') << std::right
<< std::hex << i->tag() << " "
<< std::dec << i->value()
<< "\n";
}
}