【问题标题】:Saving image to .documentsDirectory, and as a String to store path in local Realm将图像保存到 .documentsDirectory,并作为字符串存储在本地领域中的路径
【发布时间】:2020-10-14 01:26:02
【问题描述】:

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

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

首先,我不确定我是否为此采取了正确的方法。请指导我找到最适合在本地保存图像的解决方案。

我只看过少数几个网站、Stack Overflow 问题并且几乎没有任何视频,所以有些事情告诉我有一种更有效的方法可以完成此任务。 Saving Picked Image to CoreData, How to put an image in a Realm database?how to use writeToFile to save image in document directory? 引导我尝试将图像保存到目录中,尤其是最后一个 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?

@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.

        }
    }

更新 - 添加更多代码

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

 //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中的相关信息

override func viewDidLoad() {
        self.selectedImageView.contentMode = .scaleAspectFit
        self.selectImageButton.isEnabled = self.selectedImage == nil
        self.selectImageButton.alpha = 1

保存图片

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

在我的扩展中

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

【问题讨论】:

  • "保存图像" 图像在哪里?我没有看到任何代码行表明您有图像。
  • @ElTomato,我已经为图片添加了相关代码。它看起来相当复杂,因为我已经从多个来源进行了改编!
  • 让 image = selectedImageView.image; if let data = UIImageJPEGRepresentation(image, 1.0) { 试试? data.write(to: fileURL as URL) }
  • 感谢@ElTomato。我认为,根据 nghiahoang 的回答,我已经部分解决了它。如何获得文件路径的打印输出?

标签: swift directory save realm jpeg


【解决方案1】:

jpegData 是 UIImage 的一个实例方法。让我们使用:

selectedImageView.image?.jpegData()

【讨论】:

  • 我添加了这个并得到了打印输出“图像已保存”。我再次尝试使用第二张图像,它在输出中没有显示任何内容。会不会是因为它试图将图像保存为已经存在的文件名?
  • 是的,你必须检查文件是否存在
  • 我将如何实现这一目标?
  • if FileManager.default.fileExists(atPath: path) { } 可以通过 FileManager.default.removeItem(atPath: path) 删除已存在的
  • 确认一下,我的代码已经有!FileManager.default.fileExists(atPath: fileURL.path)。这是我的代码正在检查现有文件的地方吗?我将保存的图像命名为当前日期和时间会更好吗,因为每次调用代码时将保存的所有图像都需要保留。
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 2018-11-04
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多