2013-06-11 2 views
8

Quando provo a ridimensionare (miniatura) un'immagine utilizzando PIL, i dati exif vengono persi.Conserva i dati exif dell'immagine con PIL quando ridimensiona (crea miniatura)

Cosa devo fare per mantenere i dati exif nell'immagine di anteprima? Quando ho cercato lo stesso, ho dei link ma nessuno sembra funzionare.

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") 

L'immagine originale ha dati EXIF, ma l'immagine im (512_a.JPEG) non lo fa.

risposta

2

Ho letto alcuni dei codici sorgente e ho trovato un modo per assicurarmi che i dati exif vengano salvati con la miniatura.

Quando si apre un file jpg in PIL, l'oggetto Image ha un attributo info che è un dizionario. Uno dei tasti è chiamato exif e ha un valore che è una stringa di byte - i dati exif grezzi dall'immagine. È possibile passare questa stringa di byte per il metodo di salvataggio e dovrebbe scrivere i dati EXIF ​​per il nuovo file 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) 

per ottenere una versione leggibile dei dati exif è possibile effettuare le seguenti operazioni:

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 
+0

ho provato ma im.save ('P4072956_thumb.jpg', exif = exif) non salvare i dati exif – Jisson

+0

Prova 'print exif' per confermare che ci sono dati exif. Oppure puoi provare a eseguire il secondo esempio per visualizzare i dati exif. –

+0

Quando apro il file originale con 'Phatch Image Inspector', ci sono dati exif, ma quando apro il file immagine ridimensionato, con lo strumento sopra, non ci sono exif – Jisson

1
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() 

Ora apro l'immagine usando Phatch ispettore immagine, posso vedere i dati exif

5

Nel mio progetto, ho incontrato lo stesso problema con te. Dopo aver cercato su Google, ho trovato la libreria piexif. Aiuta a Pilow salvare i dati exif alle miniature.

È possibile utilizzare il codice sorgente di seguito:

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: io sto usando Python 3.4 e Ubuntu 14.04