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的示例代码吗