Support for multipage decoding in BaseImageDecoder and implemented in TiffDecoder.
authorAshod Nakashian <ashodnakashian@yahoo.com>
Mon, 29 Dec 2014 15:50:03 +0000 (10:50 -0500)
committerAshod Nakashian <ashodnakashian@yahoo.com>
Sat, 3 Jan 2015 05:09:34 +0000 (00:09 -0500)
modules/imgcodecs/src/grfmt_base.hpp
modules/imgcodecs/src/grfmt_tiff.cpp
modules/imgcodecs/src/grfmt_tiff.hpp

index 8a534da..dcb75b0 100644 (file)
@@ -70,6 +70,9 @@ public:
     virtual bool readHeader() = 0;
     virtual bool readData( Mat& img ) = 0;
 
+    /// Called after readData to advance to the next page, if any.
+    virtual bool nextPage() { return false; }
+
     virtual size_t signatureLength() const;
     virtual bool checkSignature( const String& signature ) const;
     virtual ImageDecoder newDecoder() const;
index 7ec76c8..7046276 100644 (file)
@@ -118,10 +118,13 @@ bool TiffDecoder::readHeader()
 {
     bool result = false;
 
-    close();
-    // TIFFOpen() mode flags are different to fopen().  A 'b' in mode "rb" has no effect when reading.
-    // http://www.remotesensing.org/libtiff/man/TIFFOpen.3tiff.html
-    TIFF* tif = TIFFOpen( m_filename.c_str(), "r" );
+    TIFF* tif = static_cast<TIFF*>(m_tif);
+    if (!m_tif)
+    {
+        // TIFFOpen() mode flags are different to fopen().  A 'b' in mode "rb" has no effect when reading.
+        // http://www.remotesensing.org/libtiff/man/TIFFOpen.3tiff.html
+        tif = TIFFOpen(m_filename.c_str(), "r");
+    }
 
     if( tif )
     {
@@ -182,6 +185,13 @@ bool TiffDecoder::readHeader()
     return result;
 }
 
+bool TiffDecoder::nextPage()
+{
+    // Prepare the next page, if any.
+    return m_tif &&
+           TIFFReadDirectory(static_cast<TIFF*>(m_tif)) && 
+           readHeader();
+}
 
 bool  TiffDecoder::readData( Mat& img )
 {
@@ -413,7 +423,6 @@ bool  TiffDecoder::readData( Mat& img )
         }
     }
 
-    close();
     return result;
 }
 
index ec29fbc..f019082 100644 (file)
@@ -100,6 +100,7 @@ public:
     bool  readHeader();
     bool  readData( Mat& img );
     void  close();
+    bool  nextPage();
 
     size_t signatureLength() const;
     bool checkSignature( const String& signature ) const;