2013-06-11 15 views
8

Gdy próbuję zmienić rozmiar (miniaturę) obrazu przy użyciu PIL, dane exif zostaną utracone.Zachowaj dane exif obrazka z PIL podczas zmiany rozmiaru (utwórz miniaturę)

Co należy zrobić, aby zachować dane Exif w miniaturze? Kiedy szukałem tego samego, otrzymałem kilka linków, ale żaden nie wydaje się działać.

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

Oryginalny obraz ma dane exif, ale obraz im (512_a.JPEG) nie.

Odpowiedz

2

Przeczytałem część kodu źródłowego i znalazłem sposób, aby upewnić się, że dane exif zostaną zapisane z miniaturą.

Po otwarciu pliku jpg w pliku PIL obiekt Image ma atrybut info, który jest słownikiem. Jeden z kluczy nazywa się exif i ma wartość, która jest ciągiem bajtów - surowe dane exif z obrazu. Możesz przekazać ten ciąg bajtów do sposobu ratowania i należy go zapisać dane exif do nowego pliku 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) 

aby uzyskać czytelną wersję danych EXIF ​​można wykonać następujące czynności:

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

Próbowałem ale im.save ('P4072956_thumb.jpg', Exif = Exif) nie zapisywanie danych exif – Jisson

+0

Wypróbuj 'print exif', aby potwierdzić, że istnieją dane exif. Lub możesz spróbować uruchomić drugi przykład, aby wyświetlić dane exif. –

+0

Po otwarciu oryginalnego pliku z "Phatch Image Inspector", istnieją dane exif, Ale kiedy otworzę plik o zmienionym rozmiarze, z powyższym narzędziem, nie ma 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() 

teraz mogę otworzyć obraz, używając Phatch Inspector obrazu, widzę danych eXIF

5

W moim projekcie, poznałem ten sam problem z wami. Po przeszukaniu Google znalazłem bibliotekę piexif. Pomaga to Pilow zapisać dane do miniatur.

Można użyć kodu źródłowego poniżej:

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) 

Uwaga: używam Pythona 3.4 i Ubuntu 14.04

Powiązane problemy