diff --git a/libxisf.cpp b/libxisf.cpp index 6eed958..b6b7310 100644 --- a/libxisf.cpp +++ b/libxisf.cpp @@ -520,6 +520,7 @@ public: * @param readPixel when false it will read pixel data from file and imageData() * will return nullptr */ const Image& getImage(uint32_t n, bool readPixels = true); + const Image& getThumbnail(); private: void readXISFHeader(); void readSignature(); @@ -532,6 +533,7 @@ private: std::unique_ptr _io; std::vector _images; + Image _thumbnail; std::vector _properties; }; @@ -588,6 +590,19 @@ const Image& XISFReaderPrivate::getImage(uint32_t n, bool readPixels) return img; } +const Image &XISFReaderPrivate::getThumbnail() +{ + Image &img = _thumbnail; + if(_thumbnail._dataBlock.attachmentPos) + { + _io->seekg(img._dataBlock.attachmentPos); + ByteArray data(img._dataBlock.attachmentSize); + _io->read(data.data(), data.size()); + img._dataBlock.decompress(data); + } + return _thumbnail; +} + void XISFReaderPrivate::readXISFHeader() { uint32_t headerLen[2] = {0}; @@ -608,6 +623,9 @@ void XISFReaderPrivate::readXISFHeader() for(auto &property : root.children("Property")) _properties.push_back(parseProperty(property)); + + if(root.child("Thumbnail")) + _thumbnail = parseImage(root.child("Thumbnail")); } else throw Error("Unknown root XML element"); } @@ -784,6 +802,9 @@ Image XISFReaderPrivate::parseImage(const pugi::xml_node &node) image._iccProfile = icc.data; } + if(node.child("Thumbnail") && std::strcmp(node.name(), "Thumbnail")) + _thumbnail = parseImage(node.child("Thumbnail")); + return image; } @@ -1034,6 +1055,11 @@ const Image &XISFReader::getImage(uint32_t n, bool readPixels) return p->getImage(n, readPixels); } +const Image &XISFReader::getThumbnail() +{ + return p->getThumbnail(); +} + XISFWriter::XISFWriter() { p = new XISFWriterPrivate; diff --git a/libxisf.h b/libxisf.h index d9d0efc..86d7223 100644 --- a/libxisf.h +++ b/libxisf.h @@ -364,9 +364,14 @@ public: int imagesCount() const; /** Return reference to Image * @param n index of image - * @param readPixel when false it will read pixel data from file and imageData() - * will return nullptr */ + * @param readPixel when false it will not read pixel data from file and imageData() + * will return nullptr. Other properties like width, height, format etc will be returned correctly */ const Image& getImage(uint32_t n, bool readPixels = true); + /** + * @brief getThumbnail + * @return image thumbnail + */ + const Image& getThumbnail(); private: XISFReaderPrivate *p; };