// ***************************************************************************** // Main int main(int argc, char* const argv[]) { try { if (argc != 2) { std::cout << "Usage: " << argv[0] << " image\n"; std::cout << "Commands read from stdin.\n"; return 1; } Image::AutoPtr image = ImageFactory::open(argv[1]); assert (image.get() != 0); image->readMetadata(); // Process commands std::string line; int num = 0; std::getline(std::cin, line); while (line.length() && processLine(line, ++num, image->iptcData())) { std::getline(std::cin, line); } // Save any changes image->writeMetadata(); return 0; } catch (AnyError& e) { std::cout << "Caught Exiv2 exception '" << e << "'\n"; return -1; } }
void PgfImage::readMetadata() { #ifdef DEBUG std::cerr << "Exiv2::PgfImage::readMetadata: Reading PGF file " << io_->path() << "\n"; #endif if (io_->open() != 0) { throw Error(9, io_->path(), strError()); } IoCloser closer(*io_); // Ensure that this is the correct image type if (!isPgfType(*io_, true)) { if (io_->error() || io_->eof()) throw Error(14); throw Error(3, "PGF"); } clearMetadata(); readPgfMagicNumber(*io_); uint32_t headerSize = readPgfHeaderSize(*io_); readPgfHeaderStructure(*io_, &pixelWidth_, &pixelHeight_); // And now, the most interresting, the user data byte array where metadata are stored as small image. long size = 8 + headerSize - io_->tell(); #ifdef DEBUG std::cout << "Exiv2::PgfImage::readMetadata: Found Image data (" << size << " bytes)\n"; #endif if (size < 0) throw Error(20); if (size == 0) return; DataBuf imgData(size); std::memset(imgData.pData_, 0x0, imgData.size_); long bufRead = io_->read(imgData.pData_, imgData.size_); if (io_->error()) throw Error(14); if (bufRead != imgData.size_) throw Error(20); Image::AutoPtr image = Exiv2::ImageFactory::open(imgData.pData_, imgData.size_); image->readMetadata(); exifData() = image->exifData(); iptcData() = image->iptcData(); xmpData() = image->xmpData(); } // PgfImage::readMetadata
int IptcData::read(const std::string& path) { if (!fileExists(path, true)) return -1; Image::AutoPtr image = ImageFactory::instance().open(path); if (image.get() == 0) { // We don't know this type of file return -2; } int rc = image->readMetadata(); if (rc == 0) { if (image->sizeIptcData() > 0) { rc = read(image->iptcData(), image->sizeIptcData()); } else { rc = 3; } } return rc; }