aboutsummaryrefslogtreecommitdiffstats
path: root/src/exiv2wrapper.cpp
diff options
context:
space:
mode:
authorOlivier Tilloy <olivier@tilloy.net>2010-11-21 22:12:40 +0100
committerOlivier Tilloy <olivier@tilloy.net>2010-11-21 22:12:40 +0100
commitf2c84dfdf8c98bb45248ca5c78b7f25c84e7ee27 (patch)
tree10157a8adf4c8c7927ed534eef6297f098ec8432 /src/exiv2wrapper.cpp
parentcc86aa2c24b3c53444c108b82295aae2085904db (diff)
downloadpyexiv2-f2c84dfdf8c98bb45248ca5c78b7f25c84e7ee27.tar.gz
Access to the read-only properties of the EXIF thumbnail optionally embedded in an image.
Diffstat (limited to 'src/exiv2wrapper.cpp')
-rw-r--r--src/exiv2wrapper.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/exiv2wrapper.cpp b/src/exiv2wrapper.cpp
index a5ae4aa..a9060d4 100644
--- a/src/exiv2wrapper.cpp
+++ b/src/exiv2wrapper.cpp
@@ -44,6 +44,8 @@ namespace exiv2wrapper
void Image::_instantiate_image()
{
+ _exifThumbnail = 0;
+
// If an exception is thrown, it has to be done outside of the
// Py_{BEGIN,END}_ALLOW_THREADS block.
Exiv2::Error error(0);
@@ -117,6 +119,10 @@ Image::~Image()
{
delete[] _data;
}
+ if (_exifThumbnail != 0)
+ {
+ delete _exifThumbnail;
+ }
}
void Image::readMetadata()
@@ -444,6 +450,49 @@ std::string Image::getDataBuffer() const
return buffer;
}
+Exiv2::ExifThumb* Image::_getExifThumbnail()
+{
+ CHECK_METADATA_READ
+ if (_exifThumbnail == 0)
+ {
+ _exifThumbnail = new Exiv2::ExifThumb(*_exifData);
+ }
+ return _exifThumbnail;
+}
+
+const std::string Image::getExifThumbnailMimeType()
+{
+ return std::string(_getExifThumbnail()->mimeType());
+}
+
+const std::string Image::getExifThumbnailExtension()
+{
+ return std::string(_getExifThumbnail()->extension());
+}
+
+void Image::writeExifThumbnailToFile(const std::string& path)
+{
+ _getExifThumbnail()->writeFile(path);
+}
+
+const std::string Image::getExifThumbnailData()
+{
+ Exiv2::DataBuf buffer = _getExifThumbnail()->copy();
+ // Copy the data buffer in a string. Since the data buffer can contain null
+ // characters ('\x00'), the string cannot be simply constructed like that:
+ // data = std::string((char*) buffer.pData_);
+ // because it would be truncated after the first occurence of a null
+ // character. Therefore, it has to be copied character by character.
+ // First allocate the memory for the whole string...
+ std::string data = std::string(buffer.size_, ' ');
+ // ... then fill it with the raw data.
+ for(unsigned int i = 0; i < buffer.size_; ++i)
+ {
+ data[i] = buffer.pData_[i];
+ }
+ return data;
+}
+
ExifTag::ExifTag(const std::string& key, Exiv2::Exifdatum* datum, Exiv2::ExifData* data): _key(key)
{