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

Taf*_*afT 8 python png exif metadata

我想在 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")
Run Code Online (Sandbox Code Playgroud)

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

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


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

Jon*_*tra 13

您可以使用PngImageFilePngInfoPngImagePlugin模块将元数据存储在 Pillow 中,如下所示:

from PIL.PngImagePlugin import PngImageFile, PngInfo

targetImage = PngImageFile("pathToImage.png")

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

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

print(targetImage.text)

>>> {'MyNewString': 'A string', 'MyNewInt': '1234'}
Run Code Online (Sandbox Code Playgroud)

在本例中,我使用 tEXt,但您也可以使用 .tEXt 将其另存为 iTXt add_itxt

  • 谢谢,这完全符合我的需要。似乎任何用 PIL.Image 打开的 PNG 都会像 PngImageFile 一样,调用带有 `pnginfo` 参数的 save 方法来存储新数据。正如您所指出的,我也可以从打开图像的 .text 参数中检索旧数据。 (2认同)
  • 在`imageio`中写入png似乎还没有实现。尽管您可以在通过“meta”属性加载图像时访问元数据。现在我最终使用“PIL”进行写入,使用“imageio”进行加载,这让我有点不高兴。 (2认同)