My wife and I have a disagreement over the use of our digital camera. She likes to have the date printed on the image. I hate that, I like the image to be pristine.
Our camera has the option to put the date on the image, but we can't agree on whether to enable it. Well, Python to the rescue. Since I learned about Python Imaging Library doing a couple of the Python Challenges, I decided to find whether I could add the date to the image after the fact. It turned out to be pretty easy. I had a proof-of-concept done in about 10 minutes, and a finished project a couple hours later. I now have a routine called "Imprint" that adds any arbitrary text to a JPG file; and one called "GetFileDate" that gets the date of the file (using the EXIF info stored with the image, if it exists). Now I can write a little program to loop through all the undated images (which keep me happy) and make copies with the date, (to keep her happy). Here's my solution, in case anyone is interested: ========================================================== import Image, ImageDraw, ImageFont def GetFileDate(file): """ Returns the date associated with a file. For JPEG files, it will use the EXIF data, if available """ try: import EXIF # EXIF.py from http://home.cfl.rr.com/genecash/digital_camera.html f = open(file, "rb") tags = EXIF.process_file(f) f.close() return str(tags['Image DateTime']) except (KeyError, ImportError): # EXIF not installed or no EXIF date available import os.path, time return time.ctime(os.path.getmtime(file)) def ReduceOpacity(im, opacity): """ Returns an image with reduced opacity. Taken from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/362879 """ import ImageEnhance assert opacity >= 0 and opacity <= 1 if im.mode != 'RGBA': im = im.convert('RGBA') else: im = im.copy() alpha = im.split()[3] alpha = ImageEnhance.Brightness(alpha).enhance(opacity) im.putalpha(alpha) return im def Imprint(im, inputtext, font=None, color=None, opacity=.6, margin=(30,30)): """ imprints a PIL image with the indicated text in lower-right corner """ if im.mode != "RGBA": im = im.convert("RGBA") textlayer = Image.new("RGBA", im.size, (0,0,0,0)) textdraw = ImageDraw.Draw(textlayer) textsize = textdraw.textsize(inputtext, font=font) textpos = [im.size[i]-textsize[i]-margin[i] for i in [0,1]] textdraw.text(textpos, inputtext, font=font, fill=color) if opacity != 1: textlayer = ReduceOpacity(textlayer,opacity) return Image.composite(textlayer, im, textlayer) def test(): font=ImageFont.truetype("Arial.ttf", 40) imagefile = "DSCN0214.JPG" datetext = GetFileDate(imagefile) print datetext im = Image.open(imagefile) im0 = Imprint(im, datetext, font=font, opacity=0.5, color=(255,255,255)) im0.save("DSCN0214-dated.jpg", "JPEG") if __name__ == "__main__": test() ========================================================== _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor