2012-04-12 22 views
9

Làm cách nào để tạo tệp có thể chọn từ đối tượng Hình ảnh PIL để bạn có thể lưu những hình ảnh đó dưới dạng tệp đơn lẻ, sau đó có thể tải lên máy tính khác như máy chủ đang chạy PIL và bỏ ghim ở đó?Đối tượng hình ảnh có thể chọn

Trả lời

16

Bạn có thể chuyển đổi các đối tượng hình ảnh vào dữ liệu thì bạn có thể dưa nó:

image = { 
    'pixels': im.tostring(), 
    'size': im.size, 
    'mode': im.mode, 
} 

Và trở lại với một hình ảnh:

im = Image.fromstring(image['mode'], image['size'], image['pixels']) 

LƯU Ý: Như astex đề cập, nếu bạn sử dụng Gối (được đề xuất thay vì PIL), phương pháp tostring() không còn được sử dụng cho tobytes(). Tương tự như vậy với fromstring() cho frombytes().

+1

'Image.tostring() 'hiện không được dùng nữa i n 'Pillow' có lợi cho' Image.tobytes() '. Vì lợi ích của hậu thế, nó có thể là tốt hơn để thay đổi ở trên (hoặc ít nhất là để lại một lưu ý). – astex

9

biến thể nhẹ của câu trả lời Gerald bằng cách sử dụng từ khóa args

tạo đối tượng pickleable

image = {'data': im.tostring(), 'size':im.size, 'mode':im.mode} 

hoặc

image = dict(data=im.tostring(), size=im.size, mode=im.mode) 

unpickle trở lại hình ảnh

im = Image.fromstring(**image) 
+0

Điều này có nghĩa là tôi không cần lưu trữ hình ảnh trong ứng dụng của mình? Tôi chỉ có thể sử dụng chuỗi mà họ serialize và chỉ hardcode nó bên trong ứng dụng khi tôi muốn sử dụng hình ảnh? – Ogen

+0

Về mặt kỹ thuật, bạn có thể làm điều đó, nhưng tốt hơn nên giữ nó như một tệp thực ... trong trường hợp nó có thể được phiên bản cùng với mã của bạn, nhưng có hình ảnh được lưu giữ dưới dạng hình ảnh có nghĩa là bạn có thể dễ dàng xem chúng và biết phương tiện bạn đã lưu trữ. Nếu bạn lưu trữ hình ảnh dưới dạng mã, bạn sẽ tăng kích thước tệp nguồn của mình một cách giả tạo, khiến chúng trở nên quan trọng hơn để xem và tìm kiếm và khiến phương tiện của bạn khó quản lý hơn nếu bạn muốn xem và/hoặc thay đổi hình ảnh đó. – kungphu