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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:35:06