使用 swift 在 iOS 本地保存和检索照片及其所有元数据

Save and retrieve Photos with all their metadata locally on iOS using swift

我目前正在拍摄用户的照片 iPhone 将它们制作成 jpeg,然后使用文件管理器保存它们,然后用核心数据保存它们的路径。

我这样做的方式无法显示实时图像或稍后导出带有其先前元数据的图像。

我的问题是,在本地保存图像及其所有元数据和实时状态的正确方法是什么,以便以后可以显示和导出,但只能在应用程序内显示和导出。我不希望图像在应用程序之外可用。

拍照:

看看UIImagePickerControllerclass,用它来拍照。用这个拍照,不会自动将图像保存到 iOS 图库。

提到的 UIImagePickerController 将通知委托 UIImagePickerControllerDelegate 并调用函数 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]).

从第二个参数,信息字典,你可以请求大部分的图片元数据,livePhoto等等。可以在名为 UIImagePickerController.InfoKey.

UIImagePickerController 扩展中找到必要的密钥

例如,下面是我如何检索图像坐标(如果可用):

if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL {
      let result = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil)
      if let asset = result.firstObject, let location = asset.location {
          let lat = location.coordinate.latitude
          let lon = location.coordinate.longitude
          print("Here's the lat and lon \(lat) + \(lon)")
      }
}

将图像保存到应用程序中的 phone 上?:

我用JSONEncoder。您可以使用此 class 编码然后再次解码您的自定义图像 class。

您的自定义图像 class,它具有 UIImage 和所有其他属性,然后必须实现 Codable 协议。 然后,使用 JSONEncoder 通过其 encode() 方法创建对象的 Data,并在 FileManager 的帮助下将其保存到应用程序私有位置。 稍后,您可以使用 FileManagerdecode()JSONEncoder 再次从该位置读取所有文件,瞧,您再次以自定义图像的形式获得所有图像 class.

正在将图像保存到用户图库"Exporting":

下面是我如何再次将该图像保存到用户图库中作为导出方式的示例:

private static func saveImageToGallery(picture: UIImage, lat: Double?, lon: Double?) {
            PHPhotoLibrary.shared().performChanges({
                let request = PHAssetCreationRequest.creationRequestForAsset(from: picture)
                if let _lat = lat, let _lon = lon {
                    request.location = CLLocation(latitude: _lat, longitude: _lon)
                }
            })
        }

我希望这足以指导您找到正确的方法。