From 3a0f3349706bff5fe275396307b834d987962f43 Mon Sep 17 00:00:00 2001 From: Nicolas F Date: Fri, 10 Oct 2014 20:54:47 +0200 Subject: [PATCH] optimizeimages: Add jpegoptim interface Only options that appear to be interesting for us have been exposed, namely -m and -S. --- overviewer_core/optimizeimages.py | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/overviewer_core/optimizeimages.py b/overviewer_core/optimizeimages.py index 0ccd4a2..af56039 100644 --- a/overviewer_core/optimizeimages.py +++ b/overviewer_core/optimizeimages.py @@ -120,6 +120,42 @@ class optipng(Optimizer, PNGOptimizer): def is_crusher(self): return True + +class jpegoptim(Optimizer, JPEGOptimizer): + binaryname = "jpegoptim" + crusher = True + quality = None + target_size = None + + def __init__(self, quality = None, target_size = None): + if quality is not None: + if quality < 0 or quality > 100: + raise Exception("Invalid target quality %d for jpegoptim" % quality) + self.quality = quality + + if target_size is not None: + self.target_size = target_size + + def optimize(self, img): + args = [self.binaryname, "-q", "-p"] + if self.quality is not None: + args.append("-m" + str(self.quality)) + + if self.target_size is not None: + args.append("-S" + str(self.target_size)) + + args.append(img) + + Optimizer.fire_and_forget(self, args) + + def is_crusher(self): + # Technically, optimisation is lossless if input image quality + # is below target quality, but this is irrelevant in this case + if (self.quality is not None) or (self.target_size is not None): + return False + else: + return True + def optimize_image(imgpath, imgformat, optimizers):