Ios 是否保存对摄影机卷中图像的引用,以便稍后在应用程序中调用?

Ios 是否保存对摄影机卷中图像的引用,以便稍后在应用程序中调用?,ios,swift,uiimage,uiimagepickercontroller,Ios,Swift,Uiimage,Uiimagepickercontroller,我试图让用户在ImagePickerController中拍摄或选择图像,我希望在我的应用程序中保存一个引用(尽可能高效),以便在再次加载应用程序时调用。保存图像的文件URL是最好的方法吗 import UIKit import SwiftUI struct ImagePicker: UIViewControllerRepresentable { var sourceType: UIImagePickerController.SourceType = .photoLibrar

我试图让用户在
ImagePickerController
中拍摄或选择图像,我希望在我的应用程序中保存一个引用(尽可能高效),以便在再次加载应用程序时调用。保存图像的文件URL是最好的方法吗

import UIKit
import SwiftUI

struct ImagePicker: UIViewControllerRepresentable {
    
    var sourceType: UIImagePickerController.SourceType = .photoLibrary
    
    @Binding var selectedImage: UIImage
    @Environment(\.presentationMode) private var presentationMode

    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
        
        let imagePicker = UIImagePickerController()
        imagePicker.allowsEditing = false
        imagePicker.sourceType = sourceType
        imagePicker.delegate = context.coordinator
        
        return imagePicker
    }
    
    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
        
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        
        var parent: ImagePicker
        
        init(_ parent: ImagePicker) {
            self.parent = parent
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            
            if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
                parent.selectedImage = image
            }
            
            if let imgUrl = info[UIImagePickerController.InfoKey.imageURL] as? URL{
                let imgName = imgUrl.lastPathComponent
                let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
                let localPath = documentDirectory?.appending(imgName)
                
                let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
                let data = image.pngData()! as NSData
                data.write(toFile: localPath!, atomically: true)
                //let imageData = NSData(contentsOfFile: localPath!)!
                let photoURL = URL.init(fileURLWithPath: localPath!)//NSURL(fileURLWithPath: localPath!)
                print(photoURL)
                //TODO save this url in my app as a reference to look up
                
            }
            
            parent.presentationMode.wrappedValue.dismiss()
        }
    }
}
导入UIKit
导入快捷键
结构图像选择器:UIViewControllerRepresentable{
变量sourceType:UIImagePickerController.sourceType=.photoLibrary
@绑定变量SelecteImage:UIImage
@环境(\.presentationMode)私有变量presentationMode
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->UIImagePickerController{
让imagePicker=UIImagePickerController()
imagePicker.allowsEditing=false
imagePicker.sourceType=源类型
imagePicker.delegate=context.coordinator
返回图像选择器
}
func updateUIViewController(uViewController:UIImagePickerController,上下文:UIViewControllerRepresentableContext){
}
func makeCoordinator()->Coordinator{
协调员(自我)
}
最终类协调器:NSObject、UIImagePickerControllerDelegate、UINavigationControllerDelegate{
var父对象:ImagePicker
init(uu父对象:ImagePicker){
self.parent=parent
}
func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[UIImagePickerController.InfoKey:Any]){
如果让image=info[UIImagePickerController.InfoKey.originalImage]作为?UIImage{
parent.selectedImage=image
}
如果让imgUrl=info[UIImagePickerController.InfoKey.imageURL]作为?URL{
设imgName=imgUrl.lastPathComponent
让documentDirectory=NSSearchPathForDirectoriesInDomains(.documentDirectory、.userDomainMask,true)。首先
让localPath=documentDirectory?.appending(imgName)
将image=info[UIImagePickerController.InfoKey.originalImage]设为!UIImage
让data=image.pngData()!作为NSData
data.write(toFile:localPath!,原子性:true)
//让imageData=NSData(contentsOfFile:localPath!)!
让photoURL=URL.init(fileURLWithPath:localPath!)//NSURL(fileURLWithPath:localPath!)
打印(照片URL)
//TODO将此url保存在我的应用程序中作为参考以进行查找
}
parent.presentationMode.wrappedValue.disclease()
}
}
}
编辑: 当然,您也可以使用
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
}
检索图像数据

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
}

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

//标记:保存和检索图像
扩展UIImage{
func saveImage(图像名称:字符串){
guard let documentsDirectory=FileManager.default.URL(用于:.documentDirectory,位于:.userDomainMask中)。首先是{return}
让fileName=imageName
让fileURL=documentsDirectory.appendingPathComponent(文件名)
guard let data=self.jpegData(压缩质量:1)else{return}
//检查文件是否存在,如果存在,将其删除。
如果FileManager.default.fileExists(atPath:fileURL.path){
做{
尝试FileManager.default.removietem(atPath:fileURL.path)
打印(“已删除的旧图像”)
}接住让我走错{
打印(“无法删除路径处的文件”,removeError)
}
}
做{
尝试数据写入(到:fileURL)
}捕捉错误{
打印(“保存文件时出错”,错误)
}
}
静态func loadImageFromDiskWith(文件名:字符串)->UIImage{
让documentDirectory=FileManager.SearchPathDirectory.documentDirectory
让userDomainMask=FileManager.SearchPathDomainMask.userDomainMask
让path=NSSearchPathForDirectoriesInDomains(documentDirectory,userDomainMask,true)
如果让dirPath=path.first{
让imageUrl=URL(fileURLWithPath:dirPath)。追加路径组件(文件名)
让image=UIImage(contentsOfFile:imageUrl.path)
返回图像
}
归零
}
静态函数removeImage(文件名:字符串){
guard let documentsDirectory=FileManager.default.URL(用于:.documentDirectory,位于:.userDomainMask中)。首先是{return}
让fileURL=documentsDirectory.appendingPathComponent(文件名)
如果FileManager.default.fileExists(atPath:fileURL.path){
做{
尝试FileManager.default.removietem(atPath:fileURL.path)
打印(“删除的图像”)
}接住让我走错{
打印(“无法删除路径处的文件”,removeError)
}
}
}
}
用法


yourmage.saveImage(imageName:“imageNameToSave”)//URL可能会更改,更好的方法是将图像保存到应用程序沙盒中的文件系统中,您可以保存给定名称或其他内容,以便在需要时检索它@Yodagama谢谢,你能告诉我一些保存到fi的示例代码吗