Tôi đã tạo hình ảnh bằng cách sử dụng PIL. Làm thế nào tôi có thể lưu nó vào một chuỗi trong bộ nhớ? Phương thức Image.save()
yêu cầu tệp.Python PIL: cách viết hình ảnh PNG thành chuỗi
Tôi muốn lưu một số hình ảnh như vậy trong từ điển.
Tôi đã tạo hình ảnh bằng cách sử dụng PIL. Làm thế nào tôi có thể lưu nó vào một chuỗi trong bộ nhớ? Phương thức Image.save()
yêu cầu tệp.Python PIL: cách viết hình ảnh PNG thành chuỗi
Tôi muốn lưu một số hình ảnh như vậy trong từ điển.
Bạn có thể sử dụng lớp StringIO để có được trình bao bọc xung quanh các chuỗi hoạt động như một tệp. Các đối tượng StringIO cung cấp giao diện tương tự như một tập tin, nhưng tiết kiệm các nội dung chỉ trong bộ nhớ:
try:
# python 2
from StringIO import StringIO
except ImportError:
# python 3
from io import StringIO
output = StringIO()
image.save(output)
contents = output.getvalue()
output.close()
Điều này có thể dẫn đến một KeyError
nếu PIL cố gắng để tự động phát hiện các định dạng đầu ra. Để tránh sự cố này, bạn có thể chỉ định định dạng theo cách thủ công:
image.save(output, format="GIF")
Khi bạn nói "Tôi muốn có số lượng hình ảnh được lưu trong từ điển", không rõ liệu đây có phải là cấu trúc trong bộ nhớ hay không .
Bạn không cần thực hiện bất kỳ thao tác nào trong số này để meek một hình ảnh trong bộ nhớ. Chỉ cần giữ đối tượng image
trong từ điển của bạn.
Nếu bạn đang đi để viết từ điển của bạn vào một tập tin, bạn có thể muốn xem xét im.tostring()
phương pháp và chức năng Image.fromstring()
http://effbot.org/imagingbook/image.htm
im.tostring() => chuỗi
Trả lại chuỗi chứa dữ liệu pixel , sử dụng bộ mã hóa "thô" tiêu chuẩn.
Image.fromstring (chế độ, kích thước, dữ liệu) => ảnh
Tạo một bộ nhớ hình ảnh từ điểm ảnh dữ liệu trong một chuỗi, bằng cách sử dụng tiêu chuẩn "thô" giải mã.
Chỉ định dạng "(" .jpeg, .png, v.v.) trên đĩa khi bạn trao đổi tệp. Nếu bạn không trao đổi tập tin, định dạng không quan trọng.
Có vẻ như anh ta muốn giữ lại định dạng PNG, không giảm nó thành dữ liệu pixel thô. –
tiết kiệm() có thể mất một đối tượng tập tin giống như cũng như một con đường, vì vậy bạn có thể sử dụng một bộ đệm trong bộ nhớ như một StringIO:
buf= StringIO.StringIO()
im.save(buf, format= 'JPEG')
jpeg= buf.getvalue()
giải pháp sth đã không làm việc cho tôi
bởi vì trong ...
Hình ảnh/PIL/hình ảnh.dòng PYC 1423 -> tăng KeyError (ext) # chưa biết mở rộng
Nó đã cố gắng để phát hiện định dạng từ phần mở rộng trong tên tập tin, mà 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 thiết lập các định dạng mình 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()
Cảm ơn !! Điều này đã làm cho tôi –
Đối Python3 nó là cần thiết để 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')
Read more: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
Với hiện đại (tính đến giữa năm 2017 Python 3.5 và Gối 4.0):
StringIO không còn dường như làm việc như trước kia nữa. Lớp BytesIO là cách thích hợp để xử lý điều này. Chức năng tiết kiệm của gối mong đợi một chuỗi như là đối số đầu tiên, và đáng ngạc nhiên không thấy StringIO như vậy. Sau đây là tương tự như các giải pháp StringIO cũ, 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_data = faux_file.getvalue()
image.save(faux_file, 'png')
Có! Điều này thật đúng với gì mà tôi đã tìm kiếm. Tôi googled mỗi sự kết hợp của python, string, đọc, nhà văn, bộ đệm và không đưa ra bất cứ điều gì. Cảm ơn! –
Cảm ơn - đã cứu tôi nhiều đầu gãi sáng nay. –
Không hoạt động cho tôi: ( Tôi đã nhận KeyError này trong đường hình ảnh/PIL/Image.pyc 1423 -> tăng KeyError (ext) # phần mở rộng không xác định – Radian