বেস 64 এর সাথে একটি চিত্র ফাইল এনকোডিং


161

আমি বেস 64 মডিউলটি ব্যবহার করে একটি চিত্রকে একটি স্ট্রিংয়ে এনকোড করতে চাই। আমি যদিও একটি সমস্যায় পড়েছি। আমি যে চিত্রটি এনকোড করতে চাই তা কীভাবে নির্দিষ্ট করব? আমি ইমেজটিতে ডিরেক্টরি ব্যবহার করার চেষ্টা করেছি, কিন্তু এটি কেবল ডিরেক্টরিটি এনকোড হওয়ার দিকে নিয়ে যায়। আমি চাই প্রকৃত চিত্র ফাইলটি এনকোড করা হোক।

সম্পাদনা

আমি এই স্নিপেট চেষ্টা করেছিলাম:

with open("C:\Python26\seriph1.BMP", "rb") as f:
    data12 = f.read()
    UU = data12.encode("base64")
    UUU = base64.b64decode(UU)

    print UUU

    self.image = ImageTk.PhotoImage(Image.open(UUU))

তবে আমি নিম্নলিখিত ত্রুটি পেয়েছি:

Traceback (most recent call last):
  File "<string>", line 245, in run_nodebug
  File "C:\Python26\GUI1.2.9.py", line 473, in <module>
    app = simpleapp_tk(None)
  File "C:\Python26\GUI1.2.9.py", line 14, in __init__
    self.initialize()
  File "C:\Python26\GUI1.2.9.py", line 431, in initialize
    self.image = ImageTk.PhotoImage(Image.open(UUU))
  File "C:\Python26\lib\site-packages\PIL\Image.py", line 1952, in open
    fp = __builtin__.open(fp, "rb")
TypeError: file() argument 1 must be encoded string without NULL bytes, not str

আমি কি ভুল করছি?

উত্তর:


299

আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আমি ধরে নিই যে আপনি এর লাইনে কিছু করছেন:

import base64

with open("yourfile.ext", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

আপনাকে অবশ্যই প্রথমে ফাইলটি খুলতে হবে এবং এর সামগ্রীগুলি পড়তে হবে - আপনি সহজভাবে এনকোড ফাংশনের পথটি পাস করতে পারবেন না।

সম্পাদনা: ঠিক আছে, আপনি আপনার মূল প্রশ্নটি সম্পাদনা করার পরে এখানে একটি আপডেট।

প্রথমত, উইন্ডোজটিতে পাথ ডেলিমিটারগুলি ব্যবহার করার সময়, কাঁচা স্ট্রিংগুলি ('আর' দিয়ে স্ট্রিং উপসর্গ) ব্যবহার করা মনে রাখবেন, দুর্ঘটনাক্রমে একটি পালানোর চরিত্রটিকে আঘাত করা রোধ করতে। দ্বিতীয়ত, পিআইএল এর ইমেজ.ওপেন হয় কোনও ফাইলের নাম গ্রহণ করে বা একটি ফাইলের মতো (অর্থাত্‍, অবজেক্টটি পড়ার, সন্ধান করার এবং বলার পদ্ধতিগুলি সরবরাহ করতে হবে) গ্রহণ করে।

বলা হচ্ছে, আপনি মেমরি বাফার থেকে এই জাতীয় বস্তু তৈরি করতে সিস্ট্রিংআইও ব্যবহার করতে পারেন:

import cStringIO
import PIL.Image

# assume data contains your decoded image
file_like = cStringIO.StringIO(data)

img = PIL.Image.open(file_like)
img.show()

1
ধন্যবাদ, আমি ডিকোডেড চিত্রটি মুদ্রিত করার পরে আরও একটি সমস্যা পেয়েছি '' স্ট্রিং 'get যাইহোক, আমি যখন ডেটার বিকল্প হিসাবে এটি একা চালাই তখন আমি ত্রুটি পাই। এনকোডড স্ট্রিং তুলনা করার জন্য অনেক দীর্ঘ। সুতরাং আমি মনে করি যে সম্ভবত চিত্রের ডেটা সঞ্চয় করে। ডিকোডেড স্ট্রিংটি কি কেবল এনকোডযুক্ত স্ট্রিং বা অন্য কিছুকে রেফারেন্স করে? এটি ডেটা সঞ্চয় করার জন্য খুব ছোট বলে মনে হচ্ছে।
আয়তক্ষেত্রাকার

মুদ্রিত আউটপুট অগত্যা প্রকৃত সামগ্রীর সমান নয় - এটি আপনি কোথায় এবং কোথায় প্রিন্ট করবেন তার উপর নির্ভর করে।
জিম ব্রিসোম

8
আমার ক্ষেত্রে, আমাকে ডিকোড base64.b64encode(fh.read()).decode()করতে হবে : এইচটিএমএল ফাইলগুলিতে স্ট্রিং ব্যবহার করতে।
কিড

1
বেস64.b64encode (fh.read ())। ডিকোড () সূক্ষ্ম তবে আমার এটি প্রয়োজন যেমন @ কেড, ধন্যবাদ। পার্থক্য হ'ল এক রিটার্ন বাইট এবং অন্য স্ট্রিং ... এবং আমার এসওএপি সার্ভারটি ডিকোডিং ছাড়াই একে গ্রাস করবে না!
zzart

57

পাইথন ২.x এর সাহায্যে আপনি .encode ব্যবহার করে তুচ্ছভাবে এনকোড করতে পারেন:

with open("path/to/file.png", "rb") as f:
    data = f.read()
    print data.encode("base64")

12

প্রথম উত্তরটি উপসর্গ বি'র সাথে একটি স্ট্রিং মুদ্রণ করবে। তার মানে আপনার স্ট্রিংটি এই বাই'আর_ স্ট্রিংয়ের মতো হবে 'এই সমস্যাটি সমাধান করতে দয়া করে নীচের কোডটির লাইন যুক্ত করুন।

encoded_string= base64.b64encode(img_file.read())
print(encoded_string.decode('utf-8'))

2
এটি দেখতে ভাল উত্তর বলে মনে হচ্ছে তবে উদ্দেশ্য যদি আপনার ওয়েবসাইট প্রচার করা হয় তবে পোস্ট করা থেকে বিরত থাকুন। তবে আপনার প্রোফাইলে লিঙ্ক যুক্ত করতে আপনাকে স্বাগতম।
অর্ধেক

1
(প্রসঙ্গক্রমে, উত্তর আদেশ এখানে নির্ভর করা যায় না, সুতরাং এটি "প্রথম উত্তর" এর মতো মন্তব্য এড়ানো উচিত। প্রথম যে প্রদর্শিত হবে সময়ের সাথে সাথে তা পরিবর্তিত হতে পারে :-)))
আধাপিক

এই উত্তরের আপনার আসল সংস্করণে দেখে মনে হচ্ছে আপনি নিজের সাইট বা আপনার সাথে অনুমোদিত কোনও সাইটের সাথে লিঙ্ক করেছেন। আপনি যদি এই জাতীয় সাইটের সাথে লিঙ্ক করেন তবে আপনাকে অবশ্যই প্রকাশ করতে হবে যে এটি আপনার সাইট । আপনি যদি অনুমোদিততা প্রকাশ না করেন তবে এটি স্প্যাম হিসাবে বিবেচিত হবে। দেখুন: "ভাল" স্ব প্রচারের কী বোঝায়? এবং স্ব-প্রচারে সহায়তা কেন্দ্র । প্রকাশ অবশ্যই স্পষ্ট হওয়া উচিত, তবে আনুষ্ঠানিক হওয়ার দরকার নেই। এটা আপনার নিজের যখন ব্যক্তিগত সামগ্রী, এটা ঠিক ভালো কিছু হতে পারে, "আমার ব্লগে ...", ইত্যাদি "আমার সাইট ... এ"
Makyen

@ ম্যাকায়েন পরামর্শ দেওয়ার জন্য ধন্যবাদ আমি প্রকাশ করতে যাচ্ছি যে এটি আমার সাইট। উত্তরটি এখনই সম্পাদন করা আইনসম্মত হবে কি তা প্রকাশ করার জন্য যে এটি আমার সাইট? অথবা আমার এটি সম্পাদনা করা উচিত নয়।
কোডস্পিডে

9

যেমনটি আমি আপনার আগের প্রশ্নে বলেছি, স্ট্রিংটিকে এনকোড করার দরকার নেই 64, এটি কেবল প্রোগ্রামটিকে ধীর করে দেবে। শুধু repr ব্যবহার করুন

>>> with open("images/image.gif", "rb") as fin:
...  image_data=fin.read()
...
>>> with open("image.py","wb") as fout:
...  fout.write("image_data="+repr(image_data))
...

এখন চিত্রটি একটি নতুন ভোক্তা শুরু করুন এবং চিত্র_ডেটাকে আমদানি image_dataকরুন বলে একটি ফাইল হিসাবে পরিবর্তনীয় হিসাবে সংরক্ষণ করা হয়image.py

>>> from image import image_data
>>>

আমি সত্যিই দেখতে পাচ্ছি না যে এখানে repr () এর কোনও ব্যবহার হতে পারে।
আইভো ভ্যান ডের উইজক

6
@ আইভো, অ্যান্টিটার পাইথন ফাইলগুলিতে চিত্রগুলি সঞ্চয় করতে সক্ষম হতে চায়। আমি উল্লেখ করছি যে বেস 64 ব্যবহার করা বিপরীত কারণ কারণ মডিউলটি লোড হওয়ার সময় ডেটা ডিকোড করা দরকার। এর পরিবর্তে পুনরায় ব্যবহারের অর্থ হ'ল আক্ষরিক স্ট্রিংটি কোনও ফিউথার প্রসেসিং ছাড়াই .pyc ফাইলটিতে তাত্ক্ষণিকভাবে ব্যবহারের জন্য প্রস্তুত থাকে
জন লা

7

ইভো ভ্যান ডের উইজক এবং জিনব্লার এর আগে যে বিকাশ করেছে তা থেকে ধার নেওয়া , এটি একটি গতিশীল সমাধান

import cStringIO
import PIL.Image

image_data = None

def imagetopy(image, output_file):
    with open(image, 'rb') as fin:
        image_data = fin.read()

    with open(output_file, 'w') as fout:
        fout.write('image_data = '+ repr(image_data))

def pytoimage(pyfile):
    pymodule = __import__(pyfile)
    img = PIL.Image.open(cStringIO.StringIO(pymodule.image_data))
    img.show()

if __name__ == '__main__':
    imagetopy('spot.png', 'wishes.py')
    pytoimage('wishes')

এরপরে আপনি আউটপুট ইমেজ ফাইলটি ঠাণ্ডা করার জন্য সাইথনের সাথে সংকলন করার সিদ্ধান্ত নিতে পারেন । এই পদ্ধতির সাহায্যে আপনি আপনার সমস্ত গ্রাফিক্সকে একটি মডিউলে বান্ডিল করতে পারেন।


7
import base64
from PIL import Image
from io import BytesIO

with open("image.jpg", "rb") as image_file:
    data = base64.b64encode(image_file.read())

im = Image.open(BytesIO(base64.b64decode(data)))
im.save('image1.png', 'PNG')

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