5

这类似于这个问题,除了那里的解决方案对我不起作用。

在 Windows 资源管理器中查看 HEIC 文件,我可以看到几个日期。与我所知道的相匹配的是我拍摄照片的日期,标题为“日期”和“拍摄日期”。其他日期不是我想要的。

Windows 资源管理器中的图像

我尝试了两种方法在 Python 中从此文件中获取 EXIF 数据:

from PIL import Image
_EXIF_DATE_TAG = 36867

img = Image.open(fileName)
info = img._getexif()
c.debug('info is', info)
# If info != None, search for _EXIF_DATE_TAG

这适用于许多其他图像,但对于我的 HEIC 文件信息是无。

我找到了上面链接的问题,并在那里尝试了答案(exifread):

import exifread

with open(filename, 'rb') as image:
  exif = exifread.process_file(image)

这里的 exif 是 None。所以我想知道日期是否以其他方式编码在文件中,而不是 EXIF,但是这两个工具似乎以其他方式显示:

http://exif.regex.info/exif.cgi显示: EXIF 站点

exiftool显示 exiftool

所以我彻底糊涂了!我是否在 Windows 资源管理器和这些工具中看到了 EXIF 数据?如果是这样,为什么 Python 工具都没有看到它?

谢谢你的帮助!

Windows 10,Python 2.7.16。这些照片是在 iPhone XS 上拍摄的,如果相关的话。

更新:将 HEIC 文件转换为 jpg,两种方法都可以正常工作。

4

2 回答 2

3

这是一个 HEIC 文件问题 - 显然不支持,我认为在许可方面存在一些困难。

于 2019-09-26T08:44:18.157 回答
1

macOS您可以通过 shell 使用本机(mdls元数据列表,归功于Ask Dave Taylor)从 HEIC 获取数据。请注意,像这样调用 shell 并不是好的编程方式,因此请谨慎使用。

import datetime
import subprocess

class DateNotFoundException(Exception):
    pass

def get_photo_date_taken(filepath):
    """Gets the date taken for a photo through a shell."""
    cmd = "mdls '%s'" % filepath
    output = subprocess.check_output(cmd, shell = True)
    lines = output.decode("ascii").split("\n")
    for l in lines:
        if "kMDItemContentCreationDate" in l:
            datetime_str = l.split("= ")[1]
            return datetime.datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S +0000")
    raise DateNotFoundException("No EXIF date taken found for file %s" % filepath)
于 2019-11-16T22:34:07.617 回答