2009-03-14 40 views

Trả lời

150

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

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! –

+0

Cảm ơn - đã cứu tôi nhiều đầu gãi sáng nay. –

+2

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

7

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.

+2

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ô. –

10

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() 
+0

Cảm ơn bạn. StringIO - đó là những gì tôi cần. – maxp

+0

Giao diện save() sạch hơn nhiều so với giao diện tostring() khi nói đến định dạng tệp PNG, JPEG hoặc tệp thực. – Kekoa

22

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() 
+0

Cảm ơn !! Điều này đã làm cho tôi –

20

Đố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

1

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ác vấn đề liên quan