将base64字符串转换为图片并保存

4
我正在尝试将base64图像数据转换为图像文件并保存。
base64_image_str = request.POST.get('base64_image_str')
# it is smthg like: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDA......."

with open("newimage.png", "wb") as f:
    f.write(base64_image_str.decode('base64'))
    f.close()

也尝试过:

f = open("newimage.png", "wb")
f.write(decodestring(base64_image_str))
f.close()

图片正在保存,但它已经损坏并且无法打开。我做错了什么?


1
你需要摆脱POST数据中的头部信息。 - Ashwini Chaudhary
@AshwiniChaudhary 什么头文件?如何实现? - doniyor
在第一种情况下,当您使用“with”时,无需显式关闭该文件,一旦您移出缩进块,它将自动关闭,并建议您创建一个新文件以保存解码后的新图像(删除“data:image/jpeg;base64,”),看看是否有帮助? - ZdaR
这是一个更清晰的答案,附带完整的工作示例。https://stackoverflow.com/questions/30267199/downloading-image-data-uris-from-webpages-via-beautifulsoup - Diego Suarez
2个回答

8

字符串的开头到第一个逗号之间的信息是通过POST数据添加的,因此不属于文件的base64编码的一部分。因此,在解码之前,请先将其删除。


我以为“decodestring”会解决这个问题,难道不是吗? - doniyor
5
如果是这样的话,你会在这里吗? - Scott Hunter
1
该死,我不知道。基本上应该是Base64解码器的工作。现在它可以工作了。在StackOverflow的所有答案中,我都没有看到一个与此相关的问题或答案。所以我认为如果我解码,它会自动完成。 - doniyor
如果解码按照您的建议进行,那么对于不是来自POST请求的base64编码,它将失败。 - Scott Hunter

4
正如您所看到的,真实图像数据以逗号开头,您应该剥离掉剩余部分。
base64_image_str = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDA......."

base64_image_str = base64_image_str[base64_image_str.find(",")+1:]

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