2017-02-28 4 views
3

過去数時間私はイメージのBase64文字列を作成しようとしていましたが、動作しません。PILイメージをBase64でエンコードされた文字列として取得する方法

ship_color = (0,100,100,255) 
img = Image.new("RGBA", (100,100)) 
for i in range(20): 
    for j in range(20): 
     img.putpixel((40 + i, 40 + j), ship_color) 
img.save("tmp.png", format = "PNG") 
im = open("tmp.png", "rb").read() 
print(im) 
base = base64.b64encode(im) 
print(base) 

私は再び文字列からイメージを作成しようとすると、私は例外を取得:Base64でのデコーディングのための

img2 = Image.frombytes("RGBA", (100, 100), base) 
ValueError: not enough image data 

その他のオンラインサービスもエラーを与えるので、Base64文字列自体はしていないようです正しい。

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\x00\x00\x00d\x08\x02\x00\x00\x00\xff\x80\x02\x03\x00\x00\x00lIDATx\x9c\xed\xd0\xd1\t\x800\x10\x05\xc1h\xad)+\xc5Z\xc3\x8a\x10"3\xff\xc7;v\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008\xc7\xb5my\xce\xf7\xb7k}\xf7GpoY=\x94X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x81X\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0S\x0fX\xb7\x02(\x90HP\xa2\x00\x00\x00\x00IEND\xaeB`\x82' 

例Base64文字列:(オープン()(読み取り)から)

例えば画像列

b'iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAAbElEQVR4nO3Q0QmAMBAFwWitKSvFWsOKECIz/8c7dgwAAAAAAAAAAAAAADjHtW15zve3a333R3BvWT2UWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgVgAAAAAAAAAAAAAAPBTD1i3AiiQSFCiAAAAAElFTkSuQmCC' 
+0

で、メモリ・ファイルで使用して一時ファイルを作成せずにこれを達成することができますか –

+0

@AlastairMcCormackは、画像をエンコードするために 'base64.b64decode(im)'を使っていると言っています。 – Robert

+0

@ロベルト私の悪い、間違った方法^^まだb64encodeは同じ例外を与えます –

答えて

4

あなたがデコードできる前エンコードをbase64でする必要があります。

あなたはどこに**エンコード**あなたのデータをbase64でビットだ?io.BytesIO()

in_mem_file = io.BytesIO() 
img.save(in_mem_file, format = "PNG") 
# reset file pointer to start 
in_mem_file.seek(0) 
img_bytes = in_mem_file.read() 

base64_encoded_result_bytes = base64.b64encode(img_bytes) 
base64_encoded_result_str = base64_encoded_result_bytes.decode('ascii') 
+0

ありがとう私は今働いている。最終的に問題は、Pythonのバイト表現のb "プレフィックスでしたので、最初に文字列に変換して最初の数文字を切り落とす必要がありました。好奇心旺盛な人のための : 'ベース= base64.b64encode(IM) base.decode() ベース= STR(ベース) ベース=ベース[2:LEN(ベース) - 1]' はありません –

+0

私のためにそれをやりました、いいえ。それは間違ったやり方です。 'ascii'を使ってバイトオブジェクトをテキストとして 'decode()'するだけでいいです。結果はstrです。更新された回答をご覧ください。 –

0

Image.frombytes() base64でエンコードされた文字列から画像を作成しない、documentation参照。

あなたはエンコーディングを逆にしたい場合は、使用:

img2 = base64.b64decode(base) 
関連する問題