#!/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");