问题描述
我试图让用户在 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
}