PIL के साथ स्ट्रिंग करने के लिए PNG इमेज कैसे लिखें?


100

मैंने पीआईएल का उपयोग करके एक छवि बनाई है । मैं इसे मेमोरी में स्ट्रिंग में कैसे सहेज सकता हूं? Image.save()विधि एक फ़ाइल की आवश्यकता है।

मैं ऐसे कई चित्रों को शब्दकोश में संग्रहीत करना चाहता हूँ।

जवाबों:


194

आप 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इसके बजाय मॉड्यूल का उपयोग किया होगा ।


1
हाँ! यही वह है जिसकी तलाश में मैं हूं। मैंने अजगर, स्ट्रिंग, रीडर, लेखक, बफर के हर संयोजन को गुमराह किया और कुछ भी नहीं आया। धन्यवाद!
rik.the.vik

2
मेरे लिए काम नहीं करता है :( मुझे यह KeyError इमेजिंग / PIL / Image.pyc लाइन 1423 में मिला है -> KeyError (ext) बढ़ाएं # अज्ञात एक्सटेंशन
Radian

6
@Radian, Save () विधि पर PIL दस्तावेज कहता है: You can use a file object instead of a filename. In this case, you must always specify the format.इसलिए यदि पहला तर्क एक फ़ाइल ऑब्जेक्ट है, तो आपको दूसरे तर्क में पास करना होगा, जो कि प्रारूप (जैसे 'PNG') है।
सू झांग

1
वर्तमान पायथन संस्करण में, स्ट्रिंगियो आईओ पैकेज में है, आपको अवश्य लिखना चाहिए:from io import StringIO
स्पाउटनिक 16

4
आप बेहतर उपयोग कर सकते हैंimage.save(output, format=image.format)
reetesh11

29

पायथन 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


24


क्योंकि मेरे लिए 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()

14

save()एक फ़ाइल की तरह ऑब्जेक्ट के साथ-साथ एक पथ ले सकते हैं, इसलिए आप इन-मेमोरी बफर का उपयोग कर सकते हैं जैसे StringIO:

buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()

धन्यवाद। स्ट्रिंग - मैं क्या जरूरत है।
अधिकतम

जब पीएनजी, जेपीईजी, या वास्तविक फ़ाइल प्रारूप प्राप्त करने की बात आती है तो बचत () इंटरफ़ेस tostring () इंटरफ़ेस की तुलना में बहुत अधिक स्वच्छ है।
कोकोआ 22

13

आधुनिक के साथ (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')

2
का उद्देश्य क्या है, image_data = faux_file.getvalue ()?
रयान

@ रियान अच्छा कैच, कोई उद्देश्य नहीं। परीक्षण से इसे छोड़ दिया गया और अंत में हटा दिया गया।
mightypile

9

जब आप कहते हैं कि "मैं इस तरह की छवियों को शब्दकोश में संग्रहीत करना चाहता हूं", तो यह स्पष्ट नहीं है कि यह एक इन-मेमोरी संरचना है या नहीं।

आप स्मृति में एक छवि नम्र करने के लिए यह करने की जरूरत नहीं है। बस imageवस्तु को अपने शब्दकोश में रखें।

यदि आप किसी फ़ाइल में अपना शब्दकोश लिखने जा रहे हैं, तो आप im.tostring()विधि और Image.fromstring()कार्य को देखना चाहते हैं

http://effbot.org/imagingbook/image.htm

im.tostring () => स्ट्रिंग

मानक "कच्चे" एनकोडर का उपयोग करके, स्ट्रिंग डेटा पिक्सेल डेटा देता है।

Image.fromstring (मोड, आकार, डेटा) => छवि

मानक "कच्चे" डिकोडर का उपयोग करके एक स्ट्रिंग में पिक्सेल डेटा से एक छवि मेमोरी बनाता है।

"प्रारूप" (.jpeg, .png, आदि) केवल डिस्क पर मायने रखता है जब आप फ़ाइलों का आदान-प्रदान कर रहे हैं। यदि आप फ़ाइलों का आदान-प्रदान नहीं कर रहे हैं, तो प्रारूप कोई मायने नहीं रखता है।


2
ऐसा लगता है कि वह पीएनजी प्रारूप को बनाए रखना चाहता है, इसे कच्चे पिक्सेल डेटा में कम नहीं करता है।
बेन ब्लैंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.