28604


<http://notoveryet-b.blogspot.jp/2015/08/swift.html>  
UIImagePickerControllerでフォトライブラリの画像を選択し、その後の操作で用いたい。  
上記サイトを参考に、下記コードで画像を選択するところまでは進めたのですが、画像がいったいどの変数に格納されているのかがわからず、その後の操作に進めません。  
photoやUIImage,self.photoImgView.imageと試したのですが不可能でした。  
画像の取り出しかたを教えてください。

[code]

    // カメラアイコンボタンの選択
    @IBAction func tapedPhotoBtn(sender: UIButton) {
    
        // フォトライブラリが使用可能か？
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
    
            // フォトライブラリの選択画面を表示
            let picker = UIImagePickerController()
            picker.delegate = self
            picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
            self.presentViewController(picker, animated: true, completion: nil)
        }
    }
    
    // 写真選択時に呼ばれる
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    
        // 選択した画像のオリジナルデータを取得
        if info[UIImagePickerControllerOriginalImage] != nil {
            if let photo: UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
    
                // ImageViewにその画像を設定 
                self.photoImgView.image = photo
            }
        }
    
        picker.dismissViewControllerAnimated(true, completion: nil)
    }
    
[/code]


CC BY-SA 3.0
2016-08-30T21:47:51.807
28590
2016-08-31T11:41:18.497
18443
question
swift uiimagepickercontroller
UIImagePickerControllerで選択した画像はどこに格納されてる？


`UIImagePickerController`で選択した画像は`UIImagePickerControllerDelegate`のメソッドである`imagePickerController(_:didFinishPickingMediaWithInfo:)`に渡される`info`の中にだけ存在します。

メソッドのパラメータの存在範囲はそのメソッド終了までですから、あなたが明示的にその画像をどこかに保存しない限り、メソッドが終了すればなくなってしまい、アクセスすることはできません。

例えば、後で使うためにどこかに保存するのであれば、よく使われるのはインスタンス変数でしょう。

[code]

    var pickedImage: UIImage? //選択されたイメージを保存するためのインスタンス変数
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    
        if info[UIImagePickerControllerOriginalImage] != nil {
            if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
                //後で使うためにその画像をインスタンス変数に保存
                self.pickedImage = image
                //画像が取得できたことを示すために何らかのUIの更新を行う(ボタンを使用可能にするなど)事が多い
                //...
            }
        }
    
        picker.dismissViewControllerAnimated(true, completion: nil)
    }
    
[/code]

ただ、黙ってインスタンス変数の内容を変更しても、それを使う処理をいずれ走らせないといけないですから、普通はすぐにその画像を使った処理を行います。(あなたの引用されたコード中の`self.photoImgView.image
= photo`がそれにあたります。)

もう少し複雑な処理を行う必要があるならば別メソッドを定義した上で、そのメソッドを`imagePickerController(_:didFinishPickingMediaWithInfo:)`の中から呼んでやることになるでしょう。

[code]

    //取得した画像に対する処理を行うメソッド
    func doSomethingWith(image: UIImage) {
        //...
    }
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    
        if info[UIImagePickerControllerOriginalImage] != nil {
            if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
                //すぐにその画像を使った処理を行う
                doSomethingWith(image)
            }
        }
    
        picker.dismissViewControllerAnimated(true, completion: nil)
    }
    
[/code]


CC BY-SA 3.0
2016-08-31T11:41:18.497
28604
2016-08-31T11:41:18.497
13972
28590
answer