// ***************************************************************************** /* * Copyright (C) 2006-2010 Olivier Tilloy * * This file is part of the pyexiv2 distribution. * * pyexiv2 is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * pyexiv2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with pyexiv2; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA. */ /* Author: Olivier Tilloy */ // ***************************************************************************** #ifndef __exiv2wrapper__ #define __exiv2wrapper__ #include #include "exiv2/image.hpp" #include "exiv2/preview.hpp" #include "boost/python.hpp" namespace exiv2wrapper { class Image; class ExifTag { public: // Constructor ExifTag(const std::string& key, Exiv2::Exifdatum* datum=0, Exiv2::ExifData* data=0, Exiv2::ByteOrder byteOrder=Exiv2::invalidByteOrder); ~ExifTag(); void setRawValue(const std::string& value); void setParentImage(Image& image); const std::string getKey(); const std::string getType(); const std::string getName(); const std::string getLabel(); const std::string getDescription(); const std::string getSectionName(); const std::string getSectionDescription(); const std::string getRawValue(); const std::string getHumanValue(); int getByteOrder(); private: Exiv2::ExifKey _key; Exiv2::Exifdatum* _datum; Exiv2::ExifData* _data; std::string _type; std::string _name; std::string _label; std::string _description; std::string _sectionName; std::string _sectionDescription; int _byteOrder; }; class IptcTag { public: // Constructor IptcTag(const std::string& key, Exiv2::IptcData* data=0); ~IptcTag(); void setRawValues(const boost::python::list& values); void setParentImage(Image& image); const std::string getKey(); const std::string getType(); const std::string getName(); const std::string getTitle(); const std::string getDescription(); const std::string getPhotoshopName(); const bool isRepeatable(); const std::string getRecordName(); const std::string getRecordDescription(); const boost::python::list getRawValues(); private: Exiv2::IptcKey _key; bool _from_data; // whether the tag is built from an existing IptcData Exiv2::IptcData* _data; std::string _type; std::string _name; std::string _title; std::string _description; std::string _photoshopName; bool _repeatable; std::string _recordName; std::string _recordDescription; }; class XmpTag { public: // Constructor XmpTag(const std::string& key, Exiv2::Xmpdatum* datum=0); ~XmpTag(); void setTextValue(const std::string& value); void setArrayValue(const boost::python::list& values); void setLangAltValue(const boost::python::dict& values); void setParentImage(Image& image); const std::string getKey(); const std::string getExiv2Type(); const std::string getType(); const std::string getName(); const std::string getTitle(); const std::string getDescription(); const std::string getTextValue(); const boost::python::list getArrayValue(); const boost::python::dict getLangAltValue(); private: Exiv2::XmpKey _key; bool _from_datum; // whether the tag is built from an existing Xmpdatum Exiv2::Xmpdatum* _datum; std::string _exiv2_type; std::string _type; std::string _name; std::string _title; std::string _description; }; class Preview { public: Preview(const Exiv2::PreviewImage& previewImage); void writeToFile(const std::string& path) const; std::string _mimeType; std::string _extension; unsigned int _size; boost::python::tuple _dimensions; std::string _data; }; class Image { public: // Constructors Image(const std::string& filename); Image(const std::string& buffer, unsigned long size); Image(const Image& image); ~Image(); void readMetadata(); void writeMetadata(); // Read-only access to the dimensions of the picture. unsigned int pixelWidth() const; unsigned int pixelHeight() const; // Read-only access to the MIME type of the image. std::string mimeType() const; // Read and write access to the EXIF tags. // For a complete list of the available EXIF tags, see // libexiv2's documentation (http://exiv2.org/tags.html). // Return a list of all the keys of available EXIF tags set in the // image. boost::python::list exifKeys(); // Return the required EXIF tag. // Throw an exception if the tag is not set. const ExifTag getExifTag(std::string key); // Delete the required EXIF tag. // Throw an exception if the tag was not set. void deleteExifTag(std::string key); // Read and write access to the IPTC tags. // For a complete list of the available IPTC tags, see // libexiv2's documentation (http://exiv2.org/iptc.html). // Returns a list of all the keys of available IPTC tags set in the // image. This list has no duplicates: each of its items is unique, // even if a tag is present more than once. boost::python::list iptcKeys(); // Return the required IPTC tag. // Throw an exception if the tag is not set. const IptcTag getIptcTag(std::string key); // Delete (all the repetitions of) the required IPTC tag. // Throw an exception if the tag was not set. void deleteIptcTag(std::string key); boost::python::list xmpKeys(); // Return the required XMP tag. // Throw an exception if the tag is not set. const XmpTag getXmpTag(std::string key); // Delete the required XMP tag. // Throw an exception if the tag was not set. void deleteXmpTag(std::string key); // Comment const std::string getComment() const; void setComment(const std::string& comment); void clearComment(); // Read access to the thumbnail embedded in the image. boost::python::list previews(); // Manipulate the JPEG/TIFF thumbnail embedded in the EXIF data. const std::string getExifThumbnailMimeType(); const std::string getExifThumbnailExtension(); void writeExifThumbnailToFile(const std::string& path); const std::string getExifThumbnailData(); void eraseExifThumbnail(); void setExifThumbnailFromFile(const std::string& path); void setExifThumbnailFromData(const std::string& data); // Copy the metadata to another image. void copyMetadata(Image& other, bool exif=true, bool iptc=true, bool xmp=true) const; // Return the image data buffer. std::string getDataBuffer() const; // Accessors Exiv2::ExifData* getExifData() { return _exifData; }; Exiv2::IptcData* getIptcData() { return _iptcData; }; Exiv2::XmpData* getXmpData() { return _xmpData; }; Exiv2::ByteOrder getByteOrder() const; const std::string getIptcCharset() const; private: std::string _filename; Exiv2::byte* _data; long _size; Exiv2::Image::AutoPtr _image; Exiv2::ExifData* _exifData; Exiv2::IptcData* _iptcData; Exiv2::XmpData* _xmpData; Exiv2::ExifThumb* _exifThumbnail; Exiv2::ExifThumb* _getExifThumbnail(); // true if the image's internal metadata has already been read, // false otherwise bool _dataRead; void _instantiate_image(); }; // Translate an Exiv2 generic exception into a Python exception void translateExiv2Error(Exiv2::Error const& error); // Functions to manipulate custom XMP namespaces void registerXmpNs(const std::string& name, const std::string& prefix); void unregisterXmpNs(const std::string& name); void unregisterAllXmpNs(); } // End of namespace exiv2wrapper #endif