2016-06-22 66 views
4

我正在研究一個應用程序,在當前階段當用戶拍照時,照片將存儲在本地應用程序中。如何拍照並將其保存到本地的應用程序

@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。謝謝。

+0

我不建議在存儲NSUserDefaults的圖片:圖片的大小會導致崩潰和巨大的性能問題。 – GJZ

+0

對,我忘了提及我看到它不被推薦。我正在尋找替代方法來存儲圖像我猜。謝謝。 – acday

+0

您不使用didFinishPickingImage的UIImage圖像。它不應該在那裏嗎? – FredericP

回答

7

這是你將如何存儲在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'。您需要保存'圖像',這是您在選取器完成後返回的變量。

這裏是你如何獲得圖像:

該函數返回變量「形象」

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

然後,您可以繼續前進,只是用它例如

imageView.image = image 

也許

saveImage(image, path: imagePath) 

祝你好運!

+0

當調用saveimage函數時,我將爲UIImage使用哪個變量?我不知道在哪裏或什麼時候定義一個UIImage變量,我猜想它來自UIImagePickerController。 – acday

+0

@acday你已經有了這個變量:它是由函數提供的,並且名字爲'image' – GJZ

0
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。

2

使用這種方法:用你的形象的說法如下:

UIImageWriteToSavedPhotosAlbum(imagePicked, nil, nil, nil) 
+0

在Swift 3中工作得非常好。謝謝! –

相關問題