2013-06-11 56 views
8

Khi tôi cố gắng thay đổi kích thước (hình thu nhỏ) một hình ảnh bằng PIL, dữ liệu exif bị mất.Bảo toàn dữ liệu exif của hình ảnh bằng PIL khi thay đổi kích thước (tạo hình thu nhỏ)

Tôi phải làm gì để bảo toàn dữ liệu exif trong hình thu nhỏ? Khi tôi tìm kiếm cho cùng, có một số liên kết nhưng không ai có vẻ là làm việc.

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

Hình ảnh ban đầu có dữ liệu exif, nhưng hình ảnh im (512_a.JPEG) thì không.

Trả lời

2

Tôi đọc một số mã nguồn và tìm cách bảo đảm dữ liệu exif được lưu với hình thu nhỏ.

Khi bạn mở tệp jpg trong PIL, đối tượng Image có thuộc tính info là từ điển. Một trong các khóa được gọi là exif và nó có một giá trị là một chuỗi byte - dữ liệu exif thô từ hình ảnh. Bạn có thể vượt qua chuỗi byte này để các phương pháp tiết kiệm và nó sẽ ghi dữ liệu Exif vào file jpg mới:

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) 

Để có được một phiên bản con người có thể đọc được các dữ liệu Exif bạn có thể làm như sau:

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

Tôi đã thử nó nhưng im.save ('P4072956_thumb.jpg', exif = exif) không lưu dữ liệu exif – Jisson

+0

Thử 'print exif' để xác nhận rằng có dữ liệu exif. Hoặc bạn có thể thử chạy ví dụ thứ hai để xem dữ liệu exif. –

+0

Khi tôi mở tệp gốc bằng 'Phatch Image Inspector', có dữ liệu exif, Nhưng khi tôi mở tệp hình ảnh đã thay đổi kích thước, với công cụ trên, không có 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() 

Bây giờ tôi mở hình ảnh sử dụng Phatch hình ảnh Thanh tra, tôi có thể xem dữ liệu Exif

5

Trong dự án của tôi, tôi đã gặp vấn đề tương tự với bạn. Sau khi tìm kiếm trên Google, tôi đã tìm thấy thư viện piexif. Nó giúp Pilow lưu exif dữ liệu vào hình thu nhỏ.

Bạn có thể sử dụng mã nguồn dưới đây:

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) 

Lưu ý: Tôi đang sử dụng python 3.4 và Ubuntu 14.04