raw: fix multi image load

Fixes not loading a second image in the file. This patch allow code like the following.

QImageReader r(file);
do {
    auto qi = r.read();
    if (!qi.isNull()) {
        qi.save(QString("/tmp/%1_%2.tif")
                .arg(QFileInfo(file).baseName())
                .arg(r.currentImageNumber()));
    }
}
while (r.jumpToNextImage());

m_startPos is used to reposition the device if you decide to do a subsequent read: libraw wants it to be at the beginning of the RAW stream

(cherry picked from commit 18ea0492bc5b6689c9523c84dd716b3c50dc918f)
This commit is contained in:
Mirco Miranda 2023-09-25 20:55:53 +00:00 committed by Albert Astals Cid
parent c3daf86079
commit 478e49b8a6
2 changed files with 20 additions and 2 deletions

View File

@ -443,7 +443,9 @@ void setParams(QImageIOHandler *handler, LibRaw *rawProcessor)
auto &&rawparams = rawProcessor->imgdata.rawparams; auto &&rawparams = rawProcessor->imgdata.rawparams;
#endif #endif
// Select one raw image from input file (0 - first, ...) // Select one raw image from input file (0 - first, ...)
rawparams.shot_select = handler->currentImageNumber(); if (handler->currentImageNumber() > -1) {
rawparams.shot_select = handler->currentImageNumber();
}
// *** Set processing parameters // *** Set processing parameters
@ -723,6 +725,7 @@ RAWHandler::RAWHandler()
: m_imageNumber(0) : m_imageNumber(0)
, m_imageCount(0) , m_imageCount(0)
, m_quality(-1) , m_quality(-1)
, m_startPos(-1)
{ {
} }
@ -739,6 +742,15 @@ bool RAWHandler::read(QImage *image)
{ {
auto dev = device(); auto dev = device();
// set the image position after the first run.
if (!dev->isSequential()) {
if (m_startPos < 0) {
m_startPos = dev->pos();
} else {
dev->seek(m_startPos);
}
}
// Check image file format. // Check image file format.
if (dev->atEnd()) { if (dev->atEnd()) {
return false; return false;
@ -820,7 +832,7 @@ bool RAWHandler::jumpToNextImage()
bool RAWHandler::jumpToImage(int imageNumber) bool RAWHandler::jumpToImage(int imageNumber)
{ {
if (imageNumber >= imageCount()) { if (imageNumber < 0 || imageNumber >= imageCount()) {
return false; return false;
} }
m_imageNumber = imageNumber; m_imageNumber = imageNumber;

View File

@ -78,6 +78,12 @@ private:
* @note It is safe to set both W and A: W is used if camera white balance is found, otherwise A is used. * @note It is safe to set both W and A: W is used if camera white balance is found, otherwise A is used.
*/ */
qint32 m_quality; qint32 m_quality;
/*!
* \brief m_startPos
* The initial device position to allow multi image load (cache value).
*/
qint64 m_startPos;
}; };
class RAWPlugin : public QImageIOPlugin class RAWPlugin : public QImageIOPlugin