alpha channels support for 8-bit tiffs
This commit is contained in:
		| @@ -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 ) | ||||
|                                     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, | ||||
|                                                              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, | ||||
|   | ||||
| @@ -103,6 +103,7 @@ public: | ||||
|  | ||||
|     size_t signatureLength() const; | ||||
|     bool checkSignature( const string& signature ) const; | ||||
|     int normalizeChannelsNumber(int channels) const; | ||||
|     ImageDecoder newDecoder() const; | ||||
|  | ||||
| protected: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 kobigurk
					kobigurk