From 79c8de9d7d53d3bcc1b9272cd85889105eb0dda6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 27 Apr 2019 15:32:50 +0100 Subject: [PATCH] wiki: Compress images better when using JPEG format Signed-off-by: Michael Tremer --- src/backend/wiki.py | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/backend/wiki.py b/src/backend/wiki.py index 8075d050..53fe6a97 100644 --- a/src/backend/wiki.py +++ b/src/backend/wiki.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import PIL +import PIL.ImageFilter import difflib import io import logging @@ -514,18 +515,39 @@ class File(misc.Object): return thumbnail - def _generate_thumbnail(self, size): + def _generate_thumbnail(self, size, **args): image = PIL.Image.open(io.BytesIO(self.blob)) + # Remove any alpha-channels + if image.format == "JPEG" and not image.mode == "RGB": + # Make a white background + background = PIL.Image.new("RGBA", image.size, (255,255,255)) + + # Flatten both images together + flattened_image = PIL.Image.alpha_composite(background, image) + + # Remove the alpha channel + image = flattened_image.convert("RGB") + # Resize the image to the desired resolution - image.thumbnail((size, size), PIL.Image.ANTIALIAS) + image.thumbnail((size, size), PIL.Image.LANCZOS) + + if image.format == "JPEG": + # Apply a gaussian blur to make compression easier + image = image.filter(PIL.ImageFilter.GaussianBlur(radius=0.05)) + + # Arguments to optimise the compression + args.update({ + "subsampling" : "4:2:0", + "quality" : 70, + }) with io.BytesIO() as f: # If writing out the image does not work with optimization, # we try to write it out without any optimization. try: - image.save(f, image.format, optimize=True, quality=98) + image.save(f, image.format, optimize=True, **args) except: - image.save(f, image.format, quality=98) + image.save(f, image.format, **args) return f.getvalue() -- 2.39.2