使用Python PIL将图像转换为Base64

4
以下代码抛出了一个错误:Error with file: string argument expected, got 'bytes' 我还尝试使用BytesIO,但它抛出了一个关于需要string格式而不是bytes的错误。非常令人困惑。
def im_2_b64(image):
    buffer = StringIO()
    image.save(buffer, format="JPEG")
    img_str = base64.b64encode(buffer.getvalue())
    return img_str

我该如何使用python 2.7将图像转换为base64格式?

更新

Error with file: Object of type bytes is not JSON serializable
Error with file: single positional indexer is out-of-bounds

使用 BytesIO


@PM 2Ring,是的,没错。 - Jeff Voss
2
在这种情况下,只要我将 StringIO() 更改为 BytesIO(),那段代码对我来说就可以正常工作。你确定你是在 Python 2 上运行它吗? :) 实际上,在 Python 3 中也可以正常工作。 - PM 2Ring
2
顺便提一下,在Python 2中,buffer不是一个很好的变量名,因为它会与内置的buffer类型发生冲突。 - PM 2Ring
2
关于您的编辑,错误发生在哪里?我不认为它发生在您向我们展示的代码中。 - ubadub
1
你之前没有提到过JSON!而且那个错误信息明确表明你正在使用Python 3。 - PM 2Ring
显示剩余3条评论
2个回答

14

这是一个简短但完整的演示,使用ByteIO而不是StringIO。我还添加了一个函数来进行反向转换。它在Python 2.6和3.6上都可以正确运行。唯一的区别是,在Python 3中,Base64输出是一个b字符串。

from PIL import Image
from io import BytesIO
import base64

# Convert Image to Base64 
def im_2_b64(image):
    buff = BytesIO()
    image.save(buff, format="JPEG")
    img_str = base64.b64encode(buff.getvalue())
    return img_str

# Convert Base64 to Image
def b64_2_img(data):
    buff = BytesIO(base64.b64decode(data))
    return Image.open(buff)

# Test

img = Image.new('RGB', (120, 90), 'red')
img.show()

img_b64 = im_2_b64(img)
print(img_b64)

new_img = b64_2_img(img_b64)
new_img.show()

Python 3 的输出

b'/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABaAHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDi6KKK+ZP3EKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k='

1
StackOverflow上的最佳答案 - Hvitis

0
你可以使用这个函数将图片转换为base64字符串。
import base64

def image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
        return encoded_string

base64String = image_to_base64('image.jpg')

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