Câu trả lời:
Bạn có thể sử dụng BytesIO
lớp để lấy một trình bao bọc xung quanh các chuỗi hoạt động giống như một tệp. Đối BytesIO
tượng cung cấp giao diện giống như một tệp, nhưng chỉ lưu nội dung trong bộ nhớ:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Bạn phải chỉ định rõ ràng định dạng đầu ra với format
tham số, nếu không PIL sẽ phát sinh lỗi khi cố gắng tự động phát hiện nó.
Nếu bạn tải hình ảnh từ một tệp, nó có một format
tham số chứa định dạng tệp gốc, vì vậy trong trường hợp này bạn có thể sử dụng format=image.format
.
Trong các phiên bản Python 2 cũ trước khi giới thiệu io
mô-đun, bạn sẽ sử dụng StringIO
mô-đun đó thay thế.
You can use a file object instead of a filename. In this case, you must always specify the format.
Vì vậy, nếu đối số đầu tiên là một đối tượng tệp, bạn phải chuyển đối số thứ hai, đó là định dạng (ví dụ 'PNG'
).
from io import StringIO
image.save(output, format=image.format)
Đối với Python3, bắt buộc phải sử dụng BytesIO:
from io import BytesIO
from PIL import Image, ImageDraw
image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")
byte_io = BytesIO()
image.save(byte_io, 'PNG')
Đọc thêm: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
giải pháp của sth không hiệu quả với tôi
vì trong ...
Imaging / PIL / Image.pyc dòng 1423 -> nâng KeyError (ext) # phần mở rộng không xác định
Nó đang cố gắng phát hiện định dạng từ phần mở rộng trong tên tệp, không tồn tại trong trường hợp StringIO
Bạn có thể bỏ qua việc phát hiện định dạng bằng cách tự đặt định dạng trong một tham số
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
có thể lấy một đối tượng giống tệp cũng như một đường dẫn, vì vậy bạn có thể sử dụng bộ đệm trong bộ nhớ như StringIO
:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
Với hiện đại (kể từ giữa năm 2017 Python 3.5 và Pillow 4.0):
StringIO dường như không còn hoạt động như trước đây nữa. Lớp BytesIO là cách thích hợp để xử lý điều này. Hàm lưu của Pillow mong đợi một chuỗi là đối số đầu tiên và đáng ngạc nhiên là không thấy StringIO như vậy. Phần sau tương tự với các giải pháp StringIO cũ hơn, nhưng với BytesIO ở vị trí của nó.
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
Khi bạn nói "Tôi muốn có số lượng hình ảnh như vậy được lưu trữ trong từ điển", không rõ đây có phải là cấu trúc trong bộ nhớ hay không.
Bạn không cần phải làm bất kỳ điều gì trong số này để ghi nhớ một hình ảnh trong bộ nhớ. Chỉ cần giữ image
đối tượng trong từ điển của bạn.
Nếu bạn định ghi từ điển của mình vào một tệp, bạn có thể muốn xem xét im.tostring()
phương thức và Image.fromstring()
hàm
http://effbot.org/imagingbook/image.htm
im.tostring () => chuỗi
Trả về một chuỗi chứa dữ liệu pixel, sử dụng bộ mã hóa "thô" tiêu chuẩn.
Image.fromstring (mode, size, data) => image
Tạo bộ nhớ hình ảnh từ dữ liệu pixel trong một chuỗi, sử dụng bộ giải mã "thô" tiêu chuẩn.
"Định dạng" (.jpeg, .png, v.v.) chỉ quan trọng trên đĩa khi bạn đang trao đổi tệp. Nếu bạn không trao đổi tệp, định dạng không quan trọng.