En Python, ¿cómo leo los datos exif de una imagen?

Resuelto TIMEX asked hace 13 años • 10 respuestas

Estoy usando PIL. ¿Cómo convierto los datos EXIF ​​de una imagen en un diccionario?

TIMEX avatar Jan 22 '11 06:01 TIMEX
Aceptado

Puede utilizar el _getexif()método protegido de una imagen PIL.

import PIL.Image
img = PIL.Image.open('img.jpg')
exif_data = img._getexif()

Esto debería proporcionarle un diccionario indexado por etiquetas numéricas EXIF. Si desea que el diccionario esté indexado por las cadenas de nombres de etiquetas EXIF ​​reales, intente algo como:

import PIL.ExifTags
exif = {
    PIL.ExifTags.TAGS[k]: v
    for k, v in img._getexif().items()
    if k in PIL.ExifTags.TAGS
}
payne avatar Jan 22 '2011 00:01 payne

Para Python 3.x y el uso de Pillow 6.x y superiores, Imagelos objetos ahora proporcionan un getexif()método "público"/oficial que devuelve una <class 'PIL.Image.Exif'>instancia o Nonesi la imagen no tiene datos EXIF.

De las notas de la versión de Pillow 6.0.0 :

getexif()Se ha agregado, que devuelve una Exifinstancia. Los valores se pueden recuperar y configurar como un diccionario. Al guardar JPEG, PNG o WEBP, la instancia se puede pasar como exifargumento para incluir cualquier cambio en la imagen de salida.

Como se indicó, puede iterar sobre los pares clave-valor de la Exifinstancia como un diccionario normal. Las claves son números enteros de 16 bits que se pueden asignar a sus nombres de cadena mediante el ExifTags.TAGSmódulo.

from PIL import Image, ExifTags

img = Image.open("sample.jpg")
img_exif = img.getexif()
print(type(img_exif))
# <class 'PIL.Image.Exif'>

if img_exif is None:
    print('Sorry, image has no exif data.')
else:
    for key, val in img_exif.items():
        if key in ExifTags.TAGS:
            print(f'{ExifTags.TAGS[key]}:{val}')
        else:
            print(f'{key}:{val}')

Para las claves EXIF ​​que aparecen en el ExifTags.TAGSmódulo, debería ver algo como esto:

ExifVersion:b'0230'
...
FocalLength:(2300, 100)
ColorSpace:1
...
Model:'X-T2'
Make:'FUJIFILM'
LensSpecification:(18.0, 55.0, 2.8, 4.0)
...
DateTime:'2019:12:01 21:30:07'
...

Probado con Python 3.8.8 y Pillow 8.1.0.

Gino Mempin avatar Jun 13 '2019 00:06 Gino Mempin