0

optimizeimages: support pngnq-s9

pngnq-s9 is essentially just a more recently dead version of pngnq,
however, due to not being able to specify multiple binary names in
the past, we've not supported it. Refactor the code to allow specifying
multiple binary names, and add pngnq-s9 to it.
This commit is contained in:
Nicolas F
2016-12-06 16:11:45 +01:00
parent c49990f18b
commit 6ea2758c31

View File

@@ -20,6 +20,7 @@ import logging
class Optimizer:
binaryname = ""
binarynames = []
def __init__(self):
raise NotImplementedError("I can't let you do that, Dave.")
@@ -37,8 +38,13 @@ class Optimizer:
result = filter(lambda x: os.path.exists(os.path.join(x, prog)), path)
return len(result) != 0
if (not exists_in_path(self.binaryname)) and (not exists_in_path(self.binaryname + ".exe")):
raise Exception("Optimization program '%s' was not found!" % self.binaryname)
binaries = self.binarynames + [x + ".exe" for x in self.binarynames]
for b in binaries:
if (exists_in_path(b)):
self.binaryname = b
break
else:
raise Exception("Optimization programs '%s' were not found!" % binaries)
def is_crusher(self):
"""Should return True if the optimization is lossless, i.e. none of the actual image data will be changed."""
@@ -63,7 +69,7 @@ class JPEGOptimizer:
raise NotImplementedError("I can't let you do that, Dave.")
class pngnq(NonAtomicOptimizer, PNGOptimizer):
binaryname = "pngnq"
binarynames = ["pngnq-s9", "pngnq"]
def __init__(self, sampling=3, dither="n"):
if sampling < 1 or sampling > 10:
@@ -93,7 +99,7 @@ class pngnq(NonAtomicOptimizer, PNGOptimizer):
return False
class pngcrush(NonAtomicOptimizer, PNGOptimizer):
binaryname = "pngcrush"
binarynames = ["pngcrush"]
# really can't be bothered to add some interface for all
# the pngcrush options, it sucks anyway
def __init__(self, brute=False):
@@ -110,7 +116,7 @@ class pngcrush(NonAtomicOptimizer, PNGOptimizer):
return True
class optipng(Optimizer, PNGOptimizer):
binaryname = "optipng"
binarynames = ["optipng"]
def __init__(self, olevel=2):
self.olevel = olevel
@@ -122,7 +128,7 @@ class optipng(Optimizer, PNGOptimizer):
return True
class advpng(Optimizer, PNGOptimizer):
binaryname = "advpng"
binarynames = ["advpng"]
crusher = True
def __init__(self, olevel=3):
@@ -135,7 +141,7 @@ class advpng(Optimizer, PNGOptimizer):
return True
class jpegoptim(Optimizer, JPEGOptimizer):
binaryname = "jpegoptim"
binarynames = ["jpegoptim"]
crusher = True
quality = None
target_size = None