我能够使用R提取必要的信息,但为了整体项目的一致性,我希望能够用Python(最好是Python3)来实现。我需要一个名为" Settings"的单个标签的内容。此标记包含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看起来很有希望。检查每个块的长度,似乎可能是"设置"标签存在于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
以上摘自this post。但是,目前还不清楚如何提取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存档
也许它没有我需要的功能?
枕
遵循此post中的建议:
from PIL import Image
filename = "C:\\path\\to\\file\\image.png"
im = Image.open(filename)
这会读取图片,但im.info
只会返回{'aspect': (1, 1)}
。通过阅读文档,它看起来不像任何方法获得元数据。我仔细阅读了帖子中提供的PNG description。老实说,我不知道如何利用它的信息,也不知道Pillow如何帮助我。
有些帖子暗示我需要的是可以完成的,但它们不起作用。例如,this post建议使用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' object has no attribute '_getexif'
。根据{{3}},._getexif
功能仅具有实验性,仅适用于JPG。
阅读整体documentation,它实际上只谈到JPG和TIFF。处理PNG文件似乎根本不是包的一部分。就像hachoir
一样,也许它无法完成?
PIL
显然,Pillow分叉的另一个包PIL。看起来它在2009年被放弃了。
答案 0 :(得分:2)
您可以通过访问已加载图像的 info 字典,使用Pillow获取EXIF元数据。
从Pillow 6.0开始,可以从PNG图像读取EXIF数据。 但是,与其他图像格式不同,在调用
load()
之前,不能保证EXIF数据出现在信息中。 https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#png
from PIL import Image
filename = 'path/to/img'
im = Image.open(filename)
im.load() # Needed only for .png EXIF data (see citation above)
print(im.info['meta_to_read'])
我正在使用conda存储库中的Python 3.7和枕头7.1.2。
答案 1 :(得分:0)
这是一个笨拙但可行的解决方案。
从此处改编:https://motherboard.vice.com/en_us/article/aekn58/hack-this-extra-image-metadata-using-python
您可以在python中调用命令行exiftools应用,然后解析结果。
下面是在Ubuntu 16.04下的Python 3.6.3中工作的代码:
import subprocess
result = subprocess.run(['exiftool', '-h', '/home/jason/Pictures/kitty_mask.png'], stdout=subprocess.PIPE)
print (type(result))
print ("\n\n",result.stdout)
normal_string = result.stdout.decode("utf-8")
print("\n\n", normal_string)
它为我的测试图像产生以下结果:
> <class 'subprocess.CompletedProcess'>
>
>
> b'<!-- /home/jason/Pictures/kitty_mask.png
> -->\n<table>\n<tr><td>ExifTool Version Number</td><td>10.80</td></tr>\n<tr><td>File
> Name</td><td>kitty_mask.png</td></tr>\n<tr><td>Directory</td><td>/home/jason/Pictures</td></tr>\n<tr><td>File
> Size</td><td>25 kB</td></tr>\n<tr><td>File Modification
> Date/Time</td><td>2018:07:02 09:35:00+01:00</td></tr>\n<tr><td>File
> Access Date/Time</td><td>2018:07:09
> 16:23:24+01:00</td></tr>\n<tr><td>File Inode Change
> Date/Time</td><td>2018:07:02 09:35:00+01:00</td></tr>\n<tr><td>File
> Permissions</td><td>rw-r--r--</td></tr>\n<tr><td>File
> Type</td><td>PNG</td></tr>\n<tr><td>File Type
> Extension</td><td>png</td></tr>\n<tr><td>MIME
> Type</td><td>image/png</td></tr>\n<tr><td>Image
> Width</td><td>2448</td></tr>\n<tr><td>Image
> Height</td><td>3264</td></tr>\n<tr><td>Bit
> Depth</td><td>8</td></tr>\n<tr><td>Color
> Type</td><td>RGB</td></tr>\n<tr><td>Compression</td><td>Deflate/Inflate</td></tr>\n<tr><td>Filter</td><td>Adaptive</td></tr>\n<tr><td>Interlace</td><td>Noninterlaced</td></tr>\n<tr><td>Image
> Size</td><td>2448x3264</td></tr>\n<tr><td>Megapixels</td><td>8.0</td></tr>\n</table>\n'
>
>
> <!-- /home/jason/Pictures/kitty_mask.png --> <table> <tr><td>ExifTool
> Version Number</td><td>10.80</td></tr> <tr><td>File
> Name</td><td>kitty_mask.png</td></tr>
> <tr><td>Directory</td><td>/home/jason/Pictures</td></tr> <tr><td>File
> Size</td><td>25 kB</td></tr> <tr><td>File Modification
> Date/Time</td><td>2018:07:02 09:35:00+01:00</td></tr> <tr><td>File
> Access Date/Time</td><td>2018:07:09 16:23:24+01:00</td></tr>
> <tr><td>File Inode Change Date/Time</td><td>2018:07:02
> 09:35:00+01:00</td></tr> <tr><td>File
> Permissions</td><td>rw-r--r--</td></tr> <tr><td>File
> Type</td><td>PNG</td></tr> <tr><td>File Type
> Extension</td><td>png</td></tr> <tr><td>MIME
> Type</td><td>image/png</td></tr> <tr><td>Image
> Width</td><td>2448</td></tr> <tr><td>Image
> Height</td><td>3264</td></tr> <tr><td>Bit Depth</td><td>8</td></tr>
> <tr><td>Color Type</td><td>RGB</td></tr>
> <tr><td>Compression</td><td>Deflate/Inflate</td></tr>
> <tr><td>Filter</td><td>Adaptive</td></tr>
> <tr><td>Interlace</td><td>Noninterlaced</td></tr> <tr><td>Image
> Size</td><td>2448x3264</td></tr>
> <tr><td>Megapixels</td><td>8.0</td></tr> </table>