import Image
import ImageChops
import ImageDraw
import ImageFont
import ImageFilter
import clipboard

def draw_caption(img, text, outline=2, top=False):
	text_img = Image.new('RGBA', img.size, (0, 0, 0, 0))
	draw = ImageDraw.Draw(text_img)
	w = img.size[0]
	s = 100
	while w >= (img.size[0] - 20):
		font = ImageFont.truetype('HelveticaNeue-CondensedBlack', s)
		w, h = draw.textsize(text, font=font)
		s -= 1
		if s <= 12: break
	text_y = 0 if top else img.size[1] - h
	draw.text((10, text_y), text, font=font, fill='black')
	kernel = [0, 1, 2, 1, 0,
	          1, 2, 4, 2, 1,
	          2, 4, 0, 4, 1,
	          1, 2, 4, 2, 1,
	          0, 1, 2, 1, 0]
	myfilter = ImageFilter.Kernel((5, 5), kernel, scale = 0.25 * sum(kernel))
	for i in xrange(outline):
		print 'Processing image... ' + str(int(float(i)/outline * 100)) + '%'
		text_img = text_img.filter(myfilter)
	print 'Processing done.'
	draw = ImageDraw.Draw(text_img)
	draw.text((10, text_y), text, font = font, fill = 'white')
	mask_img = ImageChops.invert(text_img)
	result_img = Image.composite(img, text_img, mask_img)
	return result_img

if __name__ == '__main__':
	print 'Loading image from clipboard...'
	img = clipboard.get_image()
	if img is None:
		print 'No image in clipboard, using default image instead...'
		img = Image.open('Test_Mandrill')
	img.show()
	print 'Enter the top caption (press return for none):'
	caption_top = unicode(raw_input(), 'utf-8')
	caption_top = caption_top.upper()
	if caption_top != '':
		img = draw_caption(img, caption_top, outline=3, top=True)
	print 'Enter the bottom caption (press return for none):'
	caption_btm = unicode(raw_input(), 'utf-8')
	caption_btm = caption_btm.upper()
	if caption_btm != '':
		img = draw_caption(img, caption_btm, outline=3, top=False)
	img.show()
	# If you want to copy the result to the clipboard automatically,
	# uncomment the following line:
	#clipboard.set_image(img.convert('RGBA'))
	# You can also copy an image from the console output or save it
	# to your camera roll by touching and holding it.
