【问题标题】:Select an image from the camera roll and save it to the app通过 UIImagePickerController 从相机胶卷将图像保存到应用程序
【发布时间】:2021-11-06 22:33:10
【问题描述】:

我试图弄清楚如何保存用户通过 UIImagePickerController 从他们的相机胶卷中选择的图像,该控制器已设置如下:

@IBAction func addPhotoButton(_ sender: Any) {
        
let picker = UIImagePickerController()
picker.allowsEditing = true
picker.delegate = self
picker.mediaTypes = ["public.image"]
present(picker, animated: true)
        
}

选择器本身显示正确,但是,我不知道如何抓取用户选择的图像,然后将其保存到 UserDefaults(或建议的其他位置),然后再显示。我也在寻找之后如何删除它。

我在网上查到的结果总是报错,比如:

在范围内找不到“图像”。

总结一下:我如何将用户从 UIImagePickerController 中选择的图像保存到应用程序中以供以后存储,然后如何显示它,然后将其从应用程序中删除?

(顺便说一句,在我打开 UIImagePickerController 之前,如何显示“应用名称想使用您的相机胶卷。拒绝。允许。”消息以征求用户的许可?) em>

另外,我不是试图保存相机胶卷。我正在尝试相机胶卷中保存。

谢谢!

【问题讨论】:

  • “另外,我没有尝试保存到相机胶卷。我正在尝试从相机胶卷中保存。”从相机胶卷中保存是什么意思?你的意思是,你想把它存储在你的应用程序的沙箱文件夹中还是什么的?
  • 我正在尝试允许用户通过 UIImagePickerController 从相机胶卷中选择图像并保存,稍后显示,然后删除。

标签: ios swift image


【解决方案1】:

要在图库 Tap 上获取图像,只需实现 UIImagePickerController,didFinishPickingMediaWithInfo 的委托方法

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        image.storeInUserDefaults(for: "yourKey")
    }
    dismiss(animated: true, completion: nil)
}

并按照您的要求存储/获取您保存在 UserDefaults 中的图像,您可以使用此扩展程序:

extension UIImage {
  func storeInUserDefaults(with compressionQuality: CGFloat = 0.8, for key: String) {
      guard let data = self.jpegData(compressionQuality: compressionQuality) else { return }
      let encodedImage = try! PropertyListEncoder().encode(data)
      UserDefaults.standard.set(encodedImage, forKey: key)
 }

 static func loadFromUserDefaults(with key: String) throws -> UIImage? {
      guard let data = UserDefaults.standard.data(forKey: key) else {
          return nil
      }
      do {
          let decodedImageData = try PropertyListDecoder().decode(Data.self, from: data)
          return UIImage(data: decodedImageData)
      } catch let error {
          throw error
      }
  }
}

【讨论】:

    【解决方案2】:

    确认到 'UIImagePickerControllerDelegate' 委托。

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
      if let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
        let imageToBeSaved = image
        UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil)
      }
      if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        let imageToBeSaved = image
        UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil)
       } 
     }
    

    UIImageWriteToSavedPhotosAlbum 这将保存到相册、画廊。

    或者,它也可以存储在应用程序存储中。

    static func saveImageToTemp(image: UIImage, withName name: String) -> String? {
        let data = image.jpegData(compressionQuality: 0)
        let cache = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: false)`enter code here`
        if let filename = cache?.appendingPathComponent(name) {
              try? data?.write(to: filename)
              return filename.absoluteString
          }
        return nil 
    }
    
    static func getImage(fromPath path: String) -> UIImage? {
        if FileManager.default.fileExists(atPath: path) {
            if let image = UIImage(contentsOfFile: path) {
                return image
            }
         }
      return nil 
    } 
    
    static func deleteFile(atPath path: String) {
        if FileManager.default.fileExists(atPath: path) {
            try? FileManager.default.removeItem(atPath: path)
        }
    } 
    
    static func deleteFile(withName name: String) {
        let cache = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        if let fileURL = cache?.appendingPathComponent(name) {
          if FileManager.default.fileExists(atPath: fileURL.path) {
            do {
              try FileManager.default.removeItem(atPath: fileURL.path)
            } catch {
            print("\(#function): Error \(error)")
          }
        }
      }
    }
    

    iOS 中可用的目录类型

    static let documents = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    static let library = try? FileManager.default.url(for: .libraryDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    static let downloads = try? FileManager.default.url(for: .downloadsDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    static let user = try? FileManager.default.url(for: .userDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    static let cache = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2015-11-18
      • 2022-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多