From 537ca9bf78066f5267b5aec9813638ed1d1e8071 Mon Sep 17 00:00:00 2001 From: Mike Kuta Date: Wed, 15 Mar 2017 11:56:11 -0400 Subject: [PATCH 1/2] Check for greyscale when small image uses palette When a small file is stored with a palette, a test is made to see if removing the palette, and the overhead that goes with it, results in an even smaller file. That test was always attempting RGB or RGBA mode even when the image in question was greyscale. I added a check for greyscale. --- src/zopflipng/zopflipng_lib.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zopflipng/zopflipng_lib.cc b/src/zopflipng/zopflipng_lib.cc index b93bb18b..89312eca 100644 --- a/src/zopflipng/zopflipng_lib.cc +++ b/src/zopflipng/zopflipng_lib.cc @@ -239,7 +239,7 @@ unsigned TryOptimize( // Too small for tRNS chunk overhead. if (w * h <= 16 && profile.key) profile.alpha = 1; state.encoder.auto_convert = 0; - state.info_png.color.colortype = (profile.alpha ? LCT_RGBA : LCT_RGB); + state.info_png.color.colortype = (profile.alpha ? (profile.colored ? LCT_RGBA : LCT_GREY_ALPHA) : (profile.colored ? LCT_RGB : LCT_GREY)); state.info_png.color.bitdepth = 8; state.info_png.color.key_defined = (profile.key && !profile.alpha); if (state.info_png.color.key_defined) { From 38b6ffb5860fb4da0656f32e554805cb9a8571ce Mon Sep 17 00:00:00 2001 From: Mike Kuta Date: Thu, 16 Mar 2017 10:58:05 -0400 Subject: [PATCH 2/2] Use bit depth of greyscale when trying to beat palette When checking if an image is smaller without a palette, use the minimum bit depth for greyscale images instead of defaulting to 8 bits. --- src/zopflipng/zopflipng_lib.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zopflipng/zopflipng_lib.cc b/src/zopflipng/zopflipng_lib.cc index 89312eca..72e5cf69 100644 --- a/src/zopflipng/zopflipng_lib.cc +++ b/src/zopflipng/zopflipng_lib.cc @@ -240,7 +240,7 @@ unsigned TryOptimize( if (w * h <= 16 && profile.key) profile.alpha = 1; state.encoder.auto_convert = 0; state.info_png.color.colortype = (profile.alpha ? (profile.colored ? LCT_RGBA : LCT_GREY_ALPHA) : (profile.colored ? LCT_RGB : LCT_GREY)); - state.info_png.color.bitdepth = 8; + state.info_png.color.bitdepth = (profile.alpha || profile.colored) ? 8 : profile.bits; state.info_png.color.key_defined = (profile.key && !profile.alpha); if (state.info_png.color.key_defined) { state.info_png.color.key_defined = 1;