保存base64编码的图片-Python

9
我正在尝试使用Python保存Base64编码的图像。这里的字符串太长无法发布,但是此处是图片:enter image description here。当Python接收到此字符串时,最后两个字符是==,虽然字符串未经过格式化处理,因此我这样做:
import base64
data = "data:image/png;base64," + photo_base64.replace(" ", "+")

然后我这样做

imgdata = base64.b64decode(data)
    filename = 'some_image.jpg'  # I assume you have a way of picking unique filenames
    with open(filename, 'wb') as f:
            f.write(imgdata)

但是这会导致出现错误。
Traceback (most recent call last):
  File "/var/www/cgi-bin/save_info.py", line 83, in <module>
    imgdata = base64.b64decode(data)
  File "/usr/lib64/python2.7/base64.py", line 76, in b64decode
    raise TypeError(msg)
TypeError: Incorrect padding

一旦添加了data:image/png;base64,并用+替换了spaces,我还打印出了字符串的长度,其长度为34354。我尝试了许多不同的图像,但当我尝试打开保存的文件时,所有这些图像都会显示文件已损坏。

发生了什么事?为什么文件会损坏?

谢谢!

编辑

这里是一些失败的base64。

iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFA6b1q Ci5/f2lt/9yu3 Y8v2cMpb1/DSJbz5i9R2NLwfLrWbw m T8I8////////SvMAbAAAABB0Uk5T////////////////////AOAjXRkAAACYSURBVHjaLI8JDgMgCAQ5BVG3//9t0XYTE2Y5BPq0IGpwtxtTP4G5IFNMnmEKuCopPKUN8VTNpEylNgmCxjZa2c1kafpHSvMkX6sWe7PTkwRX1dY7gdyMRHZdZ98CF6NZT2ecMVaL9tmzTtMYcwbP y3XeTgZkF5s1OSHwRzo1fkILgWC5R0X4BHYu7t/136wO71DbvwVYADUkQegpokSjwAAAABJRU5ErkJggg==

这是我在POST请求中从Python脚本接收的内容。
注意,我没有用“+”替换空格。

你能添加一个小的样本吗?它是以base64编码的。使用非常小的图像(如favicon)。据我所知,在base64编码的图像中没有空格。 - Ali Nikneshan
那么为什么你使用"data:image/png;base64," + photo_base64.replace(" ", "+")而不是imgdata = base64.b64decode(photo_base64)呢? - Remi Guan
@KevinGuan 当我向Python脚本发送数据时,"+"会被替换为空格,因此我只是将“+”放回,并且Ali即将发布一些数据。 - spen123
@AliNikneshan发布了一些数据。 - spen123
1
你期望什么?Base64字符串中不能包含空格,而你的示例字符串中包含了它。如果我用“+”替换它,我会收到一些PNG In [13]: s.replace(' ', '+').decode('base64') Out[13]: '\x89PNG\r\n\x1a\n ... - Konstantin
显示剩余2条评论
2个回答

17

不需要在前面添加data:image/png;base64,我尝试使用下面的代码,它可以正常工作。

import base64
data = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFA6b1q Ci5/f2lt/9yu3 Y8v2cMpb1/DSJbz5i9R2NLwfLrWbw m T8I8////////SvMAbAAAABB0Uk5T////////////////////AOAjXRkAAACYSURBVHjaLI8JDgMgCAQ5BVG3//9t0XYTE2Y5BPq0IGpwtxtTP4G5IFNMnmEKuCopPKUN8VTNpEylNgmCxjZa2c1kafpHSvMkX6sWe7PTkwRX1dY7gdyMRHZdZ98CF6NZT2ecMVaL9tmzTtMYcwbP y3XeTgZkF5s1OSHwRzo1fkILgWC5R0X4BHYu7t/136wO71DbvwVYADUkQegpokSjwAAAABJRU5ErkJggg=='.replace(' ', '+')
imgdata = base64.b64decode(data)
filename = 'some_image.jpg'  # I assume you have a way of picking unique filenames
with open(filename, 'wb') as f:
        f.write(imgdata)

2
如果您将data:image/png;base64,添加到数据中,那么就会出现错误。如果您有这个问题,必须进行替换。
new_data = initial_data.replace('data:image/png;base64,', '')

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