Get date and time when photo was taken from EXIF data using PIL
Found the answer eventually, the tag I needed was 36867:
from PIL import Image
def get_date_taken(path):
return Image.open(path)._getexif()[36867]
I like to use exif-py
because it's pure-python, does not require compilation/installation, and works with both python 2.x and 3.x making it ideal for bundling with small portable python applications.
Link: https://github.com/ianare/exif-py
Example to get the date and time a photo was taken:
import exifread
with open('image.jpg', 'rb') as fh:
tags = exifread.process_file(fh, stop_tag="EXIF DateTimeOriginal")
dateTaken = tags["EXIF DateTimeOriginal"]
return dateTaken
ExifTags.TAGS
is a mapping from tag to tag name. You can use it to create a map of tag names to values.
On this particular picture, there are a few different "date" properties (DateTime
, DateTimeOriginal
, DateTimeDigitized
) that could be used.
import json
from PIL import Image, ExifTags
from datetime import datetime
def main(filename):
image_exif = Image.open(filename)._getexif()
if image_exif:
# Make a map with tag names
exif = { ExifTags.TAGS[k]: v for k, v in image_exif.items() if k in ExifTags.TAGS and type(v) is not bytes }
print(json.dumps(exif, indent=4))
# Grab the date
date_obj = datetime.strptime(exif['DateTimeOriginal'], '%Y:%m:%d %H:%M:%S')
print(date_obj)
else:
print('Unable to get date from exif for %s' % filename)
Output:
{
"DateTimeOriginal": "2008:11:15 19:36:24",
"DateTimeDigitized": "2008:11:15 19:36:24",
"ColorSpace": 1,
"ExifImageWidth": 3088,
"SceneCaptureType": 0,
"ExifImageHeight": 2320,
"SubjectDistanceRange": 2,
"ImageDescription": " ",
"Make": "Hewlett-Packard ",
"Model": "HP Photosmart R740 ",
"Orientation": 1,
"DateTime": "2008:11:15 19:36:24",
...
}
2008-11-15 19:36:24
This has changed slightly in more recent versions of Pillow (6.0+ I believe).
They added a public method getexif()
that you should use. The previous version was private and experimental (_getexif()
).
from PIL import Image
im = Image.open('path/to/image.jpg')
exif = im.getexif()
creation_time = exif.get(36867)