问题:如何在 Python 中将自定义信息保存到 PNG 图像文件中?

我想在 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。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐