Swift4.1中使用UIViewController保存图片捕获元数据的示例代码求助
嘿,刚好我之前在Swift 4.1项目里做过类似的需求,给你分享一个经过验证的示例代码,能完美保留图片捕获时的元数据:
核心实现思路
要保留图片捕获时的元数据,关键是直接操作原始图片数据和系统提供的元数据字典,避免使用会丢失元数据的UIImage直接保存方法。这里我们用UIImagePickerController捕获图片,再通过Photos框架将图片数据和元数据一起写入相册。
完整示例代码
import UIKit import Photos class CaptureWithMetadataViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 绑定到相机按钮的点击事件 @IBAction func launchCamera(_ sender: UIButton) { guard UIImagePickerController.isSourceTypeAvailable(.camera) else { print("当前设备相机不可用") return } let cameraPicker = UIImagePickerController() cameraPicker.sourceType = .camera cameraPicker.delegate = self cameraPicker.allowsEditing = false // 务必关闭编辑,否则元数据会被重置 present(cameraPicker, animated: true) } // 处理相机捕获完成的回调 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 从回调信息中提取原始图片和元数据 guard let originalImage = info[.originalImage] as? UIImage, let captureMetadata = info[.mediaMetadata] as? [String: Any] else { print("无法获取图片或捕获元数据") return } // 将图片转为JPEG数据(相机捕获的图片默认是JPEG格式,保留画质建议压缩质量0.8以上) guard let imageData = originalImage.jpegData(compressionQuality: 0.9) else { print("图片转数据失败") return } // 使用Photos框架写入图片和元数据 PHPhotoLibrary.shared().performChanges({ let assetRequest = PHAssetCreationRequest.forAsset() assetRequest.addResource(with: .photo, data: imageData, options: nil) // 写入完整捕获元数据(也可以按需提取Exif、GPS等子集) assetRequest.metadata = captureMetadata }) { success, error in DispatchQueue.main.async { if success { print("图片和元数据已成功保存到相册") // 这里可以给用户弹出成功提示 } else { print("保存失败:\(error?.localizedDescription ?? "未知错误")") } } } } // 处理相机取消事件 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true) } }
关键注意事项
- 权限配置:必须在项目的
Info.plist中添加两个权限描述,否则应用会崩溃:NSCameraUsageDescription:比如填写“需要访问相机拍摄照片”NSPhotoLibraryAddUsageDescription:比如填写“需要将拍摄的照片保存到相册”
- 不要开启编辑:
allowsEditing设为false,因为编辑后的图片会丢失原始捕获元数据 - 元数据完整性:示例中直接将整个
captureMetadata赋值给assetRequest.metadata,会保留所有捕获时的元数据(包括Exif、GPS、设备信息等),如果只需要特定字段,可以单独提取对应字典(比如kCGImagePropertyExifDictionary对应的Exif信息)
内容的提问来源于stack exchange,提问作者Gonzalo Contreras del Solar
相关产品推荐
相关产品推荐

