|
Packit |
01d647 |
// ***************************************************************** -*- C++ -*-
|
|
Packit |
01d647 |
/*
|
|
Packit |
01d647 |
Abstract : ExifData write unit tests for Exif data created from scratch
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
File : write2-test.cpp
|
|
Packit |
01d647 |
Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
|
|
Packit |
01d647 |
History : 26-Jun-04, ahu: created
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
*/
|
|
Packit |
01d647 |
// *****************************************************************************
|
|
Packit |
01d647 |
// included header files
|
|
Packit |
01d647 |
#include <exiv2/exiv2.hpp>
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
#include <iostream>
|
|
Packit |
01d647 |
#include <iomanip>
|
|
Packit |
01d647 |
#include <string>
|
|
Packit |
01d647 |
#include <cassert>
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
void write(const std::string& file, Exiv2::ExifData& ed);
|
|
Packit |
01d647 |
void print(const std::string& file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
// *****************************************************************************
|
|
Packit |
01d647 |
// Main
|
|
Packit |
01d647 |
int main(int argc, char* const argv[])
|
|
Packit |
01d647 |
{
|
|
Packit Service |
fb147c |
Exiv2::XmpParser::initialize();
|
|
Packit Service |
fb147c |
::atexit(Exiv2::XmpParser::terminate);
|
|
Packit Service |
fb147c |
|
|
Packit Service |
fb147c |
try {
|
|
Packit |
01d647 |
if (argc != 2) {
|
|
Packit |
01d647 |
std::cout << "Usage: " << argv[0] << " file\n";
|
|
Packit |
01d647 |
return 1;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
std::string file(argv[1]);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"----- Some IFD0 tags\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed1;
|
|
Packit |
01d647 |
ed1["Exif.Image.Model"] = "Test 1";
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
Exiv2::Value::AutoPtr v1 = Exiv2::Value::create(Exiv2::unsignedShort);
|
|
Packit |
01d647 |
v1->read("160 161 162 163");
|
|
Packit |
01d647 |
ed1.add(Exiv2::ExifKey("Exif.Image.SamplesPerPixel"), v1.get());
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
Exiv2::Value::AutoPtr v2 = Exiv2::Value::create(Exiv2::signedLong);
|
|
Packit |
01d647 |
v2->read("-2 -1 0 1");
|
|
Packit |
01d647 |
ed1.add(Exiv2::ExifKey("Exif.Image.XResolution"), v2.get());
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
Exiv2::Value::AutoPtr v3 = Exiv2::Value::create(Exiv2::signedRational);
|
|
Packit |
01d647 |
v3->read("-2/3 -1/3 0/3 1/3");
|
|
Packit |
01d647 |
ed1.add(Exiv2::ExifKey("Exif.Image.YResolution"), v3.get());
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
Exiv2::Value::AutoPtr v4 = Exiv2::Value::create(Exiv2::undefined);
|
|
Packit |
01d647 |
v4->read("255 254 253 252");
|
|
Packit |
01d647 |
ed1.add(Exiv2::ExifKey("Exif.Image.WhitePoint"), v4.get());
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
write(file, ed1);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Exif tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed2;
|
|
Packit |
01d647 |
ed2["Exif.Photo.DateTimeOriginal"] = "Test 2";
|
|
Packit |
01d647 |
write(file, ed2);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- Canon MakerNote tags\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn1;
|
|
Packit |
01d647 |
edMn1["Exif.Image.Make"] = "Canon";
|
|
Packit |
01d647 |
edMn1["Exif.Image.Model"] = "Canon PowerShot S40";
|
|
Packit |
01d647 |
edMn1["Exif.Canon.0xabcd"] = "A Canon makernote tag";
|
|
Packit |
01d647 |
edMn1["Exif.CanonCs.0x0002"] = uint16_t(41);
|
|
Packit |
01d647 |
edMn1["Exif.CanonSi.0x0005"] = uint16_t(42);
|
|
Packit |
01d647 |
edMn1["Exif.CanonCf.0x0001"] = uint16_t(43);
|
|
Packit |
01d647 |
edMn1["Exif.CanonPi.0x0001"] = uint16_t(44);
|
|
Packit |
01d647 |
edMn1["Exif.CanonPa.0x0001"] = uint16_t(45);
|
|
Packit |
01d647 |
write(file, edMn1);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- Non-intrusive writing of special Canon MakerNote tags\n";
|
|
Packit |
01d647 |
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(file);
|
|
Packit |
01d647 |
assert(image.get() != 0);
|
|
Packit |
01d647 |
image->readMetadata();
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
Exiv2::ExifData& rEd = image->exifData();
|
|
Packit |
01d647 |
rEd["Exif.CanonCs.0x0001"] = uint16_t(88);
|
|
Packit |
01d647 |
rEd["Exif.CanonSi.0x0004"] = uint16_t(99);
|
|
Packit |
01d647 |
image->writeMetadata();
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Fujifilm MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn2;
|
|
Packit |
01d647 |
edMn2["Exif.Image.Make"] = "FUJIFILM";
|
|
Packit |
01d647 |
edMn2["Exif.Image.Model"] = "FinePixS2Pro";
|
|
Packit |
01d647 |
edMn2["Exif.Fujifilm.0x1000"] = "A Fujifilm QUALITY tag";
|
|
Packit |
01d647 |
write(file, edMn2);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Sigma/Foveon MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn3;
|
|
Packit |
01d647 |
edMn3["Exif.Image.Make"] = "SIGMA";
|
|
Packit |
01d647 |
edMn3["Exif.Image.Model"] = "SIGMA SD10";
|
|
Packit |
01d647 |
edMn3["Exif.Sigma.0x0018"] = "Software? Exiv2!";
|
|
Packit |
01d647 |
write(file, edMn3);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Nikon1 MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn4;
|
|
Packit |
01d647 |
edMn4["Exif.Image.Make"] = "NIKON";
|
|
Packit |
01d647 |
edMn4["Exif.Image.Model"] = "E990";
|
|
Packit |
01d647 |
edMn4["Exif.Nikon1.0x0080"] = "ImageAdjustment by Exiv2";
|
|
Packit |
01d647 |
write(file, edMn4);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Nikon2 MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn5;
|
|
Packit |
01d647 |
edMn5["Exif.Image.Make"] = "NIKON";
|
|
Packit |
01d647 |
edMn5["Exif.Image.Model"] = "E950";
|
|
Packit |
01d647 |
edMn5["Exif.Nikon2.0xffff"] = "An obscure Nikon2 tag";
|
|
Packit |
01d647 |
write(file, edMn5);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Nikon3 MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn6;
|
|
Packit |
01d647 |
edMn6["Exif.Image.Make"] = "NIKON CORPORATION";
|
|
Packit |
01d647 |
edMn6["Exif.Image.Model"] = "NIKON D70";
|
|
Packit |
01d647 |
edMn6["Exif.Nikon3.0x0004"] = "A boring Nikon3 Quality tag";
|
|
Packit |
01d647 |
write(file, edMn6);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Olympus MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn7;
|
|
Packit |
01d647 |
edMn7["Exif.Image.Make"] = "OLYMPUS CORPORATION";
|
|
Packit |
01d647 |
edMn7["Exif.Image.Model"] = "C8080WZ";
|
|
Packit |
01d647 |
edMn7["Exif.Olympus.0x0201"] = uint16_t(1);
|
|
Packit |
01d647 |
write(file, edMn7);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Panasonic MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn8;
|
|
Packit |
01d647 |
edMn8["Exif.Image.Make"] = "Panasonic";
|
|
Packit |
01d647 |
edMn8["Exif.Image.Model"] = "DMC-FZ5";
|
|
Packit |
01d647 |
edMn8["Exif.Panasonic.0x0001"] = uint16_t(1);
|
|
Packit |
01d647 |
write(file, edMn8);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One Sony1 MakerNote tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn9;
|
|
Packit |
01d647 |
edMn9["Exif.Image.Make"] = "SONY";
|
|
Packit |
01d647 |
edMn9["Exif.Image.Model"] = "DSC-W7";
|
|
Packit |
01d647 |
edMn9["Exif.Sony1.0x2000"] = "0 1 2 3 4 5";
|
|
Packit |
01d647 |
write(file, edMn9);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- Minolta MakerNote tags\n";
|
|
Packit |
01d647 |
Exiv2::ExifData edMn10;
|
|
Packit |
01d647 |
edMn10["Exif.Image.Make"] = "Minolta";
|
|
Packit |
01d647 |
edMn10["Exif.Image.Model"] = "A fancy Minolta camera";
|
|
Packit |
01d647 |
edMn10["Exif.Minolta.ColorMode"] = uint32_t(1);
|
|
Packit |
01d647 |
edMn10["Exif.MinoltaCsNew.WhiteBalance"] = uint32_t(2);
|
|
Packit |
01d647 |
edMn10["Exif.MinoltaCs5D.WhiteBalance"] = uint16_t(3);
|
|
Packit |
01d647 |
edMn10["Exif.MinoltaCs5D.ColorTemperature"] = int16_t(-1);
|
|
Packit |
01d647 |
edMn10["Exif.MinoltaCs7D.WhiteBalance"] = uint16_t(4);
|
|
Packit |
01d647 |
edMn10["Exif.MinoltaCs7D.ExposureCompensation"] = int16_t(-2);
|
|
Packit |
01d647 |
edMn10["Exif.MinoltaCs7D.ColorTemperature"] = int16_t(-3);
|
|
Packit |
01d647 |
write(file, edMn10);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One IOP tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed3;
|
|
Packit |
01d647 |
ed3["Exif.Iop.InteroperabilityIndex"] = "Test 3";
|
|
Packit |
01d647 |
write(file, ed3);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One GPS tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed4;
|
|
Packit |
01d647 |
ed4["Exif.GPSInfo.GPSVersionID"] = "19 20";
|
|
Packit |
01d647 |
write(file, ed4);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One IFD1 tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed5;
|
|
Packit |
01d647 |
ed5["Exif.Thumbnail.Artist"] = "Test 5";
|
|
Packit |
01d647 |
write(file, ed5);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One IOP and one IFD1 tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed6;
|
|
Packit |
01d647 |
ed6["Exif.Iop.InteroperabilityIndex"] = "Test 6 Iop tag";
|
|
Packit |
01d647 |
ed6["Exif.Thumbnail.Artist"] = "Test 6 Ifd1 tag";
|
|
Packit |
01d647 |
write(file, ed6);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::cout <<"\n----- One IFD0 and one IFD1 tag\n";
|
|
Packit |
01d647 |
Exiv2::ExifData ed7;
|
|
Packit |
01d647 |
ed7["Exif.Thumbnail.Artist"] = "Test 7";
|
|
Packit |
01d647 |
Exiv2::Value::AutoPtr v5 = Exiv2::Value::create(Exiv2::unsignedShort);
|
|
Packit |
01d647 |
v5->read("160 161 162 163");
|
|
Packit |
01d647 |
ed7.add(Exiv2::ExifKey("Exif.Image.SamplesPerPixel"), v5.get());
|
|
Packit |
01d647 |
write(file, ed7);
|
|
Packit |
01d647 |
print(file);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return 0;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
catch (Exiv2::AnyError& e) {
|
|
Packit |
01d647 |
std::cout << "Caught Exiv2 exception '" << e << "'\n";
|
|
Packit |
01d647 |
return -1;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
void write(const std::string& file, Exiv2::ExifData& ed)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(file);
|
|
Packit |
01d647 |
assert(image.get() != 0);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
image->setExifData(ed);
|
|
Packit |
01d647 |
image->writeMetadata();
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
void print(const std::string& file)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(file);
|
|
Packit |
01d647 |
assert(image.get() != 0);
|
|
Packit |
01d647 |
image->readMetadata();
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
Exiv2::ExifData &ed = image->exifData();
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator end = ed.end();
|
|
Packit |
01d647 |
for (Exiv2::ExifData::const_iterator i = ed.begin(); i != end; ++i) {
|
|
Packit |
01d647 |
std::cout << std::setw(45) << std::setfill(' ') << std::left
|
|
Packit |
01d647 |
<< i->key() << " "
|
|
Packit |
01d647 |
<< "0x" << std::setw(4) << std::setfill('0') << std::right
|
|
Packit |
01d647 |
<< std::hex << i->tag() << " "
|
|
Packit |
01d647 |
<< std::setw(12) << std::setfill(' ') << std::left
|
|
Packit |
01d647 |
<< i->ifdName() << " "
|
|
Packit |
01d647 |
<< std::setw(9) << std::setfill(' ') << std::left
|
|
Packit |
01d647 |
<< i->typeName() << " "
|
|
Packit |
01d647 |
<< std::dec << std::setw(3)
|
|
Packit |
01d647 |
<< std::setfill(' ') << std::right
|
|
Packit |
01d647 |
<< i->count() << " "
|
|
Packit |
01d647 |
<< std::dec << i->value()
|
|
Packit |
01d647 |
<< "\n";
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
}
|