如何使用swift拍照并保存到本地应用程序

Posted

技术标签:

【中文标题】如何使用swift拍照并保存到本地应用程序【英文标题】:How to take a picture and save it to the app locally with swift 【发布时间】:2016-06-22 22:14:34 【问题描述】:

我正在开发一个应用程序,在当前阶段,当用户拍照时,图片将存储在应用程序本地。

 @IBAction func CameraAction(sender: UIButton) 
let picker = UIImagePickerController()
    picker.delegate = self
    picker.sourceType = .Camera
    picker.allowsEditing = true
    self.presentViewController(picker, animated: true, completion: nil)


func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 
    picker.dismissViewControllerAnimated(true, completion: nil)

    //Save image
    let img = UIImage()
    let data = UIImagePNGRepresentation(img)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "myImageKey")
    NSUserDefaults.standardUserDefaults().synchronize()
    NSLog("Image stored?")
    viewDidLoad()



根据我上面的内容,我的 iPhone 打开了它的相机,我可以拍照了。当我点击捕获和“使用此图像”选项时,我认为图片实际上并没有被存储,因为我无法调用这些图片。

所以我寻求帮助,了解如何在本地存储从 UIImagePickerController 拍摄的图片,可能在文档文件夹中,如何调用它,以及如何没有 NSUserDEfaults。谢谢。

【问题讨论】:

我不建议将图像存储在 NSUserDefaults 中:图像的大小会导致崩溃和巨大的性能问题。 对了,我忘了说我看到不推荐。我正在寻找存储图像的替代方法。谢谢。 您没有为 didFinishPickingImage 使用 UIImage 图像。它不应该在那里吗? 【参考方案1】:

这就是你在 NSUserDefaults 中存储图像的方式:

正如我在评论中提到的,不建议这样做,如果用于多个图像,可能会导致严重的性能损失甚至崩溃。

let image = UIImage(named: "myImage")
let pngImage = UIImagePNGRepresentation(image) 
            
NSUserDefaults.standardUserDefaults().setObject(pngImage, forKey: "image")
            
            

并检索图像:

var retrievedImage = NSUserDefaults.standardUserDefaults().objectForKey("image") as! AnyObject

然后,显示图像:

imageView.image = UIImage(data: retrievedImage as! NSData)

这是将图像存储到文件的方法(更好):

func saveImage (image: UIImage, path: String ) -> Bool
    
    let pngImageData = UIImagePNGRepresentation(image)
    //let jpgImageData = UIImageJPEGRepresentation(image, 1.0)   // if you want to save as JPEG
    let result = pngImageData!.writeToFile(path, atomically: true)
    
    return result
    

你可以这样称呼它:

saveImage(image, path: imagePath)

然后,要检索图像,请使用此函数:

func loadImageFromPath(path: String) -> UIImage? 
    
    let image = UIImage(contentsOfFile: path)
    
    if image == nil 
        
        print("missing image at: \(path)")
    
    print("Loading image from path: \(path)") // this is just for you to see the path in case you want to go to the directory, using Finder.
    return image
    

你可以这样称呼它:

image = loadImageFromPath(imagePath)
        imageView.image = image

更多详情请关注http://helpmecodeswift.com/image-manipulation/saving-loading-images

此外,正如 Frederik 指出的那样,您实际上并未使用示例中选择的图像。

您保存了一个尚未分配的空变量“img”。您需要保存“图像”,选择器完成后返回的变量。

获取图像的方法如下:

这个函数返回变量'image'

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 
picker.dismissViewControllerAnimated(true, completion: nil)

然后您可以继续使用它,例如

imageView.image = image  

或许

 saveImage(image, path: imagePath)  

祝你好运!

【讨论】:

调用 saveimage 函数时,我会为 UIImage 使用什么变量?我不知道我会在何时何地定义一个我猜来自 UIImagePickerController 的 UIImage 变量。 @acday 你已经有了这个变量:它是由函数提供的,名字是'image'【参考方案2】:

使用这个方法:你的图片参数如下:

UIImageWriteToSavedPhotosAlbum(imagePicked, nil, nil, nil)

【讨论】:

在 Swift 3 中非常适合我。谢谢!【参考方案3】:
let fileDirectory : NSURL  = 
       return try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory , inDomain: .UserDomainMask , appropriateForURL: nil, create: true)
   ()


func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 
    picker.dismissViewControllerAnimated(true, completion: nil)

    //save to album 
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

   //or to documents 
   //If you want to use png you have to change it later in saveImageToDocumentMethod in the guard statement
   saveImageToDocuments(image, filenameWithExtension: "test.jpg")



func saveImageToDocuments(image: UIImage, fileNameWithExtension: String)

       let imagePath = fileDirectory.URLByAppendingPathComponent("\(fileNameWithExtension)")

       guard let imageData = UIImageJPEGRepresentation(image, 1) else 
           // handle failed conversion
           print("jpg error")
           return
       
       imageData.writeToFile((imagePath.path)!, atomically: true)

   

当您想使用该图像时,您只需再次使用 imagePath 并将其转换为 UIImage。

【讨论】:

以上是关于如何使用swift拍照并保存到本地应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何拍照并同时保存(swift3)

使用swift在iOS上本地保存和检索包含所有元数据的照片

如何将蒙版应用于保存图像(swift3)

Android下载图片/调用系统相机拍照显示并保存到本地

我做了一个启动相机的PhoneGap应用程序,拍照并保存到SD卡。如何让该图片以 HTML 格式显示?

保存照片并检索资产时,应用图片中的 Swift Camera 不保存 GPS 信息?