1. ホーム
  2. パイソン

[解決済み】画像ファイルをbase64でエンコードする

2022-04-10 02:17:57

質問

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

EDIT

このスニペットを試してみました。

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

何が間違っているのでしょうか?

どうすればいいですか?

質問の意味がよくわからないのですが。私は、あなたが以下のようなことを行っていると仮定します。

import base64

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

もちろん、まずファイルを開いてその中身を読まなければならない。単にパスをエンコード関数に渡すことはできない。

編集してください。 OK、最初の質問を編集した後のアップデートです。

まず、Windowsでパスの区切り文字を使うときは、誤ってエスケープ文字を打ってしまわないように、生の文字列(文字列の前に'r'を付ける)を使うことを覚えておいてください。次に、PILのImage.openは、ファイル名か、ファイルのようなもの(つまり、オブジェクトはread, seek, tellメソッドを提供しなければならない)を受け取ります。

とはいえ、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()