You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中如何读取UIImage的完整EXIF数据?

如何读取UIImage中的全部EXIF信息?

你遇到的问题很常见——直接从UIImage对象读取EXIF信息会丢失大部分原始元数据,原因在于UIImageJPEGRepresentation(现在推荐用UIImage.jpegData(compressionQuality:))是对图片进行重新编码,只会保留显示相关的基础元数据,而不是原始文件里的完整EXIF信息。

正确的解决方案:从原始文件数据读取

要获取完整的EXIF,你应该直接读取图片的原始文件数据(比如从本地相册或文件系统获取的Data),而不是从UIImage对象转换。下面是具体的Swift代码示例:

// 假设你有图片的本地文件URL
guard let imageURL = Bundle.main.url(forResource: "your-image", withExtension: "jpg"),
      let imageData = try? Data(contentsOf: imageURL) else {
    print("无法获取图片数据")
    return
}

// 创建CGImageSource,设置不缓存以提升性能
let options = [kCGImageSourceShouldCache: false] as CFDictionary
guard let source = CGImageSourceCreateWithData(imageData as CFData, options) else {
    print("无法创建CGImageSource")
    return
}

// 获取包含全部元数据的属性字典
guard let metadata = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any] else {
    print("无法获取元数据")
    return
}

// 打印完整的EXIF信息
if let exifData = metadata["{Exif}"] as? [String: Any] {
    debugPrint("完整EXIF信息:", exifData)
}

为什么你的代码只能拿到有限内容?

你原来的代码用UIImageJPEGRepresentation把UIImage转成JPEG数据,这个过程会重新编码图片,只保留Orientation、像素尺寸这类基础显示属性,原始图片里的拍摄时间、光圈、快门速度等EXIF字段都会被丢弃。

如果必须从UIImage出发?

很遗憾,UIImage对象本身并不存储完整的EXIF元数据——它只包含渲染图片所需的信息。所以如果你的图片是从UIImage创建的(比如经过编辑、截图),那原始的EXIF已经丢失,无法恢复。这种情况下,你需要在获取图片时就保留原始的文件数据,而不是只保留UIImage对象。

内容的提问来源于stack exchange,提问作者Dinesh Kc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:21