如何在Python中提取图像元数据
元数据是指关于数据的数据。就图像而言,元数据意味着关于图像及其制作的细节。有些元数据是由采集设备自动生成的。
图像元数据所包含的一些细节如下。
- Height
- Width
- 日期和时间
- 模型等。
Python有PIL库,它使从图像中提取元数据的任务变得非常容易,而且只需使用几行。
步骤:
- 导入pillow模块。
- 加载图像
- 获取元数据。如此获得的元数据
- 将其转换为人类可读的形式
有许多类型的元数据,但在这里我们只关注Exif元数据。
使用Exif来提取图像元数据
这些元数据通常由相机和其他捕获设备创建,包括关于图像及其捕获方法的技术信息,如曝光设置、捕获时间、GPS位置信息和相机型号。
为此,我使用了这张图片(链接如下),以确保无论你使用什么图片,它都应该有一些EXIF类型的元数据,大多数捕获设备都有EXIF数据。
https://drive.google.com/file/d/1z2RaRvzC8Cd8oxD8pZJu2U0rpRr8tbwV/view
实现:
- 导入模块。
- 加载图像并提取exif数据。
- 将exif标签ID(代码中以tagid表示)转换成人类可读的形式,代码中以tagname表示,并获得其各自的值。
用pillow从图像中提取元数据的应用:下面的脚本实现了上述方法
from PIL import Image
from PIL.ExifTags import TAGS
# open the image
image = Image.open("img.jpg")
# extracting the exif metadata
exifdata = image.getexif()
# looping through all the tags present in exifdata
for tagid in exifdata:
# getting the tag name instead of tag id
tagname = TAGS.get(tagid, tagid)
# passing the tagid to get its respective value
value = exifdata.get(tagid)
# printing the final result
print(f"{tagname:25}: {value}")
输出:
使用子进程提取图像元数据
在这里,我们使用子进程模块来提取图像元数据,使用popen()方法,从一个命令中打开一个管道。这个管道允许该命令将其输出发送到另一个命令。我们将获取的元数据存储到一个字典中。
import subprocess
imgPath = "C:\\Users\\DELL\\Downloads\\output.jpg"
exeProcess = "hachoir-metadata"
process = subprocess.Popen([exeProcess,imgPath],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True)
Dic={}
for tag in process.stdout:
line = tag.strip().split(':')
Dic[line[0].strip()] = line[-1].strip()
for k,v in Dic.items():
print(k,':', v)
输出: