base64 URI 到 PNG-Python

base64 URI to PNG-Python

我正在尝试使用 "ReportLab" 通过 Python 生成 PDF,我想向其中添加图像。我必须使用的图像是 PNG,但它具有以下格式:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAH0CAYAAACuKActAAAgAEf (and it continues)

我不太清楚该怎么做,首先我认为我需要将该 URI 转换为图像,但我不知道该怎么做,然后使用类似的东西:

import Image
im = Image.open("infile.png")
im.save("outfile.jpg")

为了将 .PNG 转换为 .JPG。有人可以帮助我吗?

试试这个(编辑:感谢njzk2 指出删掉header):

import Image, io, base64

data = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="

im = Image.open(io.BytesIO(base64.b64decode(data.split(',')[1])))
im.save("image.jpg")

here 添加了一个用于测试的真实 base64 字符串,这应该会产生一个小红点的图像:

from base64 import b64decode
from io import BytesIO
from PIL import Image

img_data = 'data:image/jpeg;base64,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'

file_or_path = 'testing_image.jpg'
img_data += '=='

image = Image.open(BytesIO(b64decode(img_data.split(',')[1])))
image.save(file_or_path)