summaryrefslogtreecommitdiff
path: root/makeDither.py
diff options
context:
space:
mode:
Diffstat (limited to 'makeDither.py')
-rw-r--r--makeDither.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/makeDither.py b/makeDither.py
new file mode 100644
index 0000000..d0eb16c
--- /dev/null
+++ b/makeDither.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+
+import cgi
+import pbutils
+from os import getpid, path
+from subprocess import call
+
+MAIN_DIRECTORY = ""
+BIN_CONVERT = "convert"
+BIN_IDENTIFY = "identify"
+BIN_COMPOSITE = "composite"
+
+class Dither:
+ def __init__(self,
+ input_file_path,
+ dither_file="1.png",
+ username="",
+ ):
+
+ self.nametag = "imDither";
+ if username:
+ self.username = username
+ else:
+ self.username = "";
+
+ self.pid = str(getpid())
+ self.dither_file = dither_file;
+ self.original_file = input_file_path;
+ self.MAX_NAME_LENGTH = 10;
+
+ self.image_format = self.original_file.split(".")[-1]
+ try:
+ self.dimensions = pbutils.image_dimensions_and_test(self.original_file);
+ except Exception as E:
+ pbutils.error("Corrupt image")
+ self.canvas_file = self.pid+"blank_canvas.png";
+ self.makeCanvas();
+ self.mask_file = self.pid+"mask_file"+"."+self.image_format;
+ self.makeMask();
+ self.result_file = self.makeResultFilename();
+ self.fuseMask();
+
+ def makeResultFilename(self):
+ file_base, extension = path.splitext(self.original_file)
+ if len(file_base) > self.MAX_NAME_LENGTH:
+ file_base = file_base[0:self.MAX_NAME_LENGTH]
+ return "%s_%s_%s%s%s" % (file_base, self.username, self.nametag, pbutils.now(), extension)
+
+ #first step
+ def makeCanvas(self):
+ call([BIN_CONVERT,"-size",self.dimensions[0]+"x"+self.dimensions[1],"canvas:transparent", self.canvas_file])
+
+ #second step use the Canvas as a background
+ def makeMask(self):
+ #tile the dither pattern on the canvas
+ call([BIN_COMPOSITE,"-tile", self.dither_file, self.canvas_file, self.mask_file])
+
+ #fuse the tiled file to create a mask
+ #convert thebg.gif -compose Dst_In null: thefile.gif -matte -layers composite new.gif
+ call([BIN_CONVERT, self.mask_file, "-compose", "Dst_In", "null:", self.original_file, "-matte", "-layers", "composite", self.mask_file])
+
+ #cleanup
+ call(["rm", self.canvas_file])
+
+ #third step
+ def fuseMask(self, fuse_mode="Pin_Light"):
+ call([BIN_CONVERT, self.mask_file, "null:", self.original_file, "-matte", "-compose", fuse_mode, "-layers", "composite", self.result_file])
+ call(["rm", self.mask_file])
+
+
+if __name__ == "__main__":
+ dither = Dither("./test.gif");