diff --git a/modules/imgcodecs/src/grfmt_jpeg.cpp b/modules/imgcodecs/src/grfmt_jpeg.cpp index 506cebdf49..54dfea5a75 100644 --- a/modules/imgcodecs/src/grfmt_jpeg.cpp +++ b/modules/imgcodecs/src/grfmt_jpeg.cpp @@ -409,7 +409,9 @@ bool JpegDecoder::readData( Mat& img ) { jpeg_decompress_struct* cinfo = &((JpegState*)m_state)->cinfo; JpegErrorMgr* jerr = &((JpegState*)m_state)->jerr; +#ifndef JCS_EXTENSIONS JSAMPARRAY buffer = 0; +#endif if( setjmp( jerr->setjmp_buffer ) == 0 ) { @@ -429,6 +431,18 @@ bool JpegDecoder::readData( Mat& img ) } #endif +#ifdef JCS_EXTENSIONS + if( color ) + { + cinfo->out_color_space = JCS_EXT_BGR; + cinfo->out_color_components = 3; + } + else + { + cinfo->out_color_space = JCS_GRAYSCALE; + cinfo->out_color_components = 1; + } +#else if( color ) { if( cinfo->num_components != 4 ) @@ -455,6 +469,7 @@ bool JpegDecoder::readData( Mat& img ) cinfo->out_color_components = 4; } } +#endif // Check for Exif marker APP1 jpeg_saved_marker_ptr exif_marker = NULL; @@ -481,12 +496,17 @@ bool JpegDecoder::readData( Mat& img ) jpeg_start_decompress( cinfo ); +#ifndef JCS_EXTENSIONS buffer = (*cinfo->mem->alloc_sarray)((j_common_ptr)cinfo, JPOOL_IMAGE, m_width*4, 1 ); +#endif uchar* data = img.ptr(); for( ; m_height--; data += step ) { +#ifdef JCS_EXTENSIONS + jpeg_read_scanlines( cinfo, &data, 1 ); +#else jpeg_read_scanlines( cinfo, buffer, 1 ); if( color ) { @@ -502,6 +522,7 @@ bool JpegDecoder::readData( Mat& img ) else icvCvt_CMYK2Gray_8u_C4C1R( buffer[0], 0, data, 0, Size(m_width,1) ); } +#endif } result = true; @@ -593,8 +614,11 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) int width = img.cols, height = img.rows; std::vector out_buf(1 << 12); + +#ifndef JCS_EXTENSIONS AutoBuffer _buffer; uchar* buffer; +#endif struct jpeg_compress_struct cinfo; JpegErrorMgr jerr; @@ -629,8 +653,15 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) int _channels = img.channels(); int channels = _channels > 1 ? 3 : 1; + +#ifdef JCS_EXTENSIONS + cinfo.input_components = _channels; + cinfo.in_color_space = _channels == 3 ? JCS_EXT_BGR + : _channels == 4 ? JCS_EXT_BGRX : JCS_GRAYSCALE; +#else cinfo.input_components = channels; cinfo.in_color_space = channels > 1 ? JCS_RGB : JCS_GRAYSCALE; +#endif int quality = 95; int progressive = 0; @@ -746,14 +777,17 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) jpeg_start_compress( &cinfo, TRUE ); +#ifndef JCS_EXTENSIONS if( channels > 1 ) _buffer.allocate(width*channels); buffer = _buffer.data(); +#endif for( int y = 0; y < height; y++ ) { uchar *data = img.data + img.step*y, *ptr = data; +#ifndef JCS_EXTENSIONS if( _channels == 3 ) { icvCvt_BGR2RGB_8u_C3R( data, 0, buffer, 0, Size(width,1) ); @@ -764,6 +798,7 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) icvCvt_BGRA2BGR_8u_C4C3R( data, 0, buffer, 0, Size(width,1), 2 ); ptr = buffer; } +#endif jpeg_write_scanlines( &cinfo, &ptr, 1 ); }