alpha channels support for 8-bit tiffs

This commit is contained in:
kobigurk 2013-02-10 01:22:49 +02:00
parent c527340cb6
commit 7927ebf20e
2 changed files with 21 additions and 2 deletions

View File

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

View File

@ -103,6 +103,7 @@ public:
size_t signatureLength() const; size_t signatureLength() const;
bool checkSignature( const string& signature ) const; bool checkSignature( const string& signature ) const;
int normalizeChannelsNumber(int channels) const;
ImageDecoder newDecoder() const; ImageDecoder newDecoder() const;
protected: protected: