From 4c1e6dd02375a4736166caa8da98f26d07af0780 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Sat, 9 Jul 2016 18:49:22 +0100 Subject: [PATCH] turn off chroma subsample for Q > 90 see https://github.com/jcupitt/libvips/issues/482 --- libvips/foreign/jpegsave.c | 3 ++- libvips/foreign/vips2jpeg.c | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/libvips/foreign/jpegsave.c b/libvips/foreign/jpegsave.c index f8b3b454..5289f176 100644 --- a/libvips/foreign/jpegsave.c +++ b/libvips/foreign/jpegsave.c @@ -95,7 +95,8 @@ typedef struct _VipsForeignSaveJpeg { */ gboolean trellis_quant; - /* Apply overshooting to samples with extreme values e.g. 0 & 255 for 8-bit. + /* Apply overshooting to samples with extreme values e.g. 0 & 255 + * for 8-bit. */ gboolean overshoot_deringing; diff --git a/libvips/foreign/vips2jpeg.c b/libvips/foreign/vips2jpeg.c index 91c703ed..dbf25447 100644 --- a/libvips/foreign/vips2jpeg.c +++ b/libvips/foreign/vips2jpeg.c @@ -78,6 +78,8 @@ * - add quant_table * 26/5/16 * - switch to new orientation tag + * 9/7/16 + * - turn off chroma subsample for Q > 90 */ /* @@ -1020,7 +1022,9 @@ write_vips( Write *write, int qfac, const char *profile, */ g_assert( in->BandFmt == VIPS_FORMAT_UCHAR ); g_assert( in->Coding == VIPS_CODING_NONE ); - g_assert( in->Bands == 1 || in->Bands == 3 || in->Bands == 4 ); + g_assert( in->Bands == 1 || + in->Bands == 3 || + in->Bands == 4 ); /* Check input image. */ @@ -1032,7 +1036,8 @@ write_vips( Write *write, int qfac, const char *profile, write->cinfo.image_width = in->Xsize; write->cinfo.image_height = in->Ysize; write->cinfo.input_components = in->Bands; - if( in->Bands == 4 && in->Type == VIPS_INTERPRETATION_CMYK ) { + if( in->Bands == 4 && + in->Type == VIPS_INTERPRETATION_CMYK ) { space = JCS_CMYK; /* IJG always sets an Adobe marker, so we should invert CMYK. */ @@ -1153,9 +1158,11 @@ write_vips( Write *write, int qfac, const char *profile, if( progressive ) jpeg_simple_progression( &write->cinfo ); - /* Turn off chroma subsampling. + /* Turn off chroma subsampling. Follow IM and do it automatically for + * high Q. */ - if( no_subsample ) { + if( no_subsample || + Q > 90 ) { int i; for( i = 0; i < in->Bands; i++ ) { @@ -1250,7 +1257,8 @@ vips__jpeg_write_file( VipsImage *in, */ if( write_vips( write, Q, profile, optimize_coding, progressive, strip, no_subsample, - trellis_quant, overshoot_deringing, optimize_scans, quant_table ) ) { + trellis_quant, overshoot_deringing, optimize_scans, + quant_table ) ) { write_destroy( write ); return( -1 ); } @@ -1535,7 +1543,8 @@ vips__jpeg_write_buffer( VipsImage *in, */ if( write_vips( write, Q, profile, optimize_coding, progressive, strip, no_subsample, - trellis_quant, overshoot_deringing, optimize_scans, quant_table ) ) { + trellis_quant, overshoot_deringing, optimize_scans, + quant_table ) ) { write_destroy( write ); return( -1 );