Posted on

Out of boredom, I spent half an hour writing (copying) a script that automatically adds watermarks to photos. Its basic function is to add the time, dimensions, GPS information (when available from a drone or phone), and copyright information to the lower-right corner of a selected photo. It is still far from complete; when I have time, I will add support for reading every JPG in a directory and for adapting the font size automatically.

import os
from PIL import Image
from PIL.ExifTags import TAGS
from PIL import ImageFont
from PIL import ImageDraw
def get_exif_data(fname):
    """Get embedded EXIF data from image file."""
    ret = {}
    try:
        img = Image.open(fname)
        if hasattr( img, '_getexif' ):
            exifinfo = img._getexif()
            if exifinfo != None:
                for tag, value in exifinfo.items():
                    decoded = TAGS.get(tag, tag)
                    ret[decoded] = value
                    size = img.size
    except IOError:
        print('IOERROR ' + fname)
    return ret,size
def addText(fname,text):
    img = Image.open(fname)
    draw = ImageDraw.Draw(img)
    # font = ImageFont.truetype(<font-file>, <font-size>)
    font = ImageFont.truetype("Andale.ttf", 64)
    # draw.text((x, y),"Sample Text",(r,g,b))
    draw.text((img.size[0]-img.size[0]/6,img.size[1]-img.size[1]/10),text,(255,255,255),font=font)
    img.save('sample-out.jpg')
    print('Added text')
if __name__ == '__main__':
    fileName = r'/Users/li-yang/Desktop/DSC04467_1.jpg'
    copyright = 'Photo by YangLi'
    exif,size = get_exif_data(fileName)
    print(exif)
    size = str(size[0]) +'*'+ str(size[1])
    if 'DateTimeOriginal' in exif:
        time = exif['DateTimeOriginal']
    else:
        time= 'No Time Info'
    if 'Model' in exif:
        model = exif['Model']
    else:
        model = 'No Model Info'
    if 'GPSInfo' in exif:
        GPS = exif['GPSInfo']
    else:
        GPS = 'No GPS Info'
    text = time +'\n' + size +'\n' +GPS+'\n' +copyright
    addText(fileName,text)

Leave a Reply