如何在Swift 5中将UIImage保存到UserDefaults

3

我试图将用户的图片保存到UserDefaults中,但无论如何都会收到错误信息“线程1:“尝试插入非属性列表对象(函数)作为键savedimage”,以下是我的代码

import UIKit

class productSelectionPage: UIViewController {
    @IBOutlet weak var productImageView: UIImageView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // Save image
        let image = UIImage(named: "user")
        let imageData = UIImage.jpegData(image)
        UserDefaults.standard.setValue(imageData, forKey: "savedImage")

    }
    @IBAction func offerButtonTapped(_ sender: UIButton) {
        // present image
        let imageData = UserDefaults.standard.object(forKey: "savedImage")
        let image = UIImage(data: (imageData as! NSData) as Data)
        productImageView.image = image
        // crash

        
        
    }
    

}

https://dev59.com/u2w15IYBdhLWcg3wYasx - ChanOnly123
1
不要将图像保存到UserDefaults中...它只适用于小量的信息(例如设置选项)。请将图像保存到本地存储中。 - DonMag
不,我需要使用UserDefaults在视图控制器之间共享照片,关闭后仍然有效,但我会重置UserDefaults。 - Мухаммед Аралбек
3个回答

9
尝试使用PropertyListEncoder()和Decoder()进行如下操作:
func saveImage() {
    guard let data = UIImage(named: "image").jpegData(compressionQuality: 0.5) else { return }
    let encoded = try! PropertyListEncoder().encode(data)
    UserDefaults.standard.set(encoded, forKey: "KEY")
}

func loadImage() {
     guard let data = UserDefaults.standard.data(forKey: "KEY") else { return }
     let decoded = try! PropertyListDecoder().decode(Data.self, from: data)
     let image = UIImage(data: decoded)
}

1
加载图像时显示白色背景。如何解决? - Muju

1
如果您曾经使用过Firebase,您会理解所有图像和视频都保存为数据而不是像素的情况。在保存到UserDefaults时采用了类似的方法。
// storing the image data

private func store(image: UIImage, forKey key: String, withStorageType storageType: StorageType) {

    if let pngRepresentation = image.pngData() {
        
            UserDefaults.standard.set(pngRepresentation, forKey: key)
        
    }
}

// retrieving the image data and getting an image

To retrieve it, we will take that image data

    private func retrieveImage(forKey key: String, inStorageType storageType: StorageType) -> UIImage? {
    
        if let imageData = UserDefaults.standard.object(forKey: key) as? Data, 
            let image = UIImage(data: imageData) {
            
            return image
        }
    }
}

-1

您可以像下面的代码一样,只需将图像简单地转换为数据,使用 UIImageViewextension

//MARK: -|||-To Store Image in Userdefault You can just Simply create an uiimageview extension-||| -
extension UIImageView{
    func saveImage(){
    guard let image = self.image, let data = image.jpegData (compressionQuality: 0.5) else { return }
      let encoded = try! PropertyListEncoder ().encode (data)
      UserDefaults.standard.set(encoded, forKey: "image")
    }
    func loadImage() {
        guard let data = UserDefaults.standard.data(forKey: "image") else { return }
        let decoded = try! PropertyListDecoder().decode(Data.self, from: data)
        let image = UIImage(data: decoded)
        self.image = image
    }
}

以下是如何使用此 扩展 的方法:

class ViewController: UViewController {
    @IBOutlet var sendImg: UIImageView!
    @IBOutlet var receiveImg: UlImageView!

    override func viewDidLoad(){
        super.viewDidLoad() {
        sendImg.saveImage()
    }

    @IBAction func loadImageFromUserDefault(_ sender: UIButton) {
        receiveImg.loadImage()
    } 
}

将图像保存在UserDefault中:

yourImage.saveImage()

UserDefault 获取图像:

yourImage.loadImage()

请将代码和数据作为文本添加(使用代码格式),而不是图像。 图像:A)不允许我们复制和粘贴代码/错误/数据进行测试; B)不允许基于代码/错误/数据内容进行搜索;以及更多原因。 如果图像除了文本代码/错误/数据之外还有其他重要信息,则应该在文本代码格式之外仅使用图像。 - Suraj Rao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接