|
|
|
@ -101,6 +101,11 @@ bool TiffDecoder::checkSignature( const string& signature ) const |
|
|
|
|
memcmp(signature.c_str(), fmtSignTiffMM, 4) == 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int TiffDecoder::normalizeChannelsNumber(int channels) const |
|
|
|
|
{ |
|
|
|
|
return channels > 4 ? 4 : channels; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ImageDecoder TiffDecoder::newDecoder() const |
|
|
|
|
{ |
|
|
|
|
return new TiffDecoder; |
|
|
|
@ -133,10 +138,11 @@ bool TiffDecoder::readHeader() |
|
|
|
|
(ncn != 1 && ncn != 3 && ncn != 4))) |
|
|
|
|
bpp = 8; |
|
|
|
|
|
|
|
|
|
int wanted_channels = normalizeChannelsNumber(ncn); |
|
|
|
|
switch(bpp) |
|
|
|
|
{ |
|
|
|
|
case 8: |
|
|
|
|
m_type = CV_MAKETYPE(CV_8U, photometric > 1 ? 3 : 1); |
|
|
|
|
m_type = CV_MAKETYPE(CV_8U, photometric > 1 ? wanted_channels : 1); |
|
|
|
|
break; |
|
|
|
|
case 16: |
|
|
|
|
m_type = CV_MAKETYPE(CV_16U, photometric > 1 ? 3 : 1); |
|
|
|
@ -185,6 +191,7 @@ bool TiffDecoder::readData( Mat& img ) |
|
|
|
|
TIFFGetField( tif, TIFFTAG_SAMPLESPERPIXEL, &ncn ); |
|
|
|
|
const int bitsPerByte = 8; |
|
|
|
|
int dst_bpp = (int)(img.elemSize1() * bitsPerByte); |
|
|
|
|
int wanted_channels = normalizeChannelsNumber(img.channels()); |
|
|
|
|
|
|
|
|
|
if(dst_bpp == 8) |
|
|
|
|
{ |
|
|
|
@ -248,9 +255,20 @@ bool TiffDecoder::readData( Mat& img ) |
|
|
|
|
|
|
|
|
|
for( i = 0; i < tile_height; i++ ) |
|
|
|
|
if( color ) |
|
|
|
|
{ |
|
|
|
|
if (wanted_channels == 4) |
|
|
|
|
{ |
|
|
|
|
icvCvt_BGRA2RGBA_8u_C4R( buffer + i*tile_width*4, 0, |
|
|
|
|
data + x*4 + img.step*(tile_height - i - 1), 0, |
|
|
|
|
cvSize(tile_width,1) ); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
icvCvt_BGRA2BGR_8u_C4C3R( buffer + i*tile_width*4, 0, |
|
|
|
|
data + x*3 + img.step*(tile_height - i - 1), 0, |
|
|
|
|
cvSize(tile_width,1), 2 ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
icvCvt_BGRA2Gray_8u_C4C1R( buffer + i*tile_width*4, 0, |
|
|
|
|
data + x + img.step*(tile_height - i - 1), 0, |
|
|
|
|