为啥 PHAsset creationDate 与 exif 元数据不同?

Posted

技术标签:

【中文标题】为啥 PHAsset creationDate 与 exif 元数据不同?【英文标题】:Why is PHAsset creationDate different from exif metadata?为什么 PHAsset creationDate 与 exif 元数据不同? 【发布时间】:2021-01-02 00:12:36 【问题描述】:

我有一台启用了照片库同步的 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.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"] ?? "")

打印出来:

创作日期:2020-12-28 20:46:06.9940 2020:12:28 20:46:09 186

这意味着在 iOS 上 PHAsset.creationDate 与存储在 PHAsset 中的 exif 数据不同。

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

【问题讨论】:

检查文件的创建日期。 如果我的回答清除了您的问题,那么您可以接受答案并释放赏金。 【参考方案1】:

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

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

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

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

iPhoto、Aperture、Lightroom、Picasa、Photoshop 等照片应用程序从 Exif 元数据中获取日期和时间。

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

问题在于 Finder 不能与 Exif 一起使用

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

最后的话:- 因此,如果您想获取捕获它的确切日期时间,请考虑 Exif 数据。那是真正的日期和时间。

【讨论】:

所以PHAsset.creationDate 从文件的元数据中获取创建日期?照片被导出到 macOS 照片应用程序以检查PHAsset.creationDate,这就是我发现不同之处的地方。我没有使用 Finder,也没有在 Finder 中检查创建日期,因为它显示了照片从手机导出的时刻。 是的,PHAsset.creationDate 从文件的元数据中获取创建日期。您会在 MacOS 照片应用中找到不同之处,因为照片应用使用 Exif 数据。 Phasset.creationDate 为您提供文件的元数据。 简而言之,如果您想获得点击照片的确切时间。请考虑 Exif 数据。

以上是关于为啥 PHAsset creationDate 与 exif 元数据不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHAsset fetchAssetsWithOptions 不返回所有资产?

如何处理多个大尺寸的图像?

为啥这个投票/帖子比率总是1?

如何将 PHAsset 与 UIImage 进行比较

PHAsset CLLocation 未提供与照片应用相同的位置

保存后获取与PHAsset相同的NSData