为什么 PHAsset creationDate 与 exif 元数据不同?

Why is PHAsset creationDate different from exif metadata?

我有一台 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 打印:

creationDate: 2020-12-28 20:46:06.9940

运行 macOS 上的相同代码在同一张图片上打印不同的结果:

creationDate: 2020-12-28 20:46:09.1860

日期看起来几乎一样,但差了两秒。我比较了 macOS 和 iOS 之间相同的其他照片,并计算了以秒为单位的差异:

0.6877040863037109
0.5218453407287598
0.6767516136169434
0.32204413414001465
2.1924281120300293 (previously compared photo)
0.422029972076416

日期总是不同的,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

作为最后一步,我尝试在 iOS 上打印照片的 exif 数据:

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"] ?? "")
}

这会打印:

creationDate: 2020-12-28 20:46:06.9940
2020:12:28 20:46:09
186

这意味着 iOS PHAsset.creationDate 不同于存储在 PHAsset.

中的 exif 数据

为什么同一张照片的 creationData 在 macOS 和 iOS 上不同?为什么 creationData 与 iOS 上的 exif DateTimeOriginal 不匹配?

当您考虑 jpeg 或其他图像文件时,涉及两种元数据。

一个是文件数据。这就是 Finder 显示的内容。这不会告诉您有关文件内容的任何信息,只会告诉您文件本身。

文件元数据的问题在于,当文件从一个地方移动到另一个地方或导出、通过电子邮件发送、上传等时,它很容易发生变化。

照片还具有 Exif 和 IPTC 元数据。您的相机拍摄照片的日期和时间记录在 Exif 元数据中。不管文件日期是什么,这都是相机实际记录的时间。

iPhoto、Aperture、Lightroom、Picasa、Photoshop 等照片应用程序从 Exif 元数据.

当您从 iPhoto 导出到 Finder 时,会创建包含您的照片(及其 Exif)的新文件。文件日期非常准确地报告为导出日期。但是,照片日期没有改变。

问题是 Finder 不支持 Exif

因此,您的照片和文件的日期都是正确的,但它们是不同的东西。要按照片日期排序,您需要使用照片应用程序。

最后的话:- 因此,如果您想获得捕获的确切日期时间,请考虑使用 Exif Data。那才是真正的日期和时间。