remove 2-channel png encoder/decoder support
This commit is contained in:
parent
d40e46bc9b
commit
ea911d34c6
@ -187,26 +187,21 @@ bool PngDecoder::readHeader()
|
|||||||
|
|
||||||
if( bit_depth <= 8 || bit_depth == 16 )
|
if( bit_depth <= 8 || bit_depth == 16 )
|
||||||
{
|
{
|
||||||
png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values);
|
|
||||||
switch(color_type)
|
switch(color_type)
|
||||||
{
|
{
|
||||||
case PNG_COLOR_TYPE_RGB:
|
case PNG_COLOR_TYPE_RGB:
|
||||||
case PNG_COLOR_TYPE_PALETTE:
|
case PNG_COLOR_TYPE_PALETTE:
|
||||||
|
png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values);
|
||||||
if( num_trans > 0 )
|
if( num_trans > 0 )
|
||||||
m_type = CV_8UC4;
|
m_type = CV_8UC4;
|
||||||
else
|
else
|
||||||
m_type = CV_8UC3;
|
m_type = CV_8UC3;
|
||||||
break;
|
break;
|
||||||
|
case PNG_COLOR_TYPE_GRAY_ALPHA:
|
||||||
case PNG_COLOR_TYPE_RGB_ALPHA:
|
case PNG_COLOR_TYPE_RGB_ALPHA:
|
||||||
m_type = CV_8UC4;
|
m_type = CV_8UC4;
|
||||||
break;
|
break;
|
||||||
case PNG_COLOR_TYPE_GRAY_ALPHA:
|
|
||||||
m_type = CV_8UC2;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
if( num_trans > 0 )
|
|
||||||
m_type = CV_8UC2;
|
|
||||||
else
|
|
||||||
m_type = CV_8UC1;
|
m_type = CV_8UC1;
|
||||||
}
|
}
|
||||||
if( bit_depth == 16 )
|
if( bit_depth == 16 )
|
||||||
@ -230,7 +225,7 @@ bool PngDecoder::readData( Mat& img )
|
|||||||
volatile bool result = false;
|
volatile bool result = false;
|
||||||
AutoBuffer<uchar*> _buffer(m_height);
|
AutoBuffer<uchar*> _buffer(m_height);
|
||||||
uchar** buffer = _buffer;
|
uchar** buffer = _buffer;
|
||||||
int color = img.channels() > 2;
|
int color = img.channels() > 1;
|
||||||
|
|
||||||
if( m_png_ptr && m_info_ptr && m_end_info && m_width && m_height )
|
if( m_png_ptr && m_info_ptr && m_end_info && m_width && m_height )
|
||||||
{
|
{
|
||||||
@ -247,7 +242,7 @@ bool PngDecoder::readData( Mat& img )
|
|||||||
else if( !isBigEndian() )
|
else if( !isBigEndian() )
|
||||||
png_set_swap( png_ptr );
|
png_set_swap( png_ptr );
|
||||||
|
|
||||||
if(img.channels() != 4 && img.channels() != 2)
|
if(img.channels() < 4)
|
||||||
{
|
{
|
||||||
/* observation: png_read_image() writes 400 bytes beyond
|
/* observation: png_read_image() writes 400 bytes beyond
|
||||||
* end of data when reading a 400x118 color png
|
* end of data when reading a 400x118 color png
|
||||||
@ -272,7 +267,7 @@ bool PngDecoder::readData( Mat& img )
|
|||||||
png_set_gray_1_2_4_to_8( png_ptr );
|
png_set_gray_1_2_4_to_8( png_ptr );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( CV_MAT_CN(m_type) > 2 && color )
|
if( (m_color_type & PNG_COLOR_MASK_COLOR) && color )
|
||||||
png_set_bgr( png_ptr ); // convert RGB to BGR
|
png_set_bgr( png_ptr ); // convert RGB to BGR
|
||||||
else if( color )
|
else if( color )
|
||||||
png_set_gray_to_rgb( png_ptr ); // Gray->RGB
|
png_set_gray_to_rgb( png_ptr ); // Gray->RGB
|
||||||
@ -413,7 +408,6 @@ bool PngEncoder::write( const Mat& img, const std::vector<int>& params )
|
|||||||
|
|
||||||
png_set_IHDR( png_ptr, info_ptr, width, height, depth == CV_8U ? isBilevel?1:8 : 16,
|
png_set_IHDR( png_ptr, info_ptr, width, height, depth == CV_8U ? isBilevel?1:8 : 16,
|
||||||
channels == 1 ? PNG_COLOR_TYPE_GRAY :
|
channels == 1 ? PNG_COLOR_TYPE_GRAY :
|
||||||
channels == 2 ? PNG_COLOR_TYPE_GRAY_ALPHA :
|
|
||||||
channels == 3 ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA,
|
channels == 3 ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGBA,
|
||||||
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
||||||
PNG_FILTER_TYPE_DEFAULT );
|
PNG_FILTER_TYPE_DEFAULT );
|
||||||
|
@ -452,6 +452,8 @@ static bool imwrite_( const String& filename, const Mat& image,
|
|||||||
Mat temp;
|
Mat temp;
|
||||||
const Mat* pimage = ℑ
|
const Mat* pimage = ℑ
|
||||||
|
|
||||||
|
CV_Assert( image.channels() == 1 || image.channels() == 3 || image.channels() == 4 );
|
||||||
|
|
||||||
ImageEncoder encoder = findEncoder( filename );
|
ImageEncoder encoder = findEncoder( filename );
|
||||||
if( !encoder )
|
if( !encoder )
|
||||||
CV_Error( CV_StsError, "could not find a writer for the specified extension" );
|
CV_Error( CV_StsError, "could not find a writer for the specified extension" );
|
||||||
@ -588,6 +590,9 @@ bool imencode( const String& ext, InputArray _image,
|
|||||||
{
|
{
|
||||||
Mat image = _image.getMat();
|
Mat image = _image.getMat();
|
||||||
|
|
||||||
|
int channels = image.channels();
|
||||||
|
CV_Assert( channels == 1 || channels == 3 || channels == 4 );
|
||||||
|
|
||||||
ImageEncoder encoder = findEncoder( ext );
|
ImageEncoder encoder = findEncoder( ext );
|
||||||
if( !encoder )
|
if( !encoder )
|
||||||
CV_Error( CV_StsError, "could not find encoder for the specified extension" );
|
CV_Error( CV_StsError, "could not find encoder for the specified extension" );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user