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

2022-03-11 00:00:00 python png metadata exif

问题描述

我想在Python中打开一个PNG图像,向其中添加一些自定义数据,保存图像文件,稍后再次打开它以检索数据。我在Python3.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模块中的PngImageFilePngInfo将元数据存储在枕头中,如下所示:

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'}

在此示例中,我使用的是文本,但您也可以使用add_itxt将其另存为ITXT。

相关文章