diff options
Diffstat (limited to 'lib/Pb/Pattern/__init__.py')
| -rwxr-xr-x | lib/Pb/Pattern/__init__.py | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/Pb/Pattern/__init__.py b/lib/Pb/Pattern/__init__.py new file mode 100755 index 0000000..4e4c5a8 --- /dev/null +++ b/lib/Pb/Pattern/__init__.py @@ -0,0 +1,84 @@ +import os +import sys +import random +import re +import urllib +from Config import * +from Pb import Pb + +import simplejson as json +from PIL import Image +import uuid + +_fuse_mode="Pin_Light" + +class PbPattern(Pb): + example_params = { + # "pattern_url" : "http://asdf.us/impattern/patterns/1.png", + "pattern_data" : '{"matrix":[["0","0","0","0","0","1","0","0","0","0"],["0","0","0","0","1","1","1","0","0","0"],["0","0","1","1","1","0","1","0","0","0"],["0","1","1","0","0","0","0","0","0","0"],["0","1","0","0","1","0","0","0","0","0"],["0","1","0","0","1","0","0","0","1","0"],["0","1","0","0","1","1","0","0","1","0"],["0","1","0","0","0","1","1","1","1","0"],["0","1","1","1","1","0","0","0","0","0"],["0","0","0","0","1","0","0","0","0","0"]],"width":"10","height":"10"}', + # "username" : "garfield", + "image_url" : "http://i.asdf.us/im/be/PinkHijab_1425078647_reye.gif", + } + def __init__(self, **kwargs): + super(PbPattern,self).__init__(); + _definitions = { + 'image_url': { 'type':'img_url' }, + 'pattern_url': { 'type':'img_url' }, + 'pattern_data': { 'type':'raw' }, + 'username': { 'type':'string' }, + } + self.params.definitions_import(_definitions, kwargs, classname=self.__class__.__name__); + self.filename, self.filepath = self._filename_filepath_create(url=self.params.image_url['url'], extension=self.params.image_url['mimetype']) + _pattern_filename, self._pattern_filepath = self._filename_filepath_create(namepart="pattern") + + if self.params.pattern_data: self._from_pattern_data() + elif not self.params.pattern_url: + self.err_warn("pattern must be supplied as json array or as a png url") + + def _from_pattern_data(self): + def boolToColor(boolean): + if boolean: + return (0,0,0,255); + else: + return (255,255,255,255) + specs = json.loads(str(self.params.pattern_data)); + if int(specs['width']) > 100 or int(specs['height']) > 100: + raise ValueError + sys.stderr.write("height and width need to be less than 100 px") + img = Image.new('RGBA', (int(specs['width']), int(specs['height']))); + pixels = img.load(); + for i in range(0, len(specs['matrix'])): + for j in range(0, len(specs['matrix'][i])): + pixels[j,i] = boolToColor(int(specs['matrix'][i][j])); + + img.save(self._pattern_filepath, "PNG") + + #first step + def _make_canvas(self): + _width, _height = self.dimensions(self.params.image_url['path']) # same here + cmd = [BIN_CONVERT, "-size", _width + "x" + _height, "canvas:transparent", self.filepath] + self._call_cmd(cmd) + + #second step use the Canvas as a background + def _make_mask(self): + #tile the pattern pattern on the canvas + cmd = [BIN_COMPOSITE,"-tile", self._pattern_filepath, self.filepath, self.filepath]; + self._call_cmd(cmd) + #fuse the tiled file to create a mask + #convert thebg.gif -compose Dst_In null: thefile.gif -matte -layers composite new.gif + cmd = [BIN_CONVERT, self.filepath, "-compose", "Dst_In", "null:", + self.params.image_url['path'], "-matte", "-layers", "composite", self.filepath] + self._call_cmd(cmd) + + #third step + def _fuse_mask(self, fuse_mode=_fuse_mode): + cmd = [BIN_CONVERT, "-dispose", "2", self.filepath, "null:", + self.params.image_url['path'], "-matte", "-compose", fuse_mode, "-layers", "composite", + self.filepath] + self._call_cmd(cmd) + + def create(self): + self._make_canvas(); + self._make_mask() + self._fuse_mask(); + |
