পিএনএল দিয়ে স্ট্রিংয়ে পিএনজি চিত্র কীভাবে লিখবেন?


105

আমি পিআইএল ব্যবহার করে একটি চিত্র তৈরি করেছি । আমি কীভাবে এটিকে মেমরিতে একটি স্ট্রিংয়ে সংরক্ষণ করতে পারি? Image.save()পদ্ধতি একটি ফাইল প্রয়োজন।

আমি অভিধানে এই জাতীয় বেশ কয়েকটি চিত্র সঞ্চয় করতে চাই।

উত্তর:


201

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পরিবর্তে মডিউলটি ব্যবহার করতে পারবেন।


4
হ্যাঁ! আমি ঠিক এটিই খুঁজছিলাম। আমি অজগর, স্ট্রিং, পাঠক, লেখক, বাফারের প্রতিটি সংমিশ্রণটি গুগল করেছিলাম এবং কিছুই এনেছি না। ধন্যবাদ!
rik.the.vik

4
আমার জন্য কাজ করে না :( আমি ইমেজিং / পিআইএল / চিত্র.পিসি.সি.সি. লাইন 1423 এ এই কী-এরর পেয়েছি -> কী-ইরার বাড়ানো (এক্সট্রাট) # অজানা এক্সটেনশন
ট্যাবদুলাদি

6
@ রাদিয়ান, সেভ () পদ্ধতিতে পিআইএল ডকুমেন্টেশন বলেছেন: You can use a file object instead of a filename. In this case, you must always specify the format.সুতরাং প্রথম যুক্তি যদি কোনও ফাইল অবজেক্ট হয় তবে আপনাকে দ্বিতীয় আর্গুমেন্টটি দিতে হবে, এটি ফর্ম্যাট (যেমন 'PNG'))
সু ঝাং

4
বর্তমান পাইথন সংস্করণে, স্ট্রিংআইও আইও প্যাকেজে রয়েছে, আপনাকে অবশ্যই লিখতে হবে:from io import StringIO
স্পাউটনিক 16

4
আপনি আরও ভালভাবে ব্যবহার করতে পারেনimage.save(output, format=image.format)
১১


24

স্টেহ এর সমাধান আমার পক্ষে কাজ করে নি
কারণ ইন ...

ইমেজিং / পিআইএল / চিত্র.পিসি.সি. লাইন 1423 -> কীআরআর (এক্সট্রা) # অজানা বাড়ানো

এটি ফাইলের নামটিতে এক্সটেনশন থেকে ফর্ম্যাটটি সনাক্ত করার চেষ্টা করছিল যা স্ট্রিংআইওর ক্ষেত্রে বিদ্যমান নেই

আপনি কোনও প্যারামিটারে ফর্ম্যাটটি সেট করে বিন্যাস সনাক্তকরণটিকে বাইপাস করতে পারেন

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

ধন্যবাদ. স্ট্রিংআইও - আমার যা প্রয়োজন তা ঠিক করে দেয়।
সর্বাধিক

সেভ () ইন্টারফেসটি টেনস্ট্রিং () ইন্টারফেসের চেয়ে অনেক বেশি পরিষ্কার হয় যখন এটি কোনও পিএনজি, জেপিইজি, বা প্রকৃত ফাইল ফর্ম্যাট পাওয়ার ক্ষেত্রে আসে।
কেকোয়া

13

আধুনিক সহ (২০১৩ সালের মাঝামাঝি পাইথন 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')

4
চিত্র_ডেটা = faux_file.getvalue () এর উদ্দেশ্য কী?
রায়ান

@ রায়ান ভাল ধরা, কোন উদ্দেশ্য নেই। এটি পরীক্ষা থেকে বাদ দেওয়া হয়েছিল এবং শেষ পর্যন্ত সরানো হয়েছে।
পারম্পিপাইল

9

আপনি যখন বলেন "আমি অভিধানে এই জাতীয় সংখ্যক সঞ্চিত ছবি রাখতে চাই", এটি মেমরির অন্তর্নিহিত কাঠামো কিনা তা পরিষ্কার নয়।

স্মৃতিতে কোনও চিত্র নম্র করতে আপনাকে এগুলির কোনও কিছুই করার দরকার নেই। কেবল imageআপনার অভিধানে অবজেক্টটি রাখুন।

আপনি যদি কোনও ফাইলটিতে আপনার অভিধান লিখতে চলেছেন তবে আপনি im.tostring()পদ্ধতি এবং Image.fromstring()ফাংশনটি সন্ধান করতে পারেন

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

im.tostring () => স্ট্রিং

স্ট্যান্ডার্ড "কাঁচা" এনকোডার ব্যবহার করে পিক্সেল ডেটাযুক্ত স্ট্রিংটি ফেরত দেয়।

Image.fromstring (মোড, আকার, ডেটা) => চিত্র

স্ট্রিংয়ের পিক্সেল ডেটা থেকে স্ট্যান্ডার্ড "কাঁচা" ডিকোডার ব্যবহার করে একটি চিত্র মেমরি তৈরি করে।

"ফর্ম্যাট" (.jpeg, .png, ইত্যাদি) কেবলমাত্র আপনি যখন ডিস্ক বিনিময় করছেন তখন ডিস্কে গুরুত্বপূর্ণ। আপনি যদি ফাইল বিনিময় না করে থাকেন তবে ফর্ম্যাটটিতে কিছু আসে যায় না।


4
দেখে মনে হচ্ছে তিনি পিএনজি ফর্ম্যাটটি ধরে রাখতে চান, এটিকে কাঁচা পিক্সেল ডেটাতে কমিয়ে দেবেন না।
বেন ফাঁকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.