从PNG图像中提取元数据

4
如何从图像中提取元数据,就像this website这个网站一样?我已经使用了exev2库,但是与这个网站相比,它只提供了有限的数据。是否有更高级的库可用?
我已经尝试过hacoir-metadata Python库。
另外,Windows如何提取图像的详细信息(我们从属性中看到的那些)?

你是想用特定的编程语言来实现这个吗? - gtmtg
不,任何语言的工具都无法帮助 :) - Abhay Sood
请查看右侧的相关问题,例如:https://dev59.com/km_Xa4cB1Zd3GeqP7PzL?rq=1 - gtmtg
使用 jhead - http://www.sentex.net/~mwandel/jhead/ - Mark Setchell
谢谢,我会去看看! - Abhay Sood
你打算和我们分享这样的图片吗? - Mark Setchell
3个回答

10
PNG文件由多个块组成,其中大部分是IDAT块,包含平均PNG中的压缩像素数据。所有PNG都以IHDR块开头,以IEND块结尾。由于PNG在这方面非常灵活,可以通过制作新类型的块来扩展它 - 这就是动画APNG的工作原理。所有浏览器都可以看到第一帧,但了解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'}

根据源代码,tEXtzTXt也被覆盖了。
对于更一般的情况,查看其他读者,JPEG和GIF也似乎具有这些格式的良好覆盖率,因此我建议使用PIL。这并不意味着的维护者不希望添加文本块支持的拉取请求! :-)

谢谢Fredrick!那是一个好的解决方案。等待看看是否有更好的解决方案。否则,这似乎很有前途。 - Airy

1

我在Pillow拉取请求中发现了这段被埋藏的代码。

from PIL import PngImagePlugin
info = PngImagePlugin.PngInfo() # read PNG data
info.add_text("foo", "bar") # write PNG data
img.save(filenew, "png", pnginfo=info)

0

你可以尝试一下Daniel Chesterton的这个预阿尔法解决方案。我不确定它是否完全符合你的要求或者是否是你想要的解决方案的一部分,但我相信你可以通过尝试来搞清楚。

https://github.com/dchesterton/image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接