alpha channels support for 8-bit tiffs
This commit is contained in:
parent
c527340cb6
commit
7927ebf20e
@ -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,
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user