আমি পিআইএল ব্যবহার করে একটি চিত্র তৈরি করেছি । আমি কীভাবে এটিকে মেমরিতে একটি স্ট্রিংয়ে সংরক্ষণ করতে পারি? Image.save()পদ্ধতি একটি ফাইল প্রয়োজন।
আমি অভিধানে এই জাতীয় বেশ কয়েকটি চিত্র সঞ্চয় করতে চাই।
উত্তর:
BytesIOফাইলটির মতো আচরণ করে এমন স্ট্রিংগুলির চারপাশে মোড়ক পেতে আপনি ক্লাসটি ব্যবহার করতে পারেন । BytesIOঅবজেক্ট ফাইল হিসেবে একই ইন্টারফেস প্রদান করে, কিন্তু মেমরি বিষয়বস্তু সংরক্ষণ:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
আপনাকে formatপ্যারামিটারের সাথে স্পষ্টভাবে আউটপুট ফর্ম্যাট নির্দিষ্ট করতে হবে, অন্যথায় পিআইএল এটি স্বয়ংক্রিয়ভাবে সনাক্ত করার চেষ্টা করার সময় একটি ত্রুটি বাড়িয়ে তুলবে।
আপনি যদি কোনও ফাইল থেকে চিত্রটি লোড করেন তবে এতে একটি formatপ্যারামিটার রয়েছে যা মূল ফাইল ফর্ম্যাট ধারণ করে, তাই এই ক্ষেত্রে আপনি ব্যবহার করতে পারেন format=image.format।
পুরানো পাইথন 2 সংস্করণে ioমডিউলটি প্রবর্তনের আগে আপনি 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-mmory-image
স্টেহ এর সমাধান আমার পক্ষে কাজ করে নি
কারণ ইন ...
ইমেজিং / পিআইএল / চিত্র.পিসি.সি. লাইন 1423 -> কীআরআর (এক্সট্রা) # অজানা বাড়ানো
এটি ফাইলের নামটিতে এক্সটেনশন থেকে ফর্ম্যাটটি সনাক্ত করার চেষ্টা করছিল যা স্ট্রিংআইওর ক্ষেত্রে বিদ্যমান নেই
আপনি কোনও প্যারামিটারে ফর্ম্যাটটি সেট করে বিন্যাস সনাক্তকরণটিকে বাইপাস করতে পারেন
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()
আধুনিক সহ (২০১৩ সালের মাঝামাঝি পাইথন 3.5 এবং বালিশ 4.0):
স্ট্রিংআইও আর আগের মতো কাজ করবে বলে মনে হয় না। বাইটসআইও ক্লাস হ'ল এটি পরিচালনা করার উপযুক্ত উপায়। বালিশের সেভ ফাংশনটি প্রথম আর্গুমেন্ট হিসাবে একটি স্ট্রিং প্রত্যাশা করে, এবং আশ্চর্যজনকভাবে স্ট্রিংআইওকে সেভাবে দেখেনি। নীচে পুরানো স্ট্রিংআইও সমাধানগুলির সাথে সমান, তবে এর জায়গায় বাইটসআইও সহ।
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, ইত্যাদি) কেবলমাত্র আপনি যখন ডিস্ক বিনিময় করছেন তখন ডিস্কে গুরুত্বপূর্ণ। আপনি যদি ফাইল বিনিময় না করে থাকেন তবে ফর্ম্যাটটিতে কিছু আসে যায় না।