summaryrefslogtreecommitdiff
path: root/lib/Pb/Pattern/__init__.py
diff options
context:
space:
mode:
authoryo mama <pepper@scannerjammer.com>2015-09-21 14:20:13 -0700
committeryo mama <pepper@scannerjammer.com>2015-09-21 14:20:13 -0700
commitb29b0ec5f11dd66434cbdfba5287c4777d7f8ac9 (patch)
treef02f45661bdab855d8392e14ba6448546586bf37 /lib/Pb/Pattern/__init__.py
parent8f2230b7c866320e3839d6812b98b8370a7ec5d9 (diff)
new file structure
Diffstat (limited to 'lib/Pb/Pattern/__init__.py')
-rwxr-xr-xlib/Pb/Pattern/__init__.py84
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();
+