diff tools/image_do.py @ 0:64374d852e36

Uploaded
author tomasz-bednarz
date Mon, 25 Nov 2013 21:32:12 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/image_do.py	Mon Nov 25 21:32:12 2013 -0500
@@ -0,0 +1,146 @@
+import os
+import optparse
+
+from PIL import Image
+from PIL import ImageDraw
+from image_transforms import tileify
+from image_transforms import calculate_random_location
+from image_transforms import filmify_image
+
+
+def main():
+	
+	# Parse options
+	parser = optparse.OptionParser()
+	parser.add_option(
+		"-i",
+		dest="inputImage",
+		help="Input Image",
+		metavar="FILE"
+	)
+	parser.add_option(
+		"-o",
+		dest="outputImage",
+		help="Output Image",
+		metavar="FILE"
+	)
+	parser.add_option(
+		"--command",
+		"-c",
+		dest="imageCommand",
+		help="Command",
+		metavar="string"
+	)
+	parser.add_option(
+		"-s",
+		dest='custom_string',
+		help='String to be placed as decription'
+	)
+	parser.add_option(
+		"-e",
+		dest='image_ext',
+		help='Image extension'
+	)
+	(opts, args) = parser.parse_args()
+
+	mandatory_options = ['inputImage', 'outputImage', 'image_ext']
+	for option in mandatory_options:
+		if not opts.__dict__[option]:
+			print "One or more options are missing\n"
+			parser.print_help()
+			exit(-1)
+
+	inputImage_fn = opts.inputImage
+	outputImage_fn =opts.outputImage
+	input_extension = opts.image_ext
+	if input_extension == "jpg":
+		input_extension="jpeg"
+
+	listOfValues = opts.imageCommand.split()
+
+	try:
+		imageIn = Image.open(inputImage_fn)
+	except IOError:
+		print "Cannot open file: " + inputImage_fn
+
+	if listOfValues[0] == "filmify":
+		"""
+		Transform image into a signed movie frame.
+		Use: 
+		python image_do.py -i input.jpg -o output.jpg -c "filmify" -s "hello world" -e "jpg"
+		"""
+		print "command: " + listOfValues[0]
+		new_image_data = filmify_image(imageIn)
+		add_text_header(new_image_data, text=opts.custom_string)
+		new_image_data.save(outputImage_fn, input_extension);
+		# new_image_data.show();
+	elif listOfValues[0] == "tileify":
+		"""
+		Breaks image up into rectangles and shifts them a random distance.
+		Parameters: number of tiles, max shift
+		Use: 
+		python image_do.py -i input.jpg -o output.jpg -c "tileify num_tiles max_shift" -e "jpg"
+		"""
+		print "command: " + listOfValues[0]
+		num_tiles = int(listOfValues[1])
+		max_shift = int(listOfValues[2])
+		new_image_data = tileify(imageIn, num_tiles, max_shift)
+		new_image_data.save(outputImage_fn, input_extension);
+		# new_image_data.show();
+	elif listOfValues[0] == "rotate":
+		"""
+		Rotates an image the given number of degrees counter clockwise around its centre.
+		Parameters: deg, 1 - expand the image or 0 - leave same size, filter
+		Use:
+		python image_do.py -i input.jpg -o output.jpg -c "rotate 45 1" -e "jpg"
+		"""
+		print "command: " + listOfValues[0]
+		new_image_data = imageIn.rotate(int(listOfValues[1]), expand=int(listOfValues[2]))
+		new_image_data.save(outputImage_fn, input_extension);
+		# new_image_data.show(new_image_data)
+	elif listOfValues[0] == "resize":
+		"""
+		Resizes the image.
+		Parameters: width, height, filter: 0 = NEAREST, 1 = ANTIALIAS, 2 = BILINEAR, 3 = BICUBIC
+		Use:
+		python image_do.py -i sydney.jpg -o o.jpg -c "resize 140 140 0"
+		"""
+		print "command: " + listOfValues[0]
+		size = int(listOfValues[1]), int(listOfValues[2]) 
+		filterr = int(listOfValues[3])
+		new_image_data = imageIn.resize(size, filterr)
+		new_image_data.save(outputImage_fn, input_extension);
+		# new_image_data.show()
+		
+	elif listOfValues[0] == "crop":
+		# bbox 
+		# 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.
+		# example: python image_do.py -i sydney.jpg -o sydney_out.jpg -c "crop 0 0 10 10"
+		print "command: " + listOfValues[0]
+		new_image_data = imageIn.crop((int(listOfValues[1]), int(listOfValues[2]), int(listOfValues[3]), int(listOfValues[4])))
+		new_image_data.save(outputImage_fn);
+		# new_image_data.show(new_image_data)
+
+
+def add_text_header(image_data, text='cloudimaging.net.au'):
+	"""
+	Add text to the top of the document
+	Inputs
+		image_data - image to have text added
+		text - string to add
+	"""
+	# TODO add string wrapping for long strings
+	# TODO figure this out programatically
+	text_location = (300, 1)
+	# This is white
+	fill_color = 255
+	# This happens if -s wasn't set
+	if text == None:
+		text = 'cloudimaging.net.au'
+	draw = ImageDraw.Draw(image_data)
+	draw.text(text_location, text, fill=fill_color)
+
+
+if __name__ == "__main__":
+	main()
+