जवाबों:
आप BytesIO
क्लास का उपयोग उस स्ट्रिंग के चारों ओर एक आवरण प्राप्त करने के लिए कर सकते हैं जो एक फ़ाइल की तरह व्यवहार करता है। BytesIO
वस्तु एक फ़ाइल के रूप में एक ही इंटरफेस प्रदान करता है, लेकिन सिर्फ स्मृति में सामग्री की बचत होती है:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
आपको format
पैरामीटर के साथ आउटपुट प्रारूप को स्पष्ट रूप से निर्दिष्ट करना होगा, अन्यथा पीआईएल स्वचालित रूप से इसका पता लगाने की कोशिश करते समय एक त्रुटि उठाएगा।
यदि आपने फ़ाइल से छवि लोड की है तो इसमें एक format
पैरामीटर है जिसमें मूल फ़ाइल प्रारूप है, इसलिए इस मामले में आप उपयोग कर सकते हैं format=image.format
।
io
मॉड्यूल की शुरुआत से पहले पुराने पायथन 2 संस्करणों में आपने StringIO
इसके बजाय मॉड्यूल का उपयोग किया होगा ।
You can use a file object instead of a filename. In this case, you must always specify the format.
इसलिए यदि पहला तर्क एक फ़ाइल ऑब्जेक्ट है, तो आपको दूसरे तर्क में पास करना होगा, जो कि प्रारूप (जैसे 'PNG'
) है।
from io import StringIO
image.save(output, format=image.format)
पायथन 3 के लिए बाइट्सियो का उपयोग करना आवश्यक है:
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')
और पढ़ें: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
क्योंकि मेरे लिए sth का समाधान काम नहीं आया ...
इमेजिंग / PIL / Image.pyc लाइन 1423 -> KeyError (ext) # अज्ञात एक्सटेंशन बढ़ाएं
यह फ़ाइल नाम में एक्सटेंशन से प्रारूप का पता लगाने की कोशिश कर रहा था, जो स्ट्रिंगियो केस में मौजूद नहीं है
आप स्वरूप को पैरामीटर में स्वयं सेट करके प्रारूप का पता लगा सकते हैं
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
एक फ़ाइल की तरह ऑब्जेक्ट के साथ-साथ एक पथ ले सकते हैं, इसलिए आप इन-मेमोरी बफर का उपयोग कर सकते हैं जैसे StringIO
:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
आधुनिक के साथ (2017 के मध्य पायथन 3.5 और तकिया 4.0 के रूप में):
StringIO अब काम नहीं करता है जैसा कि वह करता था। इसे संभालने के लिए बाइट्सियो क्लास उचित तरीका है। पिलो के सेव फंक्शन को पहले तर्क के रूप में एक स्ट्रिंग की उम्मीद है, और आश्चर्यजनक रूप से स्ट्रिंगो को इस तरह से नहीं देखा जा सकता है। निम्नलिखित पुराने स्ट्रिंगो समाधानों के समान है, लेकिन इसके स्थान पर बाइट्सियो के साथ।
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
जब आप कहते हैं कि "मैं इस तरह की छवियों को शब्दकोश में संग्रहीत करना चाहता हूं", तो यह स्पष्ट नहीं है कि यह एक इन-मेमोरी संरचना है या नहीं।
आप स्मृति में एक छवि नम्र करने के लिए यह करने की जरूरत नहीं है। बस image
वस्तु को अपने शब्दकोश में रखें।
यदि आप किसी फ़ाइल में अपना शब्दकोश लिखने जा रहे हैं, तो आप im.tostring()
विधि और Image.fromstring()
कार्य को देखना चाहते हैं
http://effbot.org/imagingbook/image.htm
im.tostring () => स्ट्रिंग
मानक "कच्चे" एनकोडर का उपयोग करके, स्ट्रिंग डेटा पिक्सेल डेटा देता है।
Image.fromstring (मोड, आकार, डेटा) => छवि
मानक "कच्चे" डिकोडर का उपयोग करके एक स्ट्रिंग में पिक्सेल डेटा से एक छवि मेमोरी बनाता है।
"प्रारूप" (.jpeg, .png, आदि) केवल डिस्क पर मायने रखता है जब आप फ़ाइलों का आदान-प्रदान कर रहे हैं। यदि आप फ़ाइलों का आदान-प्रदान नहीं कर रहे हैं, तो प्रारूप कोई मायने नहीं रखता है।