Почему дата создания PHAsset отличается от метаданных exif?

У меня есть iPhone и MacBook с включенной синхронизацией библиотеки фотографий. На iPhone есть фотографии, которые были скопированы в библиотеку фотографий MacBook.

Этот фрагмент кода извлекает актив в приложении iOS и печатает creationDate:

let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors 
    = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allPhotos = PHAsset.fetchAssets(with: self.allPhotosOptions)
let fetchResult = PHAsset.fetchAssets(in: allPhotos, options: nil)
let asset = fetchResult.lastObject!

let creationDate = asset.creationDate!
print("creationDate: \(dateFormatter.string(from: creationDate))")
        

С форматом даты yyyy-MM-dd HH:mm:ss.SSSS это печатает:

Дата создания: 2020-12-28 20:46:06.9940

Запуск одного и того же кода в macOS приводит к другому результату на одном и том же изображении:

Дата создания: 2020-12-28 20:46:09.1860

Дата выглядит почти так же, но пропускает две секунды. Я сравнил другие фотографии, идентичные между macOS и iOS, и посчитал разницу в секундах:

0,6877040863037109
0,5218453407287598
0,6767516136169434
0,32204413414001465
2,1924281120300293 (предыдущее сравнение фото)
0,972207299

Даты всегда разные, а даты фотографий iPhone новее на случайное количество миллисекунд. Я отправил предыдущее фото с iOS на macOS в виде файла для сравнения с таким же фото из библиотеки macOS. Когда я печатаю данные exif, они выглядят так же:

$ exiftool IMG_1534_iOS.JPG
Create Date                     : 2020:12:28 20:46:09.186-08:00
$ exiftool IMG_1534_mac.HEIC
Create Date                     : 2020:12:28 20:46:09.186-08:00

В качестве последнего шага я попытался распечатать exif-данные фотографии на iOS:

print("creationDate: \(dateFormatter.string(from: asset.creationDate!))")
    
let options = PHContentEditingInputRequestOptions()
    
asset.requestContentEditingInput(with: options) { input, _ in
    guard let url = input?.fullSizeImageURL else { return }
    guard let image = CIImage(contentsOf: url) else { return }
    guard let exif = image.properties["{Exif}"] as? [String: Any] else { return }
    
    print(exif["DateTimeOriginal"] ?? "")
    print(exif["SubsecTimeDigitized"] ?? "")
}

Это печатает:

Дата создания: 2020-12-28 20:46:06.9940
2020:12:28 20:46:09
186

Это означает, что в iOS PHAsset.creationDate отличается от данных exif, которые хранятся в этом файле PHAsset.

Почему creationData одной и той же фотографии на macOS и iOS разные? И почему creationData не соответствует DateTimeOriginal exif на iOS?


person Leo    schedule 02.01.2021    source источник
comment
Проверьте дату создания файла.   -  person Rob Napier    schedule 04.01.2021
comment
Если мой ответ разрешил ваш вопрос, вы можете принять ответ и освободить награду.   -  person Sagar koyani    schedule 15.01.2021


Ответы (1)


Есть два типа метаданных, когда вы рассматриваете jpeg или другой файл изображения.

Одним из них является файл данных. Это то, что показывает Искатель. Это ничего не говорит вам о содержимом файла, только о самом файле.

Проблема с метаданными файлов заключается в том, что они могут легко изменяться при перемещении файла с места на место или экспорте, отправке по электронной почте, загрузке и т. д.

Фотографии также имеют метаданные Exif и IPTC. Дата и время, когда ваша камера сделала снимок, записываются в метаданные Exif. Независимо от того, что говорит дата файла, это фактическое время, записанное камерой.

Фото-приложения, такие как iPhoto, Aperture, Lightroom, Picasa, Photoshop и т. д., получают дату и время из метаданных Exif.

При экспорте из iPhoto в Finder создается новый файл, содержащий вашу фотографию (и ее Exif). Дата файла - довольно точно - сообщается как дата экспорта. Однако дата фото не меняется.

Проблема в том, что Finder не работает с Exif.

Итак, ваша фотография имеет правильную дату, как и файл, но это разные вещи. Для сортировки по дате фотографии вам понадобится приложение для работы с фотографиями.

Заключительные слова:- Итак, если вы хотите получить точную дату и время, когда он был захвачен, рассмотрите данные Exif. Это реальная дата и время.

person Sagar koyani    schedule 06.01.2021
comment
Итак, PHAsset.creationDate берет дату создания из метаданных файла? Фотографии экспортируются в приложение MacOS Photos для проверки PHAsset.creationDate, и именно здесь я нахожу разницу. Я не использовал Finder и не проверял дату создания в Finder, потому что он показывает время момента, когда фото было экспортировано с телефона. - person Leo; 11.01.2021
comment
Да, PHAsset.creationDate берет дату создания из метаданных файла. Вы найдете отличия в приложении MacOS Photos, потому что приложение Photos использует данные Exif. И Phasset.creationDate дает вам метаданные файла. - person Sagar koyani; 12.01.2021
comment
Inshort Если вы хотите получить точное время, когда фотография нажата. Учитывайте данные Exif. - person Sagar koyani; 12.01.2021