From 107bf3253c12b3a9f13dda26e13cf61b805faa55 Mon Sep 17 00:00:00 2001 From: Pepper Date: Thu, 30 Apr 2015 18:32:38 -0400 Subject: master --- pb/gradient.py | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100755 pb/gradient.py (limited to 'pb/gradient.py') diff --git a/pb/gradient.py b/pb/gradient.py new file mode 100755 index 0000000..724b37c --- /dev/null +++ b/pb/gradient.py @@ -0,0 +1,216 @@ +#!/usr/bin/python2.7 +import re +import time +from subprocess import call +import simplejson as json +import sys +import os +import sha +import pb.lib.utils as utils +from pb.config import * + + +PARAM_LIST = [ + "width", "height", + "color1", "color2", + "stripes", + "stripenumber", "stripeintensity", + "blurriness", + "contrast", + "brightness", "saturation", "hue", + "halftone", + "bevel", "percentbeveled", + "rotate", "flip", "flop", "tilt", + "filetype", + "gradienttype", + "username", +] +DEFAULT_FORMAT = "png" +DEFAULT_COLORS = { + "color1" : "white", + "color2" : "black", +}; + +DEFAULT_WIDTH = "200" +DEFAULT_HEIGHT = "200" +DEFAULT_BEVEL_PERCENT = "12"; + +HALFTONEVALUES = { + "checkeredfade": "h6x6a", + "etchedtransition": "o8x8", + "bendaydots": "h16x16o", + "smallerdots1": "h8x8o", + "smallerdots2": "c7x7w", + "flatstripes": "o2x2", + } + + +class Gradient: + def __init__(self, **kwargs): + self.tag = "imGradient" + self.directory = WORKING_DIR + self.commands = [] + self.filename = "" + self.filepath = "" + self.now = utils.now() + + params = {} + for key in PARAM_LIST: + if key in kwargs: + if key in ['color1', 'color2']: + params[key] = utils.is_color(kwargs[key]) + else: + params[key] = utils.sanitize(kwargs[key]) + + if key in ['rotate','tilt','blurriness','stripenumber','stripeintensity']: + params[key] = params[key] if utils.is_number(params[key]) else "" + elif key in ['brightness', 'contrast', 'hue']: + if not utils.is_number(params[key]) or params[key] == "100": params[key] = "" + else: + params[key] = "" + params['width'] = params['width'] if utils.is_number(params['width']) else DEFAULT_WIDTH + params['height'] = params['height'] if utils.is_number(params['height']) else DEFAULT_HEIGHT + params["color1"] = params["color1"] or DEFAULT_COLORS["color1"]; + params["color2"] = params["color2"] or DEFAULT_COLORS["color2"]; + self.params = params + if not self.params['percentbeveled']: self.params['percentbeveled'] = DEFAULT_BEVEL_PERCENT + self._bevelvalues = [ + "flatout", "flatinner", "evenlyframed", "biginner", + "bigouter", "dramaticflatout", "dramaticflatinner", + ] + + def newfilename(self): + return "{}{}-{}_{}_{}.{}".format( + self.tag, + self.params['color1'].replace('#','').replace('(','-').replace(')','-'), + self.params['color2'].replace('#','').replace('(','-').replace(')','-'), + self.now, + self.params['username'], + self.params['filetype'] or DEFAULT_FORMAT, + ) + + def _call_cmd(self, cmd): + try: + utils.call_cmd(cmd) + self.commands.append(" ".join(cmd)); + except Exception: + raise Exception("Unable to call cmd {}".format(str(cmd))) + + + def _build_cmd(self): + cmd = [BIN_CONVERT] + cmd.extend([ + '-size', + "{}x{}".format(self.params["width"],self.params["height"]) + ]) + + if self.params['rotate']: cmd.extend(["-rotate", self.params["rotate"]]) + if self.params['tilt']: cmd.extend(["-distort","SRT",self.params['tilt']]) + if self.params['flip'] == "true": cmd.append("-flip") + if self.params['flop'] == "true": cmd.append("-flop") + if self.params['contrast']: cmd.extend(["-contrast-stretch", self.params['contrast']]) + gradients = { + "canvas" : ["canvas:{}".format(self.params['color1'])], + "radial" : [ + "radial-gradient:{}-{}".format( self.params['color1'], self.params['color2']) + ], + "colorspace" : [ + "-colorspace", + "Gray", + "plasma:{}-{}".format(self.params['color1'], self.params['color2']) + ], + "mirrored" : [ + "plasma:{}-{}".format(self.params['color1'], self.params['color2']), + "\(","+clone","-flop","\)", + "append" + ], + "plasmawash" : [ + "plasma:{}-{}".format(self.params['color1'], self.params['color2']), + "-set","colorspace","HSB" + ], + "gradientwash" : [ + "gradient:{}-{}".format(self.params['color1'], self.params['color2']), + "-set","colorspace","HSB" + ], + "noise" : ["xc:","+noise","Random","-virtual-pixel","tile"] + } + if self.params["gradienttype"] in gradients: + cmd.extend(gradients[self.params['gradienttype']]) + else: + cmd.append("gradient:{}-{}".format(self.params['color1'], self.params['color2'])) + + if self.params['blurriness']: + cmd.extend(["-blur","0x{}".format(self.params["blurriness"]),"-auto-level"]) + + if self.params['stripes'] == "true" and len(self.params['stripenumber']): + cmd.extend(["-function","Sinusoid"]) + if self.params['stripeintensity']: + cmd.append("{},{}".format(self.params['stripenumber'],self.params["stripeintensity"])) + else: + cmd.append(self.params['stripenumber']) + if self.params["halftone"] in HALFTONEVALUES: + cmd.extend([ + "-ordered-dither", + HALFTONEVALUES[self.params["halftone"]] + ]) + cmd += [ + '-modulate', + "{},{},{}".format( + self.params['brightness'] or "100", + self.params['saturation'] or "100", + self.params['hue'] or "100") + ] + cmd.append(os.path.join(self.directory,self.filename)); + self._call_cmd(cmd) + + def _get_bevelvalue(self): + w, h = map(int, (self.params['width'], self.params['height'])) + if h >= w: + bevpercentval = str(int(self.params['percentbeveled'])*0.005*int(h)) + else: + bevpercentval = str(int(self.params['percentbeveled'])*0.005*int(w)) + return { + "flatout": ["-s",bevpercentval,"-m","outer"], + "flatinner": ["-s",bevpercentval,"-m","inner"], + "evenlyframed": ["-s ",bevpercentval,"-m", "split"], + "biginner": ["-s",bevpercentval,"-m","outer","-c","50","-b","red","-a","25"], + "bigouter": ["-s",bevpercentval,"-m","split","-c","50","-b","red","-a","25"], + "dramaticflatout": ["-s",bevpercentval,"-m","outer","-a","25","-b","blue"], + "dramaticflatinner": ["-s",bevpercentval,"-m","outer","-a","25","-b","blue"], + }[self.params['bevel']] + + def _make_bevel(self): + cmd = [BEVELBORDER] + cmd += self._get_bevelvalue() + cmd += [ os.path.join(self.directory,self.filename), os.path.join(self.directory, self.filename) ] + self._call_cmd(cmd) + + def create(self): + self.filename = self.newfilename() + self.filepath = os.path.join(self.directory, self.filename) + self._build_cmd() + if self.params['bevel'] in self._bevelvalues: + self._make_bevel() + +if __name__ == "__main__": + TEST_FORM = { + "width" : "200", + "color1" : "#ffdead", + "color2" : "blue", + "stripes" : "true", + "stripenumber" : "20", + "gradienttype" : "radial", + "stripeintensity" : "20", + "halftone" : "checkeredfade", + "percentbeveled" : "30", + "flip" : "true", + "bevel" : "flatinner", + "rotate" : "20", + "height" : "200", + "filetype" : "jpg", + "username" : "whatever" + } + g = Gradient(**TEST_FORM); + g.create(); + print " ".join(g.commands) + print g.filename -- cgit v1.2.3-70-g09d2