无法将Base64字符串转换为图像

n53p2ov0  于 2022-10-02  发布在  Python
关注(0)|答案(2)|浏览(320)

谁能帮我把this base64 data变成图像?我不知道是因为数据没有正确解码,还是其他什么原因。以下是我对数据进行解码的方式:

import base64

c_data = { the data in the link (string type) }

c_decoded = base64.b64decode(c_data)

但它给出了错误的填充,所以我遵循了一些教程,并尝试了不同的方法来解码数据。

c_decoded = base64.b64decode(c_data + '=' * (-len(c_data) % 4))

c_decoded = base64.b64decode(c_data + '=' * ((4 - len(c_data) % 4) % 4)

这两种方法都是在没有错误填充的情况下对数据进行解码,但现在我无法将解码后的数据转换为图像。
我尝试创建一个空的PNG,然后将解码的数据写入其中:

from PIL import Image

with open('c.png', 'wb') as f:
    f.write(c_decoded)
image = Image.open('c.png')
image.show()

它不起作用并给出错误:无法识别图像文件‘c.png’
我尝试过使用BytesIO:

from PIL import Image
import io
from io import BytesIO

image = Image.open(io.BytesIO(c_decoded))
image.show()

现在它给出错误:无法识别图像文件<_io.BytesIO对象位于0x0000024082B20270>
请帮帮我。

w6lpcovy

w6lpcovy1#

不确定您是否确实需要一个Python解决方案,或者您只是想像您问题的第一行所说的那样,需要帮助解码您的图像,并且您认为可能需要Python。

如果是后者,只需在终端使用ImageMagick即可:

cat YOURFILE.TXT | magick inline:- result.png

或等同地,避免*“无用的猫”*:

magick inline:- result.png < YOURFILE.TXT

如果是前者,您可以使用如下代码(未经测试):

from urllib import request

with request.urlopen('data:image/png;base64,iVBORw0...')  as response:
   im = response.read()

现在im包含PNG编码的[^1]图像,因此您可以按如下方式保存到磁盘:

with open('result.png','wb') as f:
    f.write(im)

或者,您可以将其 Package 在BytesIO中,然后打开到PIL Image中:

from io import BytesIO
from PIL import Image

pilImage = Image.open(BytesIO(im))

[^1]:请注意,我盲目地假设它是PNG,它可能是JPEG,所以理想情况下,您应该查看DataURI的开头,以确定用于保存文件的合适扩展名。

kmbjn2e3

kmbjn2e32#

感谢@jps解释了为什么我的代码不能工作。查看@Mark Setchell解决方案,了解解码Base64数据的可靠方法(他的代码修复了@JPS指出的我的错误)

因此,基本上删除了Base64字符串开头的[Data:Image/png;Base64,],因为它只是数据的格式。更改这一点:

c = "data:image/png;base64,iVBORw0KGgoAAAANSUh..."

对此:

c = "iVBORw0KGgoAAAANSUh..."

现在我们可以利用

c_decoded = base64.b64decode(c)

相关问题