如何将自定义信息保存到 Python 中的 PNG 图像文件?

How do I save custom information to a PNG Image file in Python?

我想在 Python 中打开 PNG 图像,向其中添加一些自定义数据,保存图像文件,稍后再次打开它以检索数据。我在 Python 3.7 中工作。我更愿意使用 PNG 图像格式,但如果没有其他选择,我可以改用另一种格式。

在更新 PNG 标准以允许在其中存储自定义数据之前,我已经阅读了很多过时的答案和文章。我想要一个关于今天(2019 年 10 月)可用内容的答案,或者当然,如果启用了一些有用的东西,我会在未来接受更新的答案。确实很难搜索此类特定问题,因为 "save"、"png"、"python"、"info" 都是非常通用的术语。


我可以使用 Pillow(目前为 6.2.0)检索一些数据。我无法解决的是如何将更多的 exif 数据存储到 png。

from PIL import image
targetImage = Image.open("pathToImage.png")
targetImage.info["MyNewString"] = "A string"
targetImage.info["MyNewInt"] = 1234
targetImage.save("NewPath.png")

上面保存时丢失了信息。我看过一些使用 targetImage.save("NewPath.png", exif=exif_bytes) 的文档,但它只适用于 exif 格式的数据。我查看了 piexifpiexif2 包,但它们要么只支持 JPEG,要么不允许自定义数据。

我不介意信息在 PNG 中是否存储为 iTXt、tEXt 或 zTXt 块。有关格式的说明,请参阅 https://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_PNG_files


我是 Python 的新手,所以如果我遗漏了文档中一些明显的内容,而这些内容是经验丰富的编码人员会认识到的,我深表歉意。如果解决方案已经存在,我真的不想重新发明轮子。

您可以像这样使用 PngImagePlugin.PngInfo 在 Pillow 中存储元数据:

from PIL import Image
from PIL.PngImagePlugin import PngInfo

targetImage = Image.open("pathToImage.png")

metadata = PngInfo()
metadata.add_text("MyNewString", "A string")
metadata.add_text("MyNewInt", str(1234))

targetImage.save("NewPath.png", pnginfo=metadata)
targetImage = Image.open("NewPath.png")

print(targetImage.text)

>>> {'MyNewString': 'A string', 'MyNewInt': '1234'}

在这个例子中我使用的是 tEXt,但您也可以使用 add_itxt.

将其另存为 iTXt