1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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");
|