【问题标题】:How do I save custom information to a PNG Image file in Python?如何在 Python 中将自定义信息保存到 PNG 图像文件?
【发布时间】:2020-02-12 09:27:45
【问题描述】:

我想在 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 还是很陌生,所以如果我遗漏了文档中一些更熟练的编码人员会识别的明显内容,我深表歉意。如果解决方案已经存在,我真的不想重新发明轮子。

【问题讨论】:

    标签: python png metadata exif


    【解决方案1】:

    您可以使用 PngImagePlugin 模块中的 PngImageFilePngInfo 将元数据存储在 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'}
    

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

    【讨论】:

    • 谢谢你这完全符合我的需要。似乎使用 PIL.Image 打开的任何 PNG 的行为都足以像 PngImageFile 那样使用 pnginfo 参数调用 save 方法来存储新数据。正如您所指出的,我也可以从打开的图像的 .text 参数中检索旧数据。
    • 这太棒了! imageiocv2 也可以吗?
    • @Meredith imageio 确实有一个用于元数据的Writer,但我不知道是否支持将 EXIF 数据写入 PNG 图像。
    • imageio中写png好像还没有实现。尽管您可以在通过其“元”属性加载图像时访问元数据。现在我最终使用PIL 写作和imageio 加载,这让我有点不开心。
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2019-07-09
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多