2016-06-22 11 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) 

より良い):

01この機能を使用し、画像を取得するために、次に

saveImage(image, path: imagePath) 

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 

} 

あなたはこのようにそれを呼ぶだろう

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にどのような変数を使用しますか? UIImagePickerControllerから来ると思われるUIImage変数をどこで、いつ定義するのかはわかりません。 – 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) 

    } 

イメージを使用する場合は、イメージパスを再度使用してUIImageに変換します。

2

使用この方法:以下のようにあなたのイメージの引数を持つ:

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

私はスイフト3でうまく働いてくれました。ありがとう! –

関連する問題