summaryrefslogtreecommitdiff
path: root/makePattern.py
blob: d9bbf545d47dfb756a113ef980b788acb192159e (plain)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/python2.7

import sys
import cgi
from os import getpid, path
from subprocess import call, Popen, PIPE
import time

MAIN_DIRECTORY = ""
BIN_CONVERT = "convert"
BIN_IDENTIFY = "identify"
BIN_COMPOSITE = "composite"
ACCEPTABLE_FILE_TYPES = [".png", ".jpg", ".gif", ".jpeg"]

def usage():
  sys.stderr.write("$>makePattern.py [ input_file ] [ pattern_file ] [ username ]");

def now():
    return str(int(time.time()))

def image_dimensions_and_test(filename):
    ident = Popen([BIN_IDENTIFY, filename], stdout=PIPE).communicate()[0]
    partz = ident.split(" ")
    filetype = "."+partz[1]
    size = partz[6]
    if filetype.lower() not in ACCEPTABLE_FILE_TYPES:
      error("file was not an image")
    return partz[2].split("x")

def error(s):
    " returns an error and exits the program "
    print("ERROR: "+s)
    exit(1)

def hexdir(filename):
    " creates a two-letter directory name "
    return sha1(filename.encode()).hexdigest()[:2]
#repage command convert original.png -resize 425x92 -repage 425x92+0+0 new.png

class Pattern:
  def __init__(self):
    self.nametag = "imPattern";
    self.pid = str(getpid())
    self.pattern_file = "";
    self.original_file = "";
    self.username = "";

  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, 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 pattern pattern on the canvas
    call([BIN_COMPOSITE,"-tile", self.pattern_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])

  def main(self, input_file_path, pattern_file, username=""):
    self.pattern_file = pattern_file;
    self.original_file = input_file_path;
    self.username = username;
    self.MAX_NAME_LENGTH = 10;

    self.image_format = self.original_file.split(".")[-1]
    self.dimensions = ""
    try:
      self.dimensions = image_dimensions_and_test(self.original_file);
    except Exception as e:
      sys.stderr.write(str(e));
      error("Unable to determine dimensions")
    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();

if __name__ == "__main__":
  p = Pattern();
  if len(sys.argv) < 2 or len(sys.argv) > 3:
    usage();
    sys.exit(0);
  input_file_path = sys.argv[1] 
  pattern_file = sys.argv[2] 
  username = "";
#  username = sys.argv[3] 
  print input_file_path;
  print pattern_file;
  print username;
  p.main(input_file_path, pattern_file, username);