From 7927ebf20eae7e265904e4665645331d8a2860ca Mon Sep 17 00:00:00 2001 From: kobigurk Date: Sun, 10 Feb 2013 01:22:49 +0200 Subject: [PATCH] alpha channels support for 8-bit tiffs --- modules/highgui/src/grfmt_tiff.cpp | 22 ++++++++++++++++++++-- modules/highgui/src/grfmt_tiff.hpp | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/modules/highgui/src/grfmt_tiff.cpp b/modules/highgui/src/grfmt_tiff.cpp index 5179531f50..6258e46d56 100644 --- a/modules/highgui/src/grfmt_tiff.cpp +++ b/modules/highgui/src/grfmt_tiff.cpp @@ -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, diff --git a/modules/highgui/src/grfmt_tiff.hpp b/modules/highgui/src/grfmt_tiff.hpp index 831854828f..6cf77302e5 100644 --- a/modules/highgui/src/grfmt_tiff.hpp +++ b/modules/highgui/src/grfmt_tiff.hpp @@ -103,6 +103,7 @@ public: size_t signatureLength() const; bool checkSignature( const string& signature ) const; + int normalizeChannelsNumber(int channels) const; ImageDecoder newDecoder() const; protected: