Blame samples/write-test.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
/*
Packit 01d647
  Abstract : ExifData write unit tests
Packit 01d647
Packit 01d647
  Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
Packit 01d647
Packit 01d647
  Test procedure:
Packit 01d647
   $ rm -f test.jpg thumb.jpg iii ttt;
Packit 01d647
   $ ./exifprint ../test/img_1771.jpg > iii;
Packit 01d647
   $ cp ../test/img_1771.jpg ./test.jpg;
Packit 01d647
   $ ./makernote-test2 ../test/img_1771.jpg > ttt;
Packit 01d647
   $ diff iii ttt
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 <sstream>
Packit 01d647
#include <iomanip>
Packit 01d647
#include <string>
Packit 01d647
#include <utility>
Packit 01d647
#include <cassert>
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
// local declarations
Packit 01d647
Packit 01d647
using namespace Exiv2;
Packit 01d647
Packit 01d647
void testCase(const std::string& file1,
Packit 01d647
              const std::string& file2,
Packit 01d647
              const std::string& thumb,
Packit 01d647
              const std::string& key,
Packit 01d647
              const std::string& value);
Packit 01d647
void exifPrint(const ExifData& exifData);
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
Packit 01d647
    if (argc != 3) {
Packit 01d647
        std::cout << "Usage: write-test file case\n\n"
Packit 01d647
                  << "where case is an integer between 1 and 11\n";
Packit 01d647
        return 1;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    std::string testFile = argv[1];
Packit 01d647
    std::istringstream iss(argv[2]);
Packit 01d647
    int testNo;
Packit 01d647
    iss >> testNo;
Packit 01d647
Packit 01d647
    int rc = 0;
Packit 01d647
    switch (testNo) {
Packit 01d647
    case 1:
Packit 01d647
        std::cerr << "Case 1: ";
Packit 01d647
        std::cerr << "Non-intrusive change to the standard Exif metadata\n";
Packit 01d647
        testCase(testFile, "test1.jpg", "thumb1",
Packit 01d647
                 "Exif.Photo.DateTimeOriginal",
Packit 01d647
                 "1999:11:22 00:11:22");
Packit 01d647
        break;
Packit 01d647
    case 2:
Packit 01d647
        std::cerr << "Case 2: ";
Packit 01d647
        std::cerr << "Non-intrusive change to the makernote metadata\n";
Packit 01d647
        testCase(testFile, "test2.jpg", "thumb2",
Packit 01d647
                 "Exif.Canon.OwnerName",
Packit 01d647
                 "Chan YeeSend");
Packit 01d647
        break;
Packit 01d647
    case 3:
Packit 01d647
        std::cerr << "Case 3: ";
Packit 01d647
        std::cerr << "Non-intrusive change to the Exif metadata (w/o makernote)\n";
Packit 01d647
        testCase(testFile, "test3.jpg", "thumb3",
Packit 01d647
                 "Exif.Photo.DateTimeOriginal",
Packit 01d647
                 "1999:11:22 00:11:22");
Packit 01d647
        break;
Packit 01d647
    case 4:
Packit 01d647
        std::cerr << "Case 4: ";
Packit 01d647
        std::cerr << "Intrusive change to the standard Exif metadata\n";
Packit 01d647
        testCase(testFile, "test4.jpg", "thumb4",
Packit 01d647
                 "Exif.Photo.DateTimeOriginal",
Packit 01d647
                 "1999:11:22 00:11:22 and twenty seconds");
Packit 01d647
        break;
Packit 01d647
    case 5:
Packit 01d647
        std::cerr << "Case 5: ";
Packit 01d647
        std::cerr << "Intrusive change to the Canon makernote metadata\n";
Packit 01d647
        testCase(testFile, "test5.jpg", "thumb5",
Packit 01d647
                 "Exif.Canon.OwnerName",
Packit 01d647
                 "Frau Chan YeeSend und Herr Andreas Huggel");
Packit 01d647
        break;
Packit 01d647
    case 6:
Packit 01d647
        std::cerr << "Case 6: ";
Packit 01d647
        std::cerr << "Intrusive change to the Exif metadata (w/o makernote)\n";
Packit 01d647
        testCase(testFile, "test6.jpg", "thumb6",
Packit 01d647
                 "Exif.Photo.DateTimeOriginal",
Packit 01d647
                 "1999:11:22 00:11:22 and twenty seconds");
Packit 01d647
        break;
Packit 01d647
    case 7:
Packit 01d647
        std::cerr << "Case 7: ";
Packit 01d647
        std::cerr << "Intrusive change to the Fujifilm makernote metadata\n";
Packit 01d647
        testCase(testFile, "test7.jpg", "thumb7",
Packit 01d647
                 "Exif.Fujifilm.Quality",
Packit 01d647
                 "Typical Fujifilm Quality");
Packit 01d647
        break;
Packit 01d647
    case 8:
Packit 01d647
        std::cerr << "Case 8: ";
Packit 01d647
        std::cerr << "Intrusive change to the Sigma makernote metadata\n";
Packit 01d647
        testCase(testFile, "test8.jpg", "thumb8",
Packit 01d647
                 "Exif.Sigma.ResolutionMode",
Packit 01d647
                 "Sigma HI resolution");
Packit 01d647
        break;
Packit 01d647
    case 9:
Packit 01d647
        std::cerr << "Case 9: ";
Packit 01d647
        std::cerr << "Intrusive change to the Nikon1 makernote metadata\n";
Packit 01d647
        testCase(testFile, "test9.jpg", "thumb9",
Packit 01d647
                 "Exif.Nikon1.Quality",
Packit 01d647
                 "Typical Nikon1 Quality");
Packit 01d647
        break;
Packit 01d647
    case 10:
Packit 01d647
        std::cerr << "Case 10: ";
Packit 01d647
        std::cerr << "Intrusive change to the Nikon2 makernote metadata\n";
Packit 01d647
        testCase(testFile, "test10.jpg", "thumb10",
Packit 01d647
                 "Exif.Nikon2.0x0002",
Packit 01d647
                 "Nikon2 Version 2");
Packit 01d647
        break;
Packit 01d647
    case 11:
Packit 01d647
        std::cerr << "Case 11: ";
Packit 01d647
        std::cerr << "Intrusive change to the Nikon3 makernote metadata\n";
Packit 01d647
        testCase(testFile, "test11.jpg", "thumb11",
Packit 01d647
                 "Exif.Nikon3.Quality",
Packit 01d647
                 "Typical Nikon3 Quality");
Packit 01d647
        break;
Packit 01d647
Packit 01d647
        // ToDo: Erase Sigma thumbnail
Packit 01d647
Packit 01d647
        // ToDo: Write to a broken (truncated) IFD entry
Packit 01d647
Packit 01d647
    default:
Packit 01d647
        std::cout << "Usage: exiftest file case\n\n"
Packit 01d647
                  << "where case is an integer between 1 and 11\n";
Packit 01d647
        rc = 1;
Packit 01d647
        break;
Packit 01d647
    }
Packit 01d647
Packit 01d647
    return rc;
Packit 01d647
}
Packit 01d647
catch (AnyError& e) {
Packit 01d647
    std::cerr << "Caught Exiv2 exception '" << e << "'\n";
Packit 01d647
    return 1;
Packit 01d647
}
Packit 01d647
}
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
void testCase(const std::string& file1,
Packit 01d647
              const std::string& file2,
Packit 01d647
              const std::string& thumb,
Packit 01d647
              const std::string& key,
Packit 01d647
              const std::string& value)
Packit 01d647
{
Packit 01d647
    ExifKey ek(key);
Packit 01d647
Packit 01d647
    //Open first image
Packit 01d647
    Image::AutoPtr image1 = ImageFactory::open(file1);
Packit 01d647
    assert(image1.get() != 0);
Packit 01d647
Packit 01d647
    // Load existing metadata
Packit 01d647
    std::cerr << "---> Reading file " << file1 << "\n";
Packit 01d647
    image1->readMetadata();
Packit 01d647
Packit 01d647
    Exiv2::ExifData &ed1 = image1->exifData();
Packit 01d647
    std::cerr << "---> Modifying Exif data\n";
Packit 01d647
    Exiv2::ExifData::iterator pos = ed1.findKey(ek);
Packit 01d647
    if (pos == ed1.end()) {
Packit 01d647
        throw Error(kerErrorMessage, "Metadatum with key = " + ek.key() + " not found");
Packit 01d647
    }
Packit 01d647
    pos->setValue(value);
Packit 01d647
Packit 01d647
    // Open second image
Packit 01d647
    Image::AutoPtr image2 = ImageFactory::open(file2);
Packit 01d647
    assert(image2.get() != 0);
Packit 01d647
Packit 01d647
    image2->setExifData(image1->exifData());
Packit 01d647
Packit 01d647
    std::cerr << "---> Writing Exif data to file " << file2 << "\n";
Packit 01d647
    image2->writeMetadata();
Packit 01d647
Packit 01d647
    std::cerr << "---> Reading file " << file2 << "\n";
Packit 01d647
    image2->readMetadata();
Packit 01d647
Packit 01d647
    Exiv2::ExifData &ed2 = image2->exifData();
Packit 01d647
    exifPrint(ed2);
Packit 01d647
Packit 01d647
    std::cerr << "---> Writing Exif thumbnail to file " << thumb << ".*\n";
Packit 01d647
    ExifThumbC et2(ed2);
Packit 01d647
    et2.writeFile(thumb);
Packit 01d647
}
Packit 01d647
Packit 01d647
// *****************************************************************************
Packit 01d647
Packit 01d647
void exifPrint(const ExifData& exifData)
Packit 01d647
{
Packit 01d647
    ExifData::const_iterator i = exifData.begin();
Packit 01d647
    for (; i != exifData.end(); ++i) {
Packit 01d647
        std::cout << std::setw(44) << 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(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
}