Python EXIF ​​не может найти дату создания файла HEIC, но она видна в других инструментах

Это похоже на этот вопрос, за исключением того, что решение там не работает для меня.

Просматривая файл HEIC в проводнике Windows, я вижу несколько дат. Тот, который совпадает с тем, что я знаю, - это дата, когда я сделал снимок, помеченный как «Дата» и «Дата съемки». Другие свидания не то, что я хочу.

Изображение в проводнике Windows

Я пробовал два метода получить данные EXIF ​​из этого файла в Python:

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

Так что я полностью запутался! Я вижу данные EXIF ​​в проводнике Windows и этих инструментах? И если да, то почему ни один инструмент Python этого не видит?

Спасибо за любую помощь!

Windows 10, Python 2.7.16. Фотографии были сделаны на iPhone XS, если это актуально.

Обновление. Оба метода конвертируют файл HEIC в формат jpg.


person Cormac    schedule 24.09.2019    source источник
comment
Как вы преобразовали файл Heic в формат JPG?   -  person Phani Rithvij    schedule 11.01.2020


Ответы (2)


Это проблема с файлом HEIC - по-видимому, он не поддерживается, я думаю, некоторые трудности с лицензированием.

person Cormac    schedule 26.09.2019

На macOS вы можете использовать собственный mdls (список метаданных, укажите Спросите Дэйва Тейлора) через оболочку, чтобы получить данные от HEIC. Обратите внимание, что вызов такой оболочки - плохое программирование, поэтому используйте ее с осторожностью.

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)
person miguelmorin    schedule 16.11.2019