如何获取 PHAsset 的原始(EXIF?)创建日期/时间?

Posted

技术标签:

【中文标题】如何获取 PHAsset 的原始(EXIF?)创建日期/时间?【英文标题】:How to get original (EXIF?) creation date/time of PHAsset? 【发布时间】:2017-06-19 15:55:08 【问题描述】:

PHAsset 有一个 creationDate 属性,它以 UTC 格式提供资产的创建日期。

如果我在 UTC-6 晚上 10:52 拍摄照片,creationDate 属性是凌晨 03:52。

我应该如何知道拍摄照片的“真实”时间? creationDate 属性未提供时区信息,因此我无法将其调整回晚上 10:52 - 我不知道调整时区是什么时区...

我知道我可以使用PHImageManager requestImageDataForAsset 获取 EXIF 创建日期(或至少尝试),并使用那里返回的数据来获取实际上是晚上 10:52 的 EXIF 创建日期,但这会导致非常慢照片在 iCloud 中时的性能(我需要用户库中所有资产的创建日期值)。此外,我无法弄清楚如何获取视频的 EXIF 创建日期。

我也知道有一些方法可以从 CLLocation 获取时区,我可以使用这些方法来调整 creationDate - 但这些方法要么是速率受限的,要么是不准确的

还有其他更简单的方法来获取这个原始创建日期值吗?

回顾一下:

在 UTC-6 晚上 10:52 拍摄照片 PHAsset 创建日期为 UTC 上午 03:52 我想知道如何获取 UTC-6 日期/时间晚上 10:52。

【问题讨论】:

【参考方案1】:

您可以尝试使用PHContentEditingInput。 iCloud 图像也可能会很慢,但值得一试,因为我认为没有其他方法可以做到这一点:(

这种方法不需要 ImageIO 导入并且需要更少的代码,所以它可能会比 PHImageManager requestImageDataForAsset 好一些

您可以使用此PHAsset 类别快速尝试: https://github.com/zakkhoyt/PHAsset-Utility

【讨论】:

【参考方案2】:

可以获取exif详细信息如下:

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

打印出来:

2021:01:04 11:47:07

177

【讨论】:

以上是关于如何获取 PHAsset 的原始(EXIF?)创建日期/时间?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何从 PHAsset 获取原始图像和媒体类型?

PHAsset 视频 EXIF 元数据检索

与 UIActivitiViewController 共享图像(UIImage)的 PHAsset 丢失元数据(Exif 等)

如何解决 PhotoKit 错误“原始资源选择仅对未调整的基础版本有效”?

在 PhotoKit 中,修改 PHAsset 会留下原始的。如何?可覆盖?