diff options
Diffstat (limited to 'Pb/Grid/__init__.py')
| -rwxr-xr-x | Pb/Grid/__init__.py | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/Pb/Grid/__init__.py b/Pb/Grid/__init__.py new file mode 100755 index 0000000..09718bd --- /dev/null +++ b/Pb/Grid/__init__.py @@ -0,0 +1,193 @@ +#!/usr/bin/python2.7 +import sys +import re +import os +import simplejson as json +import random +from Config import DEFAULT_FINALFORMAT, DEFAULT_HEIGHT, DEFAULT_WIDTH, WORKING_DIR +from Config import THREEDROTATE, GRID +import tempfile +from Pb import Pb + +_default_line_color = "silver" + +class Imgrid(Pb): + def __init__(self, + width=None, + height=None, + linethickness=None, + opacity=None, + linecolor=None, + spacing=None, + vlines=None, + hlines=None, + shadow=None, + bgimage=None, + bgcolor=None, + imageinstead=None, + planebgcolor=None, + planebgimage=None, + swing=None, + tilt=None, + roll=None, + zoom=None, + skycolor=None, + transition=None, + trim=None, + finalformat=DEFAULT_FINALFORMAT, + username=None + ): + super(Imgrid,self).__init__(); + + _frame = inspect.currentframe(); + _args_vals = inspect.getargvalues(_frame); + for arg in _args_vals.args: + if arg == "self": + continue + argval = _args_vals.locals.get(arg) + try: + if arg in [ 'skycolor', 'bgcolor', 'planebgcolor','linecolor' ]: + self.params.set_val(arg, argval, value_type="color") + elif arg == 'opacity': + self.params.set_val(arg, argval, value_type="float") + elif arg == 'zoom': + self.params.set_val(arg, argval, value_type="int") + elif arg in [ 'bgimage', 'planebgimage', 'imageinstead' ]: + self.params.set_val(arg, argval, value_type="img_url") + if self.params.get_mimetype(arg) == 'gif': + self.params.gif_convert_to_still(arg) + self.files_created.append(self.params.get_filepath(arg)) + elif arg in ['finalformat', 'username' ] : + self.params.set_val(arg, argval, value_type="string") + else: + self.params.set_val(arg, argval, value_type="bool") + + except Exception as e: + self.log_err(str(e)) + + #FIXME these need to be bumped up to the parent class + self.basename = self._get_filename(); + self.filename = "{}.{}".format(self.basename, self.params.finalformat) + #final filepath is stored in self.filepath + self.filepath = os.path.join(WORKING_DIR, self.filename) + + + + #makes a canvas file...step 1 (if not bgimage) + def _make_canvas(self): + dimensions = "{}x{}".format( + self.params.width or DEFAULT_WIDTH, + self.params.height or DEFAULT_HEIGHT + ) + if self.params.bgimage: + return + bgcolor = "xc:{}".format(self.params.bgcolor or 'transparent') + cmd = [ BIN_CONVERT, "-size", dimensions, bgcolor, self.filepath ] + self._call_cmd(cmd) + + #2nd step-- run grid + def _grid_command(self): + cmd = [GRID] + if self.params.spacing: + if self.params.vlines: + width = 2 * int(self.params.width or DEFAULT_WIDTH) + cmd += ["-s","{},{}".format(self.params.spacing,width)] + elif self.params.hlines: + height = 2 * int(self.params.height or DEFAULT_HEIGHT) + cmd += ["-s", "{},{}".format(height,self.params.spacing)] + else: + cmd += ["-s",self.params.spacing] + cmd += [ "-c", self.params.linecolor or _default_line_color] + if self.params.linethickness: cmd += ['-t',self.params.linethickness] + if self.params.opacity: cmd += ['-o',self.params.opacity] + cmd += [ self.filepath, self.filepath ] + self._call_cmd(cmd) + + def _shadow_cmd(self): + #convert 1.png \( +clone -background black -shadow 110x1+9+9 \) +swap -background none -layers merge +repage 2.png + cmd = [ + BIN_CONVERT, + self.filepath, + "(","+clone","-background","black","-shadow","100x2+20+10",")", + "+swap","-background","none","-layers","merge","+repage" , + self.filepath + ] + self._call_cmd(cmd) + + + def _threed_rotate_cmd (self): + #3rd step--run 3Drotate + cmd = [THREEDROTATE] + if self.params.swing: cmd += ["pan={}".format(self.params.swing)] + if self.params.tilt: cmd += ["tilt={}".format(self.params.tilt)] + if self.params.roll: cmd += ["roll={}".format(self.params.roll)] + if self.params.zoom: + cmd += ["zoom={}".format(self.params.zoom)] + if cmd == [THREEDROTATE]: #if nothing has been added + return + if self.params.planebgcolor and not self.params.planebgimage: + cmd += ["bgcolor={}".format(self.params.planebgcolor)] + else: + cmd += ["bgcolor=none"] + cmd += ["skycolor={}".format(self.params.skycolor or 'none')] + if self.params.transition: cmd += ["vp={}".format(self.params.transition)] + cmd += [ self.filepath, self.filepath ] + self._call_cmd(cmd) + + + def _trim_cmd (self): + cmd = [BIN_CONVERT, self.filepath, "-trim", "+repage", self.filepath] + self._call_cmd(cmd) + + def _prepare_gridimage(self, image): + if image['mimetype'] != 'png': + cmd = [BIN_CONVERT, image['path'], self.filepath] + else: + cmd = ['cp', image['path'], self.filepath] + self._call_cmd(cmd) + + + def _overlay_planebgimage(self): + cmd = [ + BIN_COMPOSITE, + "-compose", "Dst_Over", "-gravity", "center", + self.params.planebgimage["path"], + self.filepath, + self.filepath + ] + self._call_cmd(cmd) + + def _cleanup(self): + if not len(self.files_created): + return + cmd = ["rm", "-f"] + self.files_created + self._call_cmd(cmd) + + def create(self): + if self.params.bgimage: + self._prepare_gridimage(self.params.bgimage) + self._grid_command() + elif self.params.imageinstead: + self._prepare_gridimage(self.params.imageinstead) + else: + self._make_canvas() + self._grid_command() + if self.params.shadow: self._shadow_cmd() + self._threed_rotate_cmd() + if self.params.planebgimage: self._overlay_planebgimage() + if self.params.trim: self._trim_cmd() + self._cleanup() + +if __name__ == "__main__": + g = Imgrid(**{ + 'bgimage' : 'http://i.asdf.us/im/1a/imBreak_1424909483_xx_abridged___.gif', + 'planebgimage' : 'http://i.imgur.com/FICZtph.png', + 'tilt' : '30', + 'spacing' : '30', + 'hlines' : 'true', + 'roll' : '30', + 'shadow' : 'true', + 'trim' : 'true' + }) + g.create() + print g.commands |
