Fix for vertically flipped tiff files reading
authorVitaly Tuzov <terfendail@mediana.jetos.com>
Wed, 31 Jan 2018 13:24:24 +0000 (16:24 +0300)
committerVitaly Tuzov <terfendail@mediana.jetos.com>
Mon, 19 Feb 2018 15:49:19 +0000 (18:49 +0300)
modules/imgcodecs/src/grfmt_tiff.cpp

index 8c594a3..9706b94 100644 (file)
@@ -300,7 +300,6 @@ bool  TiffDecoder::readData( Mat& img )
     }
     bool result = false;
     bool color = img.channels() > 1;
-    uchar* data = img.ptr();
 
     if( img.depth() != CV_8U && img.depth() != CV_16U && img.depth() != CV_32F && img.depth() != CV_64F )
         return false;
@@ -316,6 +315,10 @@ bool  TiffDecoder::readData( Mat& img )
         uint16 bpp = 8, ncn = photometric > 1 ? 3 : 1;
         TIFFGetField( tif, TIFFTAG_BITSPERSAMPLE, &bpp );
         TIFFGetField( tif, TIFFTAG_SAMPLESPERPIXEL, &ncn );
+        uint16 img_orientation = ORIENTATION_TOPLEFT;
+        TIFFGetField( tif, TIFFTAG_ORIENTATION, &img_orientation);
+        bool vert_flip = (img_orientation == ORIENTATION_BOTRIGHT) || (img_orientation == ORIENTATION_RIGHTBOT) ||
+                         (img_orientation == ORIENTATION_BOTLEFT) || (img_orientation == ORIENTATION_LEFTBOT);
         const int bitsPerByte = 8;
         int dst_bpp = (int)(img.elemSize1() * bitsPerByte);
         int wanted_channels = normalizeChannelsNumber(img.channels());
@@ -358,13 +361,15 @@ bool  TiffDecoder::readData( Mat& img )
             double* buffer64 = (double*)buffer;
             int tileidx = 0;
 
-            for( y = 0; y < m_height; y += tile_height0, data += img.step*tile_height0 )
+            for( y = 0; y < m_height; y += tile_height0 )
             {
                 int tile_height = tile_height0;
 
                 if( y + tile_height > m_height )
                     tile_height = m_height - y;
 
+                uchar* data = img.ptr(vert_flip ? m_height - y - tile_height : y);
+
                 for( x = 0; x < m_width; x += tile_width0, tileidx++ )
                 {
                     int tile_width = tile_width0, ok;