2011-01-21 36 views
68

Estoy usando PIL. ¿Cómo convierto los datos EXIF ​​en un diccionario de cosas?En Python, ¿cómo leo los datos exif de una imagen?

+0

Pregunta más reciente aquí: http://stackoverflow.com/questions/14009148/exif-reading-library –

+1

Consulte las respuestas aquí: http://stackoverflow.com/questions/765396/exif-manipulation-library-for-python –

+0

http://tilloy.net/dev/pyexiv2/tutorial.html Este es el más fácil y completo. –

Respuesta

108

Prueba esto:

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

Esto debe darle un diccionario indexado por EXIF ​​etiquetas numéricas. Si desea que el diccionario indexado por las cadenas de nombres de etiqueta reales EXIF, intentar algo como:

import PIL.ExifTags 
exif = { 
    PIL.ExifTags.TAGS[k]: v 
    for k, v in img._getexif().items() 
    if k in PIL.ExifTags.TAGS 
} 
+5

¿Alguna alternativa de Python 3? –

+0

Python 2.7.2: el objeto 'AttributeError: 'module' no tiene el atributo 'ExifTags'' – 2rs2ts

+2

@ 2rs2ts: prueba' import ExifTags' (sin el prefijo 'PIL'). –

20

también puede utilizar el módulo ExifRead:

import exifread 
# Open image file for reading (binary mode) 
f = open(path_name, 'rb') 

# Return Exif tags 
tags = exifread.process_file(f) 
+0

Puede probar esto en esta pregunta, descargar las imágenes y tratar de obtener la ImageDescription. http://stackoverflow.com/questions/22173902/how-to-get-image-title-in-python-django – Clayton

+1

@Clayton para ambas imágenes, exifread devuelve el diccionario vacío. Pero probé en mis fotos y funciona bien. – tnq177

11

utilizo este:

import os,sys 
from PIL import Image 
from PIL.ExifTags import TAGS 

for (k,v) in Image.open(sys.argv[1])._getexif().iteritems(): 
     print '%s = %s' % (TAGS.get(k), v) 

o para obtener un campo específico:

def get_field (exif,field) : 
    for (k,v) in exif.iteritems(): 
    if TAGS.get(k) == field: 
     return v 

exif = image._getexif() 
print get_field(exif,'ExposureTime') 
+5

Mejor, puedes revertir TAGS con 'name2tagnum = dict ((name, num) para num, name en TAGS.iteritems())' y luego hacer 'name2tagnum ['ExposureTime']'. – Ben

+0

Para Python 3, cambie 'exif.iteritems()' a 'exif.items()' – SPRBRN

Cuestiones relacionadas