web-dev-qa-db-ja.com

base64で画像ファイルをエンコードする

Base64モジュールを使用して画像を文字列にエンコードしたい。しかし、私は問題に遭遇しました。エンコードする画像を指定するにはどうすればよいですか?ディレクトリをイメージに使用してみましたが、それは単にディレクトリがエンコードされることにつながります。実際の画像ファイルをエンコードしたい。

編集

私はこのスニペットを試しました:

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

何が間違っていますか?

132
rectangletangle

あなたの質問を理解したかどうかわかりません。私はあなたが次のラインに沿って何かをしていると仮定します:

import base64

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

もちろん、最初にファイルを開いてその内容を読む必要があります-単純にパスをエンコード関数に渡すことはできません。

編集: OK、元の質問を編集した後の更新です。

まず、Windowsでパス区切り文字を使用するときは、誤ってエスケープ文字にヒットしないように、生の文字列(文字列の先頭に 'r')を使用することを忘れないでください。第二に、PILのImage.openは、ファイル名またはファイルのようなもの(つまり、オブジェクトが読み取り、シーク、および通知メソッドを提供する必要がある)を受け入れます。

そうは言っても、cStringIOを使用して、メモリバッファからそのようなオブジェクトを作成できます。

import cStringIO
import PIL.Image

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

img = PIL.Image.open(file_like)
img.show()
244
Jim Brissom

python 2.xでは、.encodeを使用して簡単にエンコードできます。

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

前の質問で述べたように、文字列をbase64でエンコードする必要はありません。プログラムを遅くするだけです。 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というファイルに保存されます。新しいインタープリターを起動してimage_dataをインポートします

>>> from image import image_data
>>>
10
John La Rooy

Ivo van der Wijk および gnibbler が以前に開発したものを借りて、これは動的なソリューションです

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 __== '__main__':
    imagetopy('spot.png', 'wishes.py')
    pytoimage('wishes')

その後、出力イメージファイルを Cython でコンパイルして、クールにすることができます。この方法を使用すると、すべてのグラフィックを1つのモジュールにバンドルできます。

6
iChux

最初の答えは、接頭辞b 'の文字列を出力します。つまり、文字列は次のようになります。b'your_string 'この問題を解決するには、次のコード行を追加してください。

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