Saving image to .documentsDirectory, and as a String to store path in local Realm
我正在尝试保存(解析?)图像到我的领域的路径。为此,我尝试将图像另存为jpegData到documentDirectory。
我要保存的图像不需要保存到用户照片库中,只需在应用程序本身中引用和显示即可。
首先,我不确定是否要采取正确的方法。请向我介绍最适合在本地保存图像的解决方案。
我只看到了几个网站,Stack Overflow问题以及几乎没有任何视频,所以有些事情告诉我,有一种更有效的方法可以完成此任务。
将选择的图像保存到CoreData,
如何将映像放入Realm数据库中?以及如何使用writeToFile将图像保存在文档目录中?使我尝试将图像保存到目录中,尤其是最后的SO Question。
我有以下代码,但收到错误
从照片库或照相机中选择后,我要保存的图像位于
我将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | @objc func saveTapped(_ sender: UIBarButtonItem) { self.performSegue(withIdentifier:"saveTappedSegue", sender: self) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier =="saveTappedSegue" { let dest = segue.destination as! MyViewControllerName let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileName ="Image.jpg" let fileURL = documentsDirectory.appendingPathComponent(fileName) if let data = self.jpegData(compressionQuality: 1.0), //Error here !FileManager.default.fileExists(atPath: fileURL.path) { do { try data?.write(to: fileURL!) print("Image Saved") } catch { print("error saving file:", error) } } // Remaining code includes writing strings to realm not yet linked to the image.Path. This will be attempted once I can solve this error. } } |
更新-添加了更多代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public var imagePickerController: UIImagePickerController? public var defaultImageUrl: URL? internal var selectedImage: UIImage? { get { return self.selectedImageView.image } set { switch newValue { case nil: self.selectedImageView.image = nil self.selectImageButton.isEnabled = true self.selectImageButton.alpha = 1 self.removeImageButton.isEnabled = false self.removeImageButton.alpha = 0 default: self.selectedImageView.image = newValue self.selectImageButton.isEnabled = false self.selectImageButton.alpha = 0 self.removeImageButton.isEnabled = true self.removeImageButton.alpha = 1 } } } |
和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //image input codes @IBOutlet weak var selectedImageContainer: UIView! @IBOutlet weak var selectedImageView: UIImageView! @IBOutlet weak var selectImageButton: UIButton! { didSet { guard let button = self.selectImageButton else { return } button.isEnabled = true button.alpha = 1 } } @IBOutlet weak var removeImageButton: UIButton! { didSet { guard let button = self.removeImageButton else { return } button.isEnabled = false button.alpha = 0 } } |
中的相关信息
1 2 3 4 | override func viewDidLoad() { self.selectedImageView.contentMode = .scaleAspectFit self.selectImageButton.isEnabled = self.selectedImage == nil self.selectImageButton.alpha = 1 |
保存图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //MARK: -"Select to Add Photo" @IBAction func selectImageButton(_ sender: Any) { if self.imagePickerController != nil { self.imagePickerController?.delegate = nil self.imagePickerController = nil } self.imagePickerController = UIImagePickerController.init() let alert = UIAlertController.init(title:"Select Source Type", message: nil, preferredStyle: .actionSheet) if UIImagePickerController.isSourceTypeAvailable(.camera) { alert.addAction(UIAlertAction.init(title:"Camera", style: .default, handler: { (_) in self.presentImagePicker(controller: self.imagePickerController!, source: .camera) })) } if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { alert.addAction(UIAlertAction.init(title:"Photo Library", style: .default, handler: { (_) in self.presentImagePicker(controller: self.imagePickerController!, source: .photoLibrary) })) } alert.addAction(UIAlertAction.init(title:"Cancel", style: .cancel)) self.present(alert, animated: true) } internal func presentImagePicker(controller: UIImagePickerController , source: UIImagePickerController.SourceType) { controller.delegate = self controller.sourceType = source controller.allowsEditing = true self.present (controller, animated: true) } @IBAction func removeImageButtonAction(_ sender: UIButton) { self.selectedImage = nil } |
在我的扩展程序中,我有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | extension AddNewMealVC: UIImagePickerControllerDelegate, UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let image = info[.editedImage] as? UIImage { self.selectedImageView.image = image } else if let image = info[.originalImage] as? UIImage { self.selectedImageView.image = image } picker.dismiss(animated: true) { picker.delegate = nil self.imagePickerController = nil } } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true) { picker.delegate = nil self.imagePickerController = nil } } } |
jpegData是UIImage的实例方法。让我们使用:
1 | selectedImageView.image?.jpegData() |