Sample program to extract a Minolta thumbnail from the makernote

// SPDX-License-Identifier: GPL-2.0-or-later
// Sample program to extract a Minolta thumbnail from the makernote
#include <exiv2/exiv2.hpp>
#include <iostream>
int main(int argc, char* const argv[]) {
try {
if (argc != 2) {
std::cout << "Usage: " << argv[0] << " file\n";
auto image = Exiv2::ImageFactory::open(argv[1]);
Exiv2::ExifData& exifData = image->exifData();
if (exifData.empty()) {
std::string error(argv[1]);
error += ": No Exif data found in the file";
throw Exiv2::Error(Exiv2::ErrorCode::kerErrorMessage, error);
Exiv2::ExifKey key("Exif.Minolta.ThumbnailOffset");
auto format = exifData.findKey(key);
if (format != exifData.end()) {
Exiv2::DataBuf buf = format->dataArea();
// The first byte of the buffer needs to be patched
buf.write_uint8(0, 0xff);
Exiv2::FileIo file("img_thumb.jpg");"wb");
file.write(buf.c_data(), buf.size());
} catch (Exiv2::Error& e) {
std::cout << "Caught Exiv2 exception '" << e << "'\n";
Simple error class used for exceptions. An output operator is provided to print errors to a stream.
Definition: error.hpp:235
A container for Exif data. This is a top-level class of the Exiv2 library. The container holds Exifda...
Definition: exif.hpp:373
bool empty() const
Return true if there is no Exif metadata.
Definition: exif.hpp:459
iterator findKey(const ExifKey &key)
Find the first Exifdatum with the given key, return an iterator to it.
iterator end()
End of the metadata.
Definition: exif.hpp:433
Concrete keys for Exif metadata and access to Exif tag reference data.
Definition: tags.hpp:271
Provides binary file IO by implementing the BasicIo interface.
Definition: basicio.hpp:283
int open(const std::string &mode)
Open the file using the specified mode.
size_t write(const byte *data, size_t wcount) override
Write data to the file. The file position is advanced by the number of bytes written.
int close() override
Flush and unwritten data and close the file . It is safe to call close on an already closed instance.
static Image::UniquePtr open(const std::string &path, bool useCurl=true)
Create an Image subclass of the appropriate type by reading the specified file. Image type is derived...
static void terminate()
Terminate the XMP Toolkit and unregister custom namespaces.
static bool initialize(XmpParser::XmpLockFct xmpLockFct=nullptr, void *pLockData=nullptr)
Initialize the XMP Toolkit.
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124
const byte * c_data(size_t offset=0) const
Returns a (read-only) data pointer.