如何从此网站这样的图像中提取元数据?我使用过 exev2 库,但与该网站相比,它仅提供有限的数据。有没有更高级的库?
我已经尝试过 hacoir-metadata Python 库。
Windows 如何提取图像的细节(我们从属性中看到的细节)?
PNG 文件由块组成,其中大部分是 IDAT 块,其中包含普通 PNG 中的压缩像素数据。所有 PNG 均以 IHDR 块开始并以 IEND 块结束。由于 PNG 在这方面是一个非常灵活的标准,因此可以通过组成新类型的块来扩展它——这就是动画 PNG 的工作原理。所有浏览器都可以看到第一帧,但了解 APNG 中使用的块类型的浏览器可以看到动画。
PNG 图像中可以存放文本数据的地方很多,元数据可以存放的地方甚至更多。 这是一个非常方便的总结。您提到了“描述标签”,它只能存在于文本块中,所以这是我将重点关注的。
PNG 标准包含三种不同类型的文本块:tEXt(Latin-1 编码,未压缩)、zTXt(压缩,也是 Latin-1),最后是 iTXt,这是这三种类型中最有用的因为它可以包含 UTF-8 编码文本并且可以压缩或解压缩。
所以,你的问题变成了,“提取文本块的便捷方法是什么?”
一开始我以为pypng可以做到这一点,但它不能:
tEXt/zTXt/iTXt
阅读时忽略。未生成。
幸运的是,Pillow 对此提供了支持 - 幽默地它是在您提出最初问题的前一天添加的!
所以,事不宜迟,让我们找到一个包含 iTXt 块的图像:这个示例 应该这样做。
>>> from PIL import Image
>>> im = Image.open('/tmp/itxt.png')
>>> im.info
{'interlace': 1, 'gamma': 0.45455, 'dpi': (72, 72), 'Title': 'PNG', 'Author': 'La plume de ma tante'}
对于更一般的情况,查看其他阅读器,JPEG 和 GIF 似乎也很好地覆盖了这些格式 - 所以我会推荐 PIL。这并不是说
hacoir-metadata
的维护者不会欣赏添加文本块支持的拉取请求! :-)
我发现这段代码埋在 Pillow Pull 请求中
from PIL import PngImagePlugin
info = PngImagePlugin.PngInfo() # read PNG data
info.add_text("foo", "bar") # write PNG data
img.save(filenew, "png", pnginfo=info)
您可以尝试 Daniel Chesterton 的这个 pre-alpha 解决方案。我不确定这正是您想要的还是想要的解决方案的一部分,但我相信您可以通过使用它来解决它。
您可以使用 Pillow 的某些功能来执行此操作。例如,使用 GIMP 设置 PNG 标题元数据后,您可以使用 Pillow 提取它:
from PIL import Image
filename = 'filename.png'
im = Image.open(filename)
x = im.getxmp()
title = x['xmpmeta']['RDF']['Description']['title']['Alt']['li']['text']
请注意,这需要安装可选的依赖项
defusedxml
。
其他元数据也在那里。另请参阅
getexif()
方法。
参考:https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.getxmp