我能够使用R提取所需信息,但为了项目整体的一致性,我希望能够使用Python(最好是Python3)来完成。 我需要获取名为“设置”的单个标签的内容。 该标签包含XML,然后需要进行解析。
在R中获取元数据非常容易:
library(exifr)
library(XML)
path = file.path('path', 'to', 'file')
x = read_exif(file.path(path,'image.png'))
x$Settings
看起来Python无法做到这一点,这让我感到困惑。或者这需要我比目前更了解Python和PNG。我该如何使用Python提取PNG元数据?
以下是我尝试过的方法列表:
PyPng PyPNG似乎很有前途。通过检查每个块的长度,"Settings"标签似乎位于zTXt块中。
import png
filename = "C:\\path\\to\\image.png"
im = png.Reader(filename)
for c in im.chunks():
print(c[0], len(c[1]))
>>>
IHDR 13
tIME 7
pHYs 9
IDAT 47775
zTXt 714
IEND 0
以上内容取自此文章。 然而,如何提取zTXt数据仍然不清楚。
hachoir3
使用hachoir3
包,我尝试了以下操作:
from hachoir.parser import createParser
from hachoir.metadata import extractMetadata
filename = "C:\\path\\to\\file\\image.png"
parser = createParser(filename)
metadata = extractMetadata(parser)
for line in metadata.exportPlaintext():
print(line)
这给了我以下结果:
Metadata:
- Image width: 1024 pixels
- Image height: 46 pixels
- Bits/pixel: 16
- Pixel format: RGB
- Compression rate: 2.0x
- Image DPI width: 1 DPI
- Image DPI height: 1 DPI
- Creation date: 2016-07-13 19:09:28
- Compression: deflate
- MIME type: image/png
- Endianness: Big endian
我似乎无法获取到我需要的字段,即R代码中引用的“设置”字段。我尝试了其他方法,如metadata.get
,但都没有成功。据我所知,这似乎是解析PNG元数据的两个选项。文档中写道:
一些不错的(但并非完美的;-))解析器:
Matroska视频Microsoft RIFF(AVI视频、WAV音频、CDA文件)PNG图片TAR和ZIP归档
也许它只是没有我需要的功能?
Pillow
遵循此帖子中的建议:
from PIL import Image
filename = "C:\\path\\to\\file\\image.png"
im = Image.open(filename)
这段代码读入了图片,但是im.info
只返回了{'aspect': (1, 1)}
。通过阅读文档,似乎没有任何方法可以获取到元数据。我阅读了这篇帖子中提供的PNG描述。老实说,我不知道如何利用它的信息,也不知道Pillow如何帮助我。
有些帖子暗示我需要的可以做到,但它们并没有起作用。例如,这个帖子建议使用ExifTags库:
from PIL import Image, ExifTags
filename = "C:\\path\\to\\file\\image.png"
im = Image.open(filename)
exif = { ExifTags.TAGS[k]: v for k, v in im._getexif().items() if k in ExifTags.TAGS}
问题在于,AttributeError: 'PngImageFile'对象没有属性'_getexif'
。根据文档,._getexif
特性是实验性的,并且仅适用于JPG。
通过整个Pillow文档的阅读,它似乎只涉及JPG和TIFF。处理PNG文件似乎根本不是该包的一部分。所以像hachoir
一样,也许这是做不到的吗?
PIL
显然还有另一个名为PIL的包,Pillow就是从中分叉出来的。看起来它在2009年就被放弃了。
zTXt
块,但其中只包含了该块中的配置文件,没有元数据。因此,我仍需要一个包含您设置的图像。 - Jongware