Commit 7927ebf2 authored by kobigurk's avatar kobigurk

alpha channels support for 8-bit tiffs

parent c527340c
...@@ -101,6 +101,11 @@ bool TiffDecoder::checkSignature( const string& signature ) const ...@@ -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() ...@@ -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 ) ...@@ -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 ) ...@@ -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,
......
...@@ -103,6 +103,7 @@ public: ...@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment