From eaec13209135bd28c73d15017645ee065c9ca003 Mon Sep 17 00:00:00 2001 From: Sergei Nikulov Date: Wed, 30 Jul 2014 00:03:41 +0400 Subject: [PATCH] #2992: update after review --- .../imgcodecs/include/opencv2/imgcodecs.hpp | 22 ++++----- .../include/opencv2/imgcodecs/imgcodecs_c.h | 4 +- modules/imgcodecs/src/grfmt_jpeg.cpp | 49 ++++++++++++------- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/modules/imgcodecs/include/opencv2/imgcodecs.hpp b/modules/imgcodecs/include/opencv2/imgcodecs.hpp index 94948525c9..97fff83e14 100644 --- a/modules/imgcodecs/include/opencv2/imgcodecs.hpp +++ b/modules/imgcodecs/include/opencv2/imgcodecs.hpp @@ -56,17 +56,17 @@ enum { IMREAD_UNCHANGED = -1, // 8bit, color or not IMREAD_ANYCOLOR = 4 // ?, any color }; -enum { IMWRITE_JPEG_QUALITY = 1, - IMWRITE_JPEG_PROGRESSIVE = 2, - IMWRITE_JPEG_OPTIMIZE = 3, - IMWRITE_JPEG_RST_INTERVAL = 4, - IMWRITE_JPEG_LUM_QUALITY = 5, - IMWRITE_JPEG_CHROM_QUALITY = 6, - IMWRITE_PNG_COMPRESSION = 16, - IMWRITE_PNG_STRATEGY = 17, - IMWRITE_PNG_BILEVEL = 18, - IMWRITE_PXM_BINARY = 32, - IMWRITE_WEBP_QUALITY = 64 +enum { IMWRITE_JPEG_QUALITY = 1, + IMWRITE_JPEG_PROGRESSIVE = 2, + IMWRITE_JPEG_OPTIMIZE = 3, + IMWRITE_JPEG_RST_INTERVAL = 4, + IMWRITE_JPEG_LUMA_QUALITY = 5, + IMWRITE_JPEG_CHROMA_QUALITY = 6, + IMWRITE_PNG_COMPRESSION = 16, + IMWRITE_PNG_STRATEGY = 17, + IMWRITE_PNG_BILEVEL = 18, + IMWRITE_PXM_BINARY = 32, + IMWRITE_WEBP_QUALITY = 64 }; enum { IMWRITE_PNG_STRATEGY_DEFAULT = 0, diff --git a/modules/imgcodecs/include/opencv2/imgcodecs/imgcodecs_c.h b/modules/imgcodecs/include/opencv2/imgcodecs/imgcodecs_c.h index a36b454058..ccd29a7c1c 100644 --- a/modules/imgcodecs/include/opencv2/imgcodecs/imgcodecs_c.h +++ b/modules/imgcodecs/include/opencv2/imgcodecs/imgcodecs_c.h @@ -77,8 +77,8 @@ enum CV_IMWRITE_JPEG_PROGRESSIVE =2, CV_IMWRITE_JPEG_OPTIMIZE =3, CV_IMWRITE_JPEG_RST_INTERVAL =4, - CV_IMWRITE_JPEG_LUM_QUALITY =5, - CV_IMWRITE_JPEG_CHROM_QUALITY =6, + CV_IMWRITE_JPEG_LUMA_QUALITY =5, + CV_IMWRITE_JPEG_CHROMA_QUALITY =6, CV_IMWRITE_PNG_COMPRESSION =16, CV_IMWRITE_PNG_STRATEGY =17, CV_IMWRITE_PNG_BILEVEL =18, diff --git a/modules/imgcodecs/src/grfmt_jpeg.cpp b/modules/imgcodecs/src/grfmt_jpeg.cpp index 3157ebfcb1..ec1793287f 100644 --- a/modules/imgcodecs/src/grfmt_jpeg.cpp +++ b/modules/imgcodecs/src/grfmt_jpeg.cpp @@ -601,8 +601,8 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) int progressive = 0; int optimize = 0; int rst_interval = 0; - int lum_quality = 100; - int chrom_quality = 100; + int luma_quality = -1; + int chroma_quality = -1; for( size_t i = 0; i < params.size(); i += 2 ) { @@ -622,16 +622,27 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) optimize = params[i+1]; } - if( params[i] == CV_IMWRITE_JPEG_LUM_QUALITY ) + if( params[i] == CV_IMWRITE_JPEG_LUMA_QUALITY ) { - lum_quality = params[i+1]; - lum_quality = MIN(MAX(lum_quality, 0), 100); + if (params[i+1] >= 0) + { + luma_quality = MIN(MAX(params[i+1], 0), 100); + + quality = luma_quality; + + if (chroma_quality < 0) + { + chroma_quality = luma_quality; + } + } } - if( params[i] == CV_IMWRITE_JPEG_CHROM_QUALITY ) + if( params[i] == CV_IMWRITE_JPEG_CHROMA_QUALITY ) { - chrom_quality = params[i+1]; - chrom_quality = MIN(MAX(chrom_quality, 0), 100); + if (params[i+1] >= 0) + { + chroma_quality = MIN(MAX(params[i+1], 0), 100); + } } if( params[i] == CV_IMWRITE_JPEG_RST_INTERVAL ) @@ -643,6 +654,7 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) jpeg_set_defaults( &cinfo ); cinfo.restart_interval = rst_interval; + jpeg_set_quality( &cinfo, quality, TRUE /* limit to baseline-JPEG values */ ); if( progressive ) @@ -651,17 +663,20 @@ bool JpegEncoder::write( const Mat& img, const std::vector& params ) cinfo.optimize_coding = TRUE; #if JPEG_LIB_VERSION >= 70 - cinfo.q_scale_factor[0] = jpeg_quality_scaling(lum_quality); - cinfo.q_scale_factor[1] = jpeg_quality_scaling(chrom_quality); - if ( lum_quality != chrom_quality ) + if (luma_quality >= 0 && chroma_quality >= 0) { - /* disable subsampling - ref. Libjpeg.txt */ - cinfo.comp_info[0].v_samp_factor = 1; - cinfo.comp_info[0].h_samp_factor = 1; - cinfo.comp_info[1].v_samp_factor = 1; - cinfo.comp_info[1].h_samp_factor = 1; + cinfo.q_scale_factor[0] = jpeg_quality_scaling(luma_quality); + cinfo.q_scale_factor[1] = jpeg_quality_scaling(chroma_quality); + if ( luma_quality != chroma_quality ) + { + /* disable subsampling - ref. Libjpeg.txt */ + cinfo.comp_info[0].v_samp_factor = 1; + cinfo.comp_info[0].h_samp_factor = 1; + cinfo.comp_info[1].v_samp_factor = 1; + cinfo.comp_info[1].h_samp_factor = 1; + } + jpeg_default_qtables( &cinfo, TRUE ); } - jpeg_default_qtables( &cinfo, TRUE ); #endif // #if JPEG_LIB_VERSION >= 70 jpeg_start_compress( &cinfo, TRUE ); -- GitLab