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
相关产品推荐
相关产品推荐

