要实现获取照片拍摄时间,你需要使用Python配合一些图片处理库来读取照片的元数据(Exif信息),其中包含拍照时间。以下是一个简单的程序示例,使用Pillow库和piexif库来读取照片的Exif信息:
首先,你需要安装Pillow
和piexif
库。可以通过以下命令安装:
pip install Pillow piexif
然后,你可以使用以下代码来提取照片的拍摄时间:
from PIL import Image
import piexif
def get_photo_time(image_path):
# 打开图片文件
image = Image.open(image_path)
# 获取Exif数据
exif_data = piexif.load(image.info['exif'])
# 提取拍摄时间
if piexif.ExifIFD.DateTimeOriginal in exif_data['Exif']:
photo_time = exif_data['Exif'][piexif.ExifIFD.DateTimeOriginal]
# 转换为可读格式
photo_time = photo_time.decode('utf-8')
return photo_time
else:
return "未找到拍照时间"
# 使用示例
image_path = 'path_to_your_image.jpg' # 替换成你的照片路径
print("拍照时间:", get_photo_time(image_path))
代码说明:
Pillow
库用于打开图片文件。
piexif
库用于提取图片中的Exif元数据,Exif包含照片的拍摄时间等信息。
DateTimeOriginal
是Exif信息中存储拍照时间的字段。
使用方式:
将你收到的图片下载到本地并提供正确的路径(例如:'path_to_your_image.jpg'
)。
运行程序后,程序会输出图片的拍摄时间(如果照片包含Exif信息)。
然而我这里报错,查阅了一番才知道:
这里的 image_path = 'path_to_your_image.jpg'
只是一个占位符,意思是你需要将 'path_to_your_image.jpg'
替换成你实际的图片路径。
- 图片路径
假设你的照片保存在桌面上,文件名为example.jpg
,那么:
如果你使用的是 Windows,路径可能是:
image_path = 'C:\\Users\\你的用户名\\Desktop\\example.jpg'
如果你使用的是 MacOS 或 Linux,路径可能是:
image_path = '/Users/你的用户名/Desktop/example.jpg'
- 具体例子
假设你下载了一张名为vacation.jpg
的照片,并且它存放在桌面上。那么代码中的image_path
就应该是:
Windows 示例:
image_path = 'C:\\Users\\张三\\Desktop\\vacation.jpg'
MacOS 示例:
image_path = '/Users/zhangsan/Desktop/vacation.jpg'
- 如果图片路径中有空格
有时候文件路径可能会有空格,这时不要担心,Python会正常处理。比如路径是My Photo.jpg
,那也没问题,直接把路径放进去:
Windows 示例:
image_path = 'C:\\Users\\张三\\Desktop\\My Photo.jpg'
MacOS 示例:
image_path = '/Users/zhangsan/Desktop/My Photo.jpg'
- 如何找到图片的路径
如果你不确定路径,通常可以:
- 在 Windows 中,右键点击图片文件,选择“属性”并查看文件位置。
- 在 MacOS 中,右键点击图片,选择“显示简介”来查看文件路径。
完整代码示例
假设我们用 vacation.jpg
作为示例,
路径是 C:\Users\张三\Desktop\vacation.jpg,代码会变成这样:
from PIL import Image
import piexif
def get_photo_time(image_path):
# 打开图片文件
image = Image.open(image_path)
# 获取Exif数据
exif_data = piexif.load(image.info['exif'])
# 提取拍摄时间
if piexif.ExifIFD.DateTimeOriginal in exif_data['Exif']:
photo_time = exif_data['Exif'][piexif.ExifIFD.DateTimeOriginal]
# 转换为可读格式
photo_time = photo_time.decode('utf-8')
return photo_time
else:
return "未找到拍照时间"
# 使用示例
image_path = 'C:\\Users\\张三\\Desktop\\vacation.jpg' # 替换成实际路径
print("拍照时间:", get_photo_time(image_path))
重新输入之后又曝出另一个问题:
这个错误是因为在尝试获取图片的Exif信息时,image.info
中并没有 ‘exif’ 这个键。这通常发生在图片不包含Exif元数据时。可能的原因是图片本身没有Exif信息(有些图片没有这个数据,尤其是通过某些应用或设备拍摄的图片)。
解决方法:
-
检查图片是否包含Exif信息: 在提取Exif信息前,你可以先检查图片是否包含Exif数据。我们可以使用 PIL 提供的
.getexif()
方法来进行检查,而不是直接访问image.info['exif']
。 -
修改代码以处理没有Exif数据的情况: 我们可以在代码中增加一些检查,以确保只有在Exif数据存在时才尝试读取它。
然后我的修改后就这样了
from PIL import Image
import piexif
def get_photo_time(image_path):
# 打开图片文件
image = Image.open(image_path)
# 尝试获取Exif数据
exif_data = image._getexif()
if exif_data is not None:
# 检查是否包含拍照时间
if piexif.ExifIFD.DateTimeOriginal in exif_data:
photo_time = exif_data[piexif.ExifIFD.DateTimeOriginal]
# 转换为可读格式
photo_time = photo_time.decode('utf-8')
return photo_time
else:
return "Exif中没有拍照时间"
else:
return "图片没有Exif数据"
# 使用示例
image_path = r"C:\Users\86180\Desktop\4596D3FDD2A16E120696DAB3601CB5A1.png" # 替换成实际路径
print("拍照时间:", get_photo_time(image_path))
主要修改:
1.使用 image._getexif()
方法:这个方法直接返回Exif数据(如果存在的话),而不是通过 image.info['exif']
访问。这可以避免在没有Exif数据时抛出 KeyError 错误。
2.检查Exif数据是否存在:如果图片没有Exif数据(返回值为 None),则返回一个提示信息:“图片没有Exif数据”。
3.检查是否包含拍照时间:如果Exif数据存在,进一步检查是否包含 DateTimeOriginal
字段,这是存储拍照时间的地方。
其他注意事项:
1.不是所有图片都有Exif信息,特别是一些PNG格式的图片,因为Exif信息主要是JPEG、TIFF等格式的图片才有的。如果你确认你的图片是PNG格式,它可能没有Exif数据。这种情况下,使用image._getexif()方法会返回None。
2.如果你确定图片应该包含Exif数据,但仍然无法读取,可以考虑将图片转换为其他格式(如JPEG),并重新尝试。
运行后输出:
- 如果图片包含Exif数据并且有拍照时间,程序会显示拍照时间。
- 如果图片没有Exif数据,程序会显示:“图片没有Exif数据”。
- 如果Exif中没有拍照时间,程序会显示:“Exif中没有拍照时间”。
为什么报出这个: d:; cd ‘d:\python3\lsy\2’; & ‘D:\python3\python.exe’ ‘c:\Users\86180.vscode\extensions\ms-python.python-2021.8.1159798656\pythonFiles\lib\python\debugpy\launcher’ ‘7219’ ‘–’ ‘d:\python3\lsy\2\11.py’ 拍照时间: 图片没有Exif数据???
从错误信息来看,程序成功运行,但它返回了 “图片没有Exif数据”,这表明你提供的图片文件没有Exif元数据。
为什么会发生这个问题?
Exif数据通常存在于由数码相机、手机或其他带有拍照功能的设备拍摄的图片中,但并不是所有图片都会包含Exif信息。特别是以下几种情况可能导致图片没有Exif数据:
-
图片格式问题:Exif数据主要存在于JPEG、TIFF格式的图片中,而PNG格式的图片通常不会包含Exif数据。如果你的图片是PNG格式,它很可能没有Exif信息。
-
编辑过的图片:有些图片在经过处理或编辑后,可能会丢失Exif数据。如果你用某些编辑工具(如Photoshop、GIMP)编辑过图片,这些工具可能会删除Exif信息。
-
图片来源问题:如果图片是通过某些应用或设备生成的(比如截图、从网页下载的图片等),这些图片也通常不会包含Exif数据。
解决办法:
1.检查图片格式:
确保你使用的图片是JPEG或TIFF格式。如果是PNG或者其他格式,可能确实没有Exif数据。
你可以通过查看文件的扩展名,或者使用图片查看工具查看文件格式。
2.尝试换一张JPEG图片:
如果你有一张拍摄的JPEG格式图片,可以试试用这张图片,看看程序能否成功提取Exif数据。
3.手动检查图片是否包含Exif数据:
使用图片查看工具(如Windows自带的图片查看器,或使用在线Exif查看器)检查图片是否包含Exif信息。很多图片查看器会显示Exif数据,包括拍照时间、设备型号等。
4.尝试修改图片格式:
如果你正在使用PNG格式,可以尝试将图片转换为JPEG格式(比如通过在线转换工具或Photoshop等工具)。转换为JPEG格式后,通常会保留Exif数据,尤其是拍照时间。
这里我就不展示了
如何检查Exif数据?
1.你可以通过一些在线工具来检查图片是否有Exif数据。比如:
ExifTool(提供详细的Exif信息)
2.或者使用Windows自带工具查看:右键图片文件,选择“属性” > “详细信息” 标签页,可以查看图片的Exif信息。
如果你提供的图片是PNG格式或者没有Exif数据的图片,那么程序会提示“图片没有Exif数据”。
尝试使用JPEG格式的照片,通常它们会包含Exif数据。
使用一些图片查看工具,手动检查一下图片是否包含Exif数据。