diff options
| -rw-r--r-- | Config/__init__.py | 1 | ||||
| -rwxr-xr-x | Pb/Generate/__init__.py | 189 | ||||
| -rwxr-xr-x | Pb/Gradient/__init__.py | 2 |
3 files changed, 69 insertions, 123 deletions
diff --git a/Config/__init__.py b/Config/__init__.py index e834748..70e5887 100644 --- a/Config/__init__.py +++ b/Config/__init__.py @@ -13,6 +13,7 @@ DEFAULT_FINALFORMAT = "png"; DEFAULT_HEIGHT = 400 DEFAULT_WIDTH = 600 +OUTPUT_IMAGE_TYPES = ["png", "jpg", "gif" ] #mounted on tmpfs WORKING_DIR = "/var/www/cache" diff --git a/Pb/Generate/__init__.py b/Pb/Generate/__init__.py index 3aa9c6d..76082aa 100755 --- a/Pb/Generate/__init__.py +++ b/Pb/Generate/__init__.py @@ -3,6 +3,7 @@ import sys import os from Config import * from Pb import Pb +_default_tag = "im" _gravity_params = ["NorthWest","North","NorthEast","West","Center","East","SouthWest","South","SouthEast"] _gravity_default = "Center" @@ -15,6 +16,7 @@ _dispose_default = "None" class Im(Pb): example_params = { +#{{{ example params 'nearest': 'true', # 'height': None, 'compose': 'Soft_Light', @@ -41,27 +43,24 @@ class Im(Pb): 'flip': 'false', 'callback': 'jsonp1430442384162', 'fuzz': '5' +#}}} } def __init__(self, #URLS url=None, background=None, - #BOOLS coalesce=None, - dispose="None", nearest=None, merge_early=None, flip=None, flop=None, tile=None, transparent=None, - #COLORS - black=None, - white=None, - subtract=None, - + black="black", + white="white", + subtract="white", #INTS fuzz=None, width=None, @@ -71,145 +70,91 @@ class Im(Pb): saturation=None, rotate=None, hue=None, - #ENUMS - compose=None, + compose="Atop", gravity=_gravity_default, format=DEFAULT_FINALFORMAT, - + dispose="None", #STRINGS username=None, callback=None, ): -#{{{ required_keys - #IMAGES - "url", - "background", - - #BOOLS - "coalesce", - "dispose", - "nearest", - "merge_early", - "flip", - "flop", - "tile", - "transparent", + #IMAGES + self.params.set_val("url", url, value_type="image_url") + self.params.set_val("background", background, value_type="image_url") - #COLORS - "black", - "white", - "subtract", - - #INTS - "fuzz", - "width", - "height", - "brightness", - "contrast", - "saturation", - "rotate", - "hue", - - #ENUMS - "compose", - "gravity", - "format", + #BOOLS + self.params.set_val("coalesce", coalesce, value_type="bool") + self.params.set_val("nearest", nearest, value_type="bool") + self.params.set_val("merge_early", merge_early, value_type="bool") + self.params.set_val("flip", flip, value_type="bool") + self.params.set_val("flop", flop, value_type="bool") + self.params.set_val("tile", tile, value_type="bool") + self.params.set_val("transparent", transparent, value_type="bool") - #STRINGS - "username", - "callback", -#}}} - ] - for k in self._required_keys: - if k in kwargs: - if k in [ 'url', 'background' ] and kwargs[k] != "" and kwargs[k] != None: - self.params[k] = { - 'url' : kwargs[k], - 'filename' : self._make_tempname(k), - 'path' : os.path.join(WORKING_DIR, self._make_tempname(k)) , - } - try: - self.download(self.params[k]['url'], self.params[k]['path']) - self.files_created.append(self.params[k]['path']) - self.params[k]['mimetype'] = self.get_mimetype(self.params[k]['path']) - except Exception as e: - sys.stderr.write(str(e)) - raise Exception ("BAD PARAMS"); - elif k in [ 'black', 'white', 'subtract' ]: - try: - self.params[k] = self.is_color(kwargs[k]) - except Exception: - raise Exception("Unable to process color for:\n{}".format(k)) - elif k in [ - "coalesce", "dispose", "nearest", "merge_early", - "flip", "flop", "tile", "transparent", - ]: - self.params[k] = self.bool_correct(self.sanitize(kwargs[k])) - elif k == 'gravity' and self._test_enum(kwargs[k], GRAVITY_PARAMS): - self.params[k] = kwargs[k] - elif k == 'format' and self._test_enum(kwargs[k], FORMAT_PARAMS): - self.params[k] = kwargs[k] - elif k == 'compose' and self._test_enum(kwargs[k], COMPOSE_PARAMS): - self.params[k] = kwargs[k] - elif k == 'dispose' and self._test_enum(kwargs[k], DISPOSE_PARAMS): - self.params[k] = kwargs[k] - elif k in [ "fuzz", "width", "height", "brightness", "contrast", "saturation", "rotate", "hue" ]: - if kwargs[k] == '': - self.params[k] = None - else: - try: - self.params[k] = str(int(kwargs[k])) - except Exception as e: - raise Exception("Problem with param {}:\n".format(k) + str(e)) - else: - + #COLORS + self.params.set_val("black", black, value_type="color") + self.params.set_val("white", white, value_type="color") + self.params.set_val("subtract", subtract, value_type="color") - self.params[k] = self.sanitize(kwargs[k]) + #INTS + self.params.set_val("fuzz", fuzz, value_type="int") + self.params.set_val("width", width, value_type="int") + self.params.set_val("height", height, value_type="int") + self.params.set_val("brightness", brightness, value_type="int") + self.params.set_val("contrast", contrast, value_type="int") + self.params.set_val("saturation", saturation, value_type="int") + self.params.set_val("rotate", rotate, value_type="int") + self.params.set_val("hue", hue, value_type="int") + + #ENUMS + self.params.set_val("compose", compose, value_type="enum", enum_values=_compose_params) + self.params.set_val("gravity", gravity, value_type="enum", enum_values=_gravity_params) + self.params.set_val("dispose", dispose, value_type="enum", enum_values=_dispose_params) + self.params.set_val("format", format, value_type="enum", enum_values=OUTPUT_IMAGE_TYPES) - if self.params.get('background'): - self.tag = self.params.get('compose') - else: - self.tag = self.params.get('transparent', DEFAULT_TAG) + #STRINGS + self.params.set_val("username", username, value_type="string") + self.params.set_val("callback", callback, value_type="string") - self.basename = self._get_filename(); - self.filename = "{}.{}".format(self.basename, self.params.get('format', DEFAULT_FINALFORMAT)) - self.filepath = os.path.join(WORKING_DIR, self.filename) + self.tag = _default_tag + if self.params.background: self.tag = self.params.compose + if self.params.transparent: self.tag = self.params.transparent def _composite (self): cmd = [ - BIN_CONVERT, self.params['background']['path'], + BIN_CONVERT, self.params.background['path'], "null:", self.filepath, "-matte", - "-dispose", self.params.get('dispose', DISPOSE_DEFAULT), - "-gravity", self.params.get("gravity",GRAVITY_DEFAULT), - "-compose", self.params['compose'], "-layers", "composite", + "-dispose", self.params.dispose, + "-gravity", self.params.gravity, + "-compose", self.params.compose, "-layers", "composite", self.filepath ] self._call_cmd(cmd); def _convert(self): - cmd = [BIN_CONVERT, self.params['url']['path'] ] - if self.params.get('rotate'): cmd += ["-rotate", self.params['rotate'] ] - if self.params.get('flip'): cmd += ["-flip"] - if self.params.get('flop'): cmd += ["-flop"] - if self.params.get('transparent'): - if self.params.get('fuzz'): - cmd += ["-fuzz", "{}%".format(self.params['fuzz']) ] - cmd += [ "-transparent", self.params.get('subtract', "white") ] - if self.params.get('width') or self.params.get('height'): - if self.params.get('nearest') and self.params.get('format') == "gif": + cmd = [BIN_CONVERT, self.params.url['path'] ] + if self.params.rotate: cmd += ["-rotate", self.params.rotate ] + if self.params.flip: cmd += ["-flip"] + if self.params.flop: cmd += ["-flop"] + if self.params.transparent: + if self.params.fuzz: + cmd += ["-fuzz", "{}%".format(self.params.fuzz) ] + cmd += [ "-transparent", self.params.subtract ] + if self.params.width or self.params.height: + if self.params.nearest and self.params.format == "gif": cmd += [ "-coalesce","+map","-interpolate","Nearest","-interpolative-resize" ] else: cmd.append("-resize") - cmd += [ "{}x{}".format(self.params.get('width',"") or "", self.params.get('height',"") or "") ] - if self.params.get('black') != "black" or self.params.get('white') != 'white': - cmd += [ "+level-colors" , "{},{}".format(self.params.get('black','black'), self.params.get('white', 'white')) ] - if self.params.get('contrast'): cmd += [ '-contrast-stretch', self.params['contrast'] ] - if any( e in self.params.keys() for e in ['brightness', 'saturation', 'hue' ]): + cmd += [ "{}x{}".format(self.params.width or "", self.params.height or "") ] + if self.params.black != "black" or self.params.white != 'white': + cmd += [ "+level-colors" , "{},{}".format(self.params.black, self.params.white) ] + if self.params.contrast: cmd += [ '-contrast-stretch', self.params.contrast ] + if self.params.brightness or self.params.saturation or self.params.hue: cmd += [ "-modulate", "{},{},{}".format( - (self.params.get('brightness', 100) or 100), - (self.params.get('contrast', 100) or 100), - (self.params.get('hue', 100) or 100) + (self.params.brightness or 100), + (self.params.contrast or 100), + (self.params.hue or 100) )] cmd.append("-coalesce"); #why? #FIXME cmd += [ self.filepath ]; @@ -217,6 +162,6 @@ class Im(Pb): def create(self): self._convert() - if self.params.get('background'): + if self.params.background: self._composite() self._cleanup(); diff --git a/Pb/Gradient/__init__.py b/Pb/Gradient/__init__.py index e0a08b0..2ef8b93 100755 --- a/Pb/Gradient/__init__.py +++ b/Pb/Gradient/__init__.py @@ -89,7 +89,7 @@ class PbGradient(Pb): self.params.set_val("flip", flip, value_type="bool")
self.params.set_val("flop", flop, value_type="bool")
- self.params.set_val("filetype", filetype, value_type="enum", enum_values=["gif", "png", "jpg"])
+ self.params.set_val("filetype", filetype, value_type="enum", enum_values=OUTPUT_IMAGE_TYPES)
self.params.set_val("gradienttype", gradienttype, value_type="enum", enum_values=[
"default", "canvas", "radial", "colorspace",
"mirrored", "plasmawash", "gradientwash", "noise"
|
