#!/usr/bin/python2.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" _compose_params = [ "Over", "ATop", "Dst_Over", "Dst_In", "Dst_Out", "Multiply", "Screen", "Divide", "Plus", "Difference", "Exclusion", "Lighten", "Darken", "Overlay", "Hard_Light", "Soft_Light", "Linear_Dodge", "Linear_Burn", "Color_Dodge", "Color_Burn" ] _dispose_params = ["None","Previous","Background"] _dispose_default = "None" class PbGenerate(Pb): example_params = { #{{{ example params 'nearest': 'true', # 'height': None, 'compose': 'Soft_Light', 'coalesce': 'true', 'dispose': 'None', 'gravity': 'Center', 'width': '200', 'black': 'black', 'tile': 'true', 'white': 'white', 'contrast': '100', 'hue': '90', 'saturation': '100', 'merge_early': 'true', 'format': 'gif', 'background': 'http://i.asdf.us/im/bc/new_1430440747.gif', 'subtract': '#EE7AE9', 'transparent': 'true', # 'rotate': None, 'name': 'yo', # 'brightness': None, 'url': 'http://asdf.us/im/new.gif', 'flop': 'true', 'flip': 'false', 'callback': 'jsonp1430442384162', 'fuzz': '5' #}}} } def __init__(self, #URLS url=None, background=None, #BOOLS coalesce=None, nearest=None, merge_early=None, flip=None, flop=None, tile=None, transparent=None, #COLORS black="black", white="white", subtract="white", #INTS fuzz=None, width=None, height=None, brightness=None, contrast=None, saturation=None, rotate=None, hue=None, #ENUMS compose="Atop", gravity=_gravity_default, format=DEFAULT_FINALFORMAT, dispose="None", #STRINGS name=None, callback=None, ): super(PbGenerate,self).__init__(); #IMAGES self.params.set_val("url", url, value_type="img_url") self.params.set_val("background", background, value_type="img_url") #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") #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") #INTS self.params.set_val("fuzz", fuzz or 0, value_type="int") self.params.set_val("width", width or 0, value_type="int") self.params.set_val("height", height or 0, value_type="int") self.params.set_val("brightness", brightness or 0, value_type="int") self.params.set_val("contrast", contrast or 0, value_type="int") self.params.set_val("saturation", saturation or 0, value_type="int") self.params.set_val("rotate", rotate or 0, value_type="int") self.params.set_val("hue", hue or 0, 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) #STRINGS self.params.set_val("username", name, value_type="string") self.params.set_val("callback", callback, value_type="string") self.tag = _default_tag if self.params.background: self.tag = self.params.compose if self.params.transparent: self.tag = self.params.transparent self.filename, self.filepath = self._filename_filepath_create(url=self.params.url['url'], extension=self.params.format) def _composite (self): cmd = [ BIN_CONVERT, self.params.background['path'], "null:", self.filepath, "-matte", "-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.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.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.brightness or 100), (self.params.contrast or 100), (self.params.hue or 100) )] cmd.append("-coalesce"); #why? #FIXME cmd += [ self.filepath ]; self._call_cmd(cmd); def create(self): self._convert() if self.params.background: self._composite() self._cleanup();