关于swift:将图像保存到.documentsDirectory,并作为字符串存储在本地Realm中

Saving image to .documentsDirectory, and as a String to store path in local Realm

我正在尝试保存(解析?)图像到我的领域的路径。为此,我尝试将图像另存为jpegData到documentDirectory。

我要保存的图像不需要保存到用户照片库中,只需在应用程序本身中引用和显示即可。

首先,我不确定是否要采取正确的方法。请向我介绍最适合在本地保存图像的解决方案。

我只看到了几个网站,Stack Overflow问题以及几乎没有任何视频,所以有些事情告诉我,有一种更有效的方法可以完成此任务。
将选择的图像保存到CoreData,
如何将映像放入Realm数据库中?以及如何使用writeToFile将图像保存在文档目录中?使我尝试将图像保存到目录中,尤其是最后的SO Question。

我有以下代码,但收到错误"Value of type 'MyViewControllerName' has no member jpegData"关于如何解决此错误或修改代码以保存图像的任何想法?

从照片库或照相机中选择后,我要保存的图像位于selectedImageView中。

我将self.jpegData更改为UIImage.jpegDataselectedImageView.jpegDataUIImageView.jpegData,以获取错误主机,包括Instance member 'jpegData' cannot be used on type 'UIImage'; did you mean to use a value of this type instead?

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
        }
    }

viewDidLoad

中的相关信息

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()