Conservar los datos exif de la imagen con PIL al redimensionar (crear miniatura)

Cuando bash cambiar el tamaño (miniatura) de una imagen con PIL, los datos exif se pierden.

¿Qué debo hacer para conservar los datos exif en la imagen en miniatura? Cuando busqué lo mismo, obtuve algunos enlaces pero ninguno parece estar funcionando.

from PIL import Image import StringIO file_path = '/home/me/img/a.JPG' im = Image.open( file_path) THUMB_SIZES = [(512, 512)] for thumbnail_size in THUMB_SIZES: im.thumbnail( thumbnail_size, Image.ANTIALIAS) thumbnail_buf_string = StringIO.StringIO() im.save('512_' + "a", "JPEG") 

La imagen original tiene datos exif, pero la imagen im (512_a.JPEG) no.

En mi proyecto, me encontré con el mismo problema con usted. Después de buscar en Google, encontré la librería piexif . Ayuda a exif guardar datos exif en miniaturas.

Puede utilizar el siguiente código fuente:

 from PIL import Image import piexif import StringIO file_path = '/home/me/img/a.JPG' im = Image.open( file_path) # load exif data exif_dict = piexif.load(im.info["exif"]) exif_bytes = piexif.dump(exif_dict) THUMB_SIZES = [(512, 512)] for thumbnail_size in THUMB_SIZES: im.thumbnail( thumbnail_size, Image.ANTIALIAS) thumbnail_buf_string = StringIO.StringIO() # save thumbnail with exif data im.save('512_' + "a", "JPEG", exif=exif_bytes) 

Nota: estoy usando python 3.4 y ubuntu 14.04

Leí un poco del código fuente y encontré una manera de asegurarme de que los datos exif se guardan con la miniatura.

Cuando abre un archivo jpg en PIL, el objeto de Image tiene un atributo de info que es un diccionario. Una de las claves se llama exif y tiene un valor que es una cadena de bytes: los datos exif en bruto de la imagen. Puede pasar esta cadena de bytes al método de guardar y debe escribir los datos exif en el nuevo archivo jpg:

 from PIL import Image size = (512, 512) im = Image.open('P4072956.jpg') im.thumbnail(size, Image.ANTIALIAS) exif = im.info['exif'] im.save('P4072956_thumb.jpg', exif=exif) 

Para obtener una versión legible por humanos de los datos exif, puede hacer lo siguiente:

 from PIL import Image from PIL.ExifTags import TAGS im = Image.open('P4072956.jpg') for k, v in im._getexif().items(): print TAGS.get(k, k), v 
 import pyexiv2 from PIL import Image file_path = '/home/../img/a.JPG' metadata = pyexiv2.ImageMetadata(file_path) metadata.read() thumb = metadata.exif_thumbnail thumb.set_from_file(file_path) thumb.write_to_file('512_' + "a") thumb.erase() metadata.write() 

Ahora abro la imagen usando Phatch Image Inspector, puedo ver los datos exif