0
|
1 import os
|
|
2 import optparse
|
|
3
|
|
4 from PIL import Image
|
|
5 from PIL import ImageDraw
|
|
6 from image_transforms import tileify
|
|
7 from image_transforms import calculate_random_location
|
|
8 from image_transforms import filmify_image
|
|
9
|
|
10
|
|
11 def main():
|
|
12
|
|
13 # Parse options
|
|
14 parser = optparse.OptionParser()
|
|
15 parser.add_option(
|
|
16 "-i",
|
|
17 dest="inputImage",
|
|
18 help="Input Image",
|
|
19 metavar="FILE"
|
|
20 )
|
|
21 parser.add_option(
|
|
22 "-o",
|
|
23 dest="outputImage",
|
|
24 help="Output Image",
|
|
25 metavar="FILE"
|
|
26 )
|
|
27 parser.add_option(
|
|
28 "--command",
|
|
29 "-c",
|
|
30 dest="imageCommand",
|
|
31 help="Command",
|
|
32 metavar="string"
|
|
33 )
|
|
34 parser.add_option(
|
|
35 "-s",
|
|
36 dest='custom_string',
|
|
37 help='String to be placed as decription'
|
|
38 )
|
|
39 parser.add_option(
|
|
40 "-e",
|
|
41 dest='image_ext',
|
|
42 help='Image extension'
|
|
43 )
|
|
44 (opts, args) = parser.parse_args()
|
|
45
|
|
46 mandatory_options = ['inputImage', 'outputImage', 'image_ext']
|
|
47 for option in mandatory_options:
|
|
48 if not opts.__dict__[option]:
|
|
49 print "One or more options are missing\n"
|
|
50 parser.print_help()
|
|
51 exit(-1)
|
|
52
|
|
53 inputImage_fn = opts.inputImage
|
|
54 outputImage_fn =opts.outputImage
|
|
55 input_extension = opts.image_ext
|
|
56 if input_extension == "jpg":
|
|
57 input_extension="jpeg"
|
|
58
|
|
59 listOfValues = opts.imageCommand.split()
|
|
60
|
|
61 try:
|
|
62 imageIn = Image.open(inputImage_fn)
|
|
63 except IOError:
|
|
64 print "Cannot open file: " + inputImage_fn
|
|
65
|
|
66 if listOfValues[0] == "filmify":
|
|
67 """
|
|
68 Transform image into a signed movie frame.
|
|
69 Use:
|
|
70 python image_do.py -i input.jpg -o output.jpg -c "filmify" -s "hello world" -e "jpg"
|
|
71 """
|
|
72 print "command: " + listOfValues[0]
|
|
73 new_image_data = filmify_image(imageIn)
|
|
74 add_text_header(new_image_data, text=opts.custom_string)
|
|
75 new_image_data.save(outputImage_fn, input_extension);
|
|
76 # new_image_data.show();
|
|
77 elif listOfValues[0] == "tileify":
|
|
78 """
|
|
79 Breaks image up into rectangles and shifts them a random distance.
|
|
80 Parameters: number of tiles, max shift
|
|
81 Use:
|
|
82 python image_do.py -i input.jpg -o output.jpg -c "tileify num_tiles max_shift" -e "jpg"
|
|
83 """
|
|
84 print "command: " + listOfValues[0]
|
|
85 num_tiles = int(listOfValues[1])
|
|
86 max_shift = int(listOfValues[2])
|
|
87 new_image_data = tileify(imageIn, num_tiles, max_shift)
|
|
88 new_image_data.save(outputImage_fn, input_extension);
|
|
89 # new_image_data.show();
|
|
90 elif listOfValues[0] == "rotate":
|
|
91 """
|
|
92 Rotates an image the given number of degrees counter clockwise around its centre.
|
|
93 Parameters: deg, 1 - expand the image or 0 - leave same size, filter
|
|
94 Use:
|
|
95 python image_do.py -i input.jpg -o output.jpg -c "rotate 45 1" -e "jpg"
|
|
96 """
|
|
97 print "command: " + listOfValues[0]
|
|
98 new_image_data = imageIn.rotate(int(listOfValues[1]), expand=int(listOfValues[2]))
|
|
99 new_image_data.save(outputImage_fn, input_extension);
|
|
100 # new_image_data.show(new_image_data)
|
|
101 elif listOfValues[0] == "resize":
|
|
102 """
|
|
103 Resizes the image.
|
|
104 Parameters: width, height, filter: 0 = NEAREST, 1 = ANTIALIAS, 2 = BILINEAR, 3 = BICUBIC
|
|
105 Use:
|
|
106 python image_do.py -i sydney.jpg -o o.jpg -c "resize 140 140 0"
|
|
107 """
|
|
108 print "command: " + listOfValues[0]
|
|
109 size = int(listOfValues[1]), int(listOfValues[2])
|
|
110 filterr = int(listOfValues[3])
|
|
111 new_image_data = imageIn.resize(size, filterr)
|
|
112 new_image_data.save(outputImage_fn, input_extension);
|
|
113 # new_image_data.show()
|
|
114
|
|
115 elif listOfValues[0] == "crop":
|
|
116 # bbox
|
|
117 # returns a copy of a rectangular region from the current image. The box is a 4-tuple defining the left, upper, right, and lower pixel coordinate.
|
|
118 # example: python image_do.py -i sydney.jpg -o sydney_out.jpg -c "crop 0 0 10 10"
|
|
119 print "command: " + listOfValues[0]
|
|
120 new_image_data = imageIn.crop((int(listOfValues[1]), int(listOfValues[2]), int(listOfValues[3]), int(listOfValues[4])))
|
|
121 new_image_data.save(outputImage_fn);
|
|
122 # new_image_data.show(new_image_data)
|
|
123
|
|
124
|
|
125 def add_text_header(image_data, text='cloudimaging.net.au'):
|
|
126 """
|
|
127 Add text to the top of the document
|
|
128 Inputs
|
|
129 image_data - image to have text added
|
|
130 text - string to add
|
|
131 """
|
|
132 # TODO add string wrapping for long strings
|
|
133 # TODO figure this out programatically
|
|
134 text_location = (300, 1)
|
|
135 # This is white
|
|
136 fill_color = 255
|
|
137 # This happens if -s wasn't set
|
|
138 if text == None:
|
|
139 text = 'cloudimaging.net.au'
|
|
140 draw = ImageDraw.Draw(image_data)
|
|
141 draw.text(text_location, text, fill=fill_color)
|
|
142
|
|
143
|
|
144 if __name__ == "__main__":
|
|
145 main()
|
|
146
|