RAF: Simplify metadata extraction
Remove manual TiffParser usage for reading APP1 segement, instead use JpegImage for proper parsing.
This commit is contained in:
parent
6c4b6d9d7f
commit
d27c5ac838
@ -259,27 +259,18 @@ void RafImage::readMetadata() {
|
|||||||
throw Error(ErrorCode::kerFailedToReadImageData);
|
throw Error(ErrorCode::kerFailedToReadImageData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extracting metadata from first APP1 container
|
// Retreive metadata from embedded JPEG preview image.
|
||||||
constexpr byte tiff_offset = 12;
|
auto jpg_io = std::make_unique<Exiv2::MemIo>(jpg_buf.data(), jpg_buf.size());
|
||||||
ByteOrder bo = TiffParser::decode(exifData_, iptcData_, xmpData_, jpg_buf.c_data() + tiff_offset, jpg_buf.size() - tiff_offset);
|
auto jpg_img = JpegImage(std::move(jpg_io), false);
|
||||||
|
jpg_img.readMetadata();
|
||||||
// If there is no XMP data in first APP1 EXIF structure, there is maybe
|
setByteOrder(jpg_img.byteOrder());
|
||||||
// another APP1 container for XMP. Just use the JpegImage metadata parser for that.
|
xmpData_ = jpg_img.xmpData();
|
||||||
if(xmpData_.empty()) {
|
exifData_ = jpg_img.exifData();
|
||||||
auto jpg_io = std::make_unique<Exiv2::MemIo>(jpg_buf.data(), jpg_buf.size());
|
iptcData_ = jpg_img.iptcData();
|
||||||
auto jpg_img = JpegImage(std::move(jpg_io), false);
|
|
||||||
jpg_img.readMetadata();
|
|
||||||
const auto jpg_xmp_data = jpg_img.xmpData();
|
|
||||||
for(auto& datum : jpg_xmp_data) {
|
|
||||||
xmpData_.add(datum);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian);
|
exifData_["Exif.Image2.JPEGInterchangeFormat"] = getULong(jpg_img_offset, bigEndian);
|
||||||
exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);
|
exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);
|
||||||
|
|
||||||
setByteOrder(bo);
|
|
||||||
|
|
||||||
// parse the tiff
|
// parse the tiff
|
||||||
byte readBuff[4];
|
byte readBuff[4];
|
||||||
if (io_->seek(100, BasicIo::beg) != 0)
|
if (io_->seek(100, BasicIo::beg) != 0)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user