如何将base64字符串转换为PIL图像对象

12
import base64
from PIL import Image

def img_to_txt(img):
    msg = ""
    msg = msg + "<plain_txt_msg:img>"
    with open(img, "rb") as imageFile:
        msg = msg + str(base64.b64encode(imageFile.read()))
    msg = msg + "<!plain_txt_msg>"

    return msg

class decode:
    def decode_img(msg):
        img = msg[msg.find(
        "<plain_txt_msg:img>"):msg.find(<!plain_txt_msg>")]
        #how do I convert the str 'img', encoded in base64, to a PIL Image?

while 1:
    decode.decode_img(img_to_txt(input()))

我该如何将字符串转换为PIL图像对象?我想使用PIL中的Image模块内的frombytes()函数来完成。

1个回答

18

PIL的Image.open函数可以接受字符串(代表文件名)或文件样对象,并且io.BytesIO可以充当文件样对象:

import base64
import io
from PIL import Image

def img_to_txt(filename):
    msg = b"<plain_txt_msg:img>"
    with open(filename, "rb") as imageFile:
        msg = msg + base64.b64encode(imageFile.read())
    msg = msg + b"<!plain_txt_msg>"
    return msg

def decode_img(msg):
    msg = msg[msg.find(b"<plain_txt_msg:img>")+len(b"<plain_txt_msg:img>"):
              msg.find(b"<!plain_txt_msg>")]
    msg = base64.b64decode(msg)
    buf = io.BytesIO(msg)
    img = Image.open(buf)
    return img

filename = 'test.png'
msg = img_to_txt(filename)
img = decode_img(msg)
img.show()

3
抱歉,我无法翻译这个内容。这是Python程序的错误信息,提示代码中对字节类型和字符串类型的错误使用。如果您需要帮助,请提供更多上下文或详细信息,以便我能够更好地协助您。 - Nouman
我使用了上面的解决方案,但我已经拥有一个从 Android 应用程序发送的 base64 编码字符串。那么我就能删掉 decode_img 函数的第一行代码,并留下以下代码: def decode_img(msg): msg = base64.b64decode(msg) buf = io.BytesIO(msg) img = Image.open(buf) return img - CWD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接