@@ -300,7 +300,6 @@ bool TiffDecoder::readData( Mat& img )
300
300
}
301
301
bool result = false ;
302
302
bool color = img.channels () > 1 ;
303
- uchar* data = img.ptr ();
304
303
305
304
if ( img.depth () != CV_8U && img.depth () != CV_16U && img.depth () != CV_32F && img.depth () != CV_64F )
306
305
return false ;
@@ -316,6 +315,10 @@ bool TiffDecoder::readData( Mat& img )
316
315
uint16 bpp = 8 , ncn = photometric > 1 ? 3 : 1 ;
317
316
TIFFGetField ( tif, TIFFTAG_BITSPERSAMPLE, &bpp );
318
317
TIFFGetField ( tif, TIFFTAG_SAMPLESPERPIXEL, &ncn );
318
+ uint16 img_orientation = ORIENTATION_TOPLEFT;
319
+ TIFFGetField ( tif, TIFFTAG_ORIENTATION, &img_orientation);
320
+ bool vert_flip = (img_orientation == ORIENTATION_BOTRIGHT) || (img_orientation == ORIENTATION_RIGHTBOT) ||
321
+ (img_orientation == ORIENTATION_BOTLEFT) || (img_orientation == ORIENTATION_LEFTBOT);
319
322
const int bitsPerByte = 8 ;
320
323
int dst_bpp = (int )(img.elemSize1 () * bitsPerByte);
321
324
int wanted_channels = normalizeChannelsNumber (img.channels ());
@@ -358,13 +361,15 @@ bool TiffDecoder::readData( Mat& img )
358
361
double * buffer64 = (double *)buffer;
359
362
int tileidx = 0 ;
360
363
361
- for ( y = 0 ; y < m_height; y += tile_height0, data += img. step *tile_height0 )
364
+ for ( y = 0 ; y < m_height; y += tile_height0 )
362
365
{
363
366
int tile_height = tile_height0;
364
367
365
368
if ( y + tile_height > m_height )
366
369
tile_height = m_height - y;
367
370
371
+ uchar* data = img.ptr (vert_flip ? m_height - y - tile_height : y);
372
+
368
373
for ( x = 0 ; x < m_width; x += tile_width0, tileidx++ )
369
374
{
370
375
int tile_width = tile_width0, ok;
0 commit comments