不同base64的Pillow编码和解码结果



我正在尝试从base64转换为PIL图像,并将PIL图像转换为base64。我正在使用这些脚本。

def convert_base64_2_pil_image(image_b64: bytes) -> Image:
image_str = base64.b64decode(image_b64)
return Image.open(io.BytesIO(image_str))

def convert_pil_image_2_base64(image: Image, format: str = 'PNG') -> bytes:
buffered = io.BytesIO()
image.save(buffered, format=format)
buffered.seek(0)
return base64.b64encode(buffered.getvalue())

当我尝试将一个base64字符串转换为PIL映像并再次将该PIL映像转换为base64时,base64字符串不相同。我正在丢失一些信息。

image_b64 = b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=='
image = convert_base64_2_pil_image(image_b64)
image_b64_converted = convert_pil_image_2_base64(image)
assert image_b64_converted == image_b64

如何解决此问题?

您的base-64字符串不同并不一定意味着您丢失了信息。如果你想要更好的分析/答案,你需要以精确的原始形式提供你的图像和base-64表示,可能是通过DropboxGoogle Drive,因为大多数网站都会删除图像中影响base-64表达的地理和其他信息。

因此,回到你的问题,有几种可能的解释可以解释为什么base-64表示可能不同:

  • 首先,PNG图像通常包括最后一次更改的日期/时间作为辅助time块,因此仅在1秒后打开并重新保存一个纯黑图像就可以更改base-64表示

  • 其次,尽管无损,但不能保证两个库在比特深度、调色板、alpha、滤波等方面会做出相同的决定。例如,一个库可以选择将具有有限颜色的图像保存为调色板图像,而另一个库则可以选择RGB表示,另一个则可以选择RGBA表示。请参见此处。一个可以选择每个样本8位的PNG,另一个可以每个样本16位的PNG。

最新更新