在相机胶卷中保存对图像的引用以便稍后在应用程序中调用?

问题描述

我试图让用户在 C:\Users\user\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props 中拍摄或选择图像,并且我想在我的应用中保存一个参考(尽可能高效),以便在应用再次加载时调用。保存图片的文件 URL 是最好的方法吗?

<LibraryPath>

解决方法

相机胶卷图像的 URL 可能会改变,更好的方法是将您的图像保存到应用程序沙箱中的文件系统,您可以保存给定的名称或其他内容以在您需要时检索它

//MARK: save and retrive Images
extension UIImage {
    func saveImage(imageName: String) {
        
        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first else { return }
        
        let fileName = imageName
        let fileURL = documentsDirectory.appendingPathComponent(fileName)
        guard let data = self.jpegData(compressionQuality: 1) else { return }
        
        //Checks if file exists,removes it if so.
        if FileManager.default.fileExists(atPath: fileURL.path) {
            do {
                try FileManager.default.removeItem(atPath: fileURL.path)
                print("Removed old image")
            } catch let removeError {
                print("couldn't remove file at path",removeError)
            }
        }
        do {
            try data.write(to: fileURL)
        } catch let error {
            print("error saving file with error",error)
        }
        
    }
    
    static func loadImageFromDiskWith(fileName: String) -> UIImage? {
        
        let documentDirectory = FileManager.SearchPathDirectory.documentDirectory
        
        let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask
        let paths = NSSearchPathForDirectoriesInDomains(documentDirectory,userDomainMask,true)
        
        if let dirPath = paths.first {
            let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName)
            let image = UIImage(contentsOfFile: imageUrl.path)
            return image
        }
        return nil
    }
    
    static func removeImage(fileName: String){
        
        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first else { return }
        
        let fileURL = documentsDirectory.appendingPathComponent(fileName)
        
        if FileManager.default.fileExists(atPath: fileURL.path) {
            do {
                try FileManager.default.removeItem(atPath: fileURL.path)
                print("Removed image")
            } catch let removeError {
                print("couldn't remove file at path",removeError)
            }
        }
    }
    
}

用法

yourImage.saveImage(imageName: "imageNameToSave")//<-save
UIImage.loadImageFromDiskWith(fileName: "ImageNameToRetrive")//<-retrive
UIImage.removeImage(fileName: "ImageNameToRemove")//<-remove
,

编辑: 您当然也可以执行 FileManager,这实际上取决于您将保存多少文件以及要将它们保存到何处。如果它是一个微不足道的 1 文件,不需要保护并且对应用程序公开,那么 UserDefaults 是要走的路。如果您想对该文件添加更多控制权,FileManager 将是您的最佳选择。

UserDefaults 是您在本地存储的方式。

存储图像数据

func locallyStoreImgData(image: UIImage,key:String) {
    if let pngRepresentation = image.pngData() {
        UserDefaults.standard.set(pngRepresentation,forKey: key)
    }
    else {
        //Was unable to create png representation
    }
}

检索图像数据

func obtainImg(key:String) -> UIImage? {
    if let imageData = UserDefaults.standard.object(forKey: key) as? Data,let image = UIImage(data: imageData) {
        return image
    }
    return nil
}

用例

locallyStoreImgData(image: myImage,key: "myImageKey")

if let image = obtainImg(key: "myImageKey") {
    //Do something with image
}
else {
    //Was unable to recreate image
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...