从PNG图像中提取元数据

时间:2014-07-27 16:44:20

标签: php image image-processing imagemagick metadata

如何从像this website这样的图像中提取元数据?我使用过exev2库,但与本网站相比,它只提供有限的数据。有没有更高级的图书馆?

我已经尝试过hacoir-metadata Python库。

Windows如何提取图像的细节(我们从属性中看到的)?

3 个答案:

答案 0 :(得分:5)

PNG文件由块组成,其中大多数是IDAT块,其中包含平均PNG中的压缩像素数据。所有PNG都以IHDR块开头,以IEND块结束。由于PNG是一种非常灵活的标准,因此可以通过组合新类型的块来扩展它 - 这就是动画PNG的工作原理。所有浏览器都可以看到第一帧,但了解APNG中使用的块类型的浏览器可以看到动画。

有很多地方可以将文本数据存储在PNG图像中,甚至可以存储元数据的更多位置。 Here is a very convenient summary.您提到了“描述标记”,它只能存在于文本块中,所以我会专注于它。

PNG标准包含三种不同类型的文本块: tEXt (Latin-1编码,未压缩), zTXt (压缩,也是Latin-1),最后 iTXt ,这是三者中最有用的,因为它可以包含UTF-8编码的文本,可以压缩或解压缩。

所以,你的问题变成了“提取文本块的简便方法是什么?”

起初,我认为pypng可以做到这一点,but it cannot

  

文字/ zTXt / iTXt

     

阅读时忽略。没有生成。

幸运的是,Pillow对此表示支持 - 幽默it was added only one day before you asked your original question

所以,不用多说,让我们找一个包含iTXt块的图像:this example应该这样做。

>>> 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。这并不是说hacoir-metadata的维护者不会欣赏添加文本块支持的拉取请求! : - )

答案 1 :(得分:0)

你可以试试Daniel Chesterton的这个pre-alpha解决方案。我不确定这只是你想要的,还是它是有用解决方案的一部分,但我相信你可以通过玩它来解决它。

https://github.com/dchesterton/image

答案 2 :(得分:0)

我发现此代码埋在Pillow pull request

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