如何使用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拍照并保存到本地应用程序的主要内容,如果未能解决你的问题,请参考以下文章