Categories
SugiBlog ホームページ制作・システム開発

カメラで写真を撮影する UIImagePickerController

システムのカメラ機能を使って写真を撮影します。
特に考えることなく、簡単に実装できますので試してみてください。

簡単に実装できますが、カスタマイズすることができないので、
カスタマイズしたい方はAVFoundationを利用してください。

カメラ利用の許可

まずはカメラを利用するためInfo.plistにカメラの利用許可を追加します。
また、写真を撮影するということは保存するためにフォトライブラリーにアクセスしますので、そちらも一緒に追加します。

Privacy - Camera Usage Description
Privacy - Photo Library Usage Description

Valueには「写真を撮影します。」「写真を保存します。」等と設定します。

デリゲート

UIImagePickerControllerDelegateとUINavigationControllerDelegateを設定します。
後者が必要なのはUIImagePickerControllerの親クラスがUINavigationControllerのためです。

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

Viewの配置

StoryBoardでViewControllerにViewと、カメラ起動と保存ボタンの2つのButtonを配置します。

配置したViewを「previewView」としてOutlet接続します。

@IBOutlet weak var previewView: UIView!

カメラ起動

カメラ起動のButtonはAction接続して「cameraStart」メソッドを実行させます。

@IBAction func cameraStart(_ sender: Any) {
    let sourceType: UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.camera

    // カメラが利用可能かチェック
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
        // インスタンスの作成
        let cameraPicker = UIImagePickerController()
        cameraPicker.sourceType = sourceType
        cameraPicker.delegate = self

        self.present(cameraPicker, animated: true, completion: nil)
    } else {
        print("error")
    }
}

撮影が完了したらpreviewViewに表示します。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        previewView.contentMode = .scaleAspectFit
        previewView.image = pickedImage
    }

    // 閉じる処理
    self.dismiss(animated: true, completion: nil)
}

撮影をキャンセルした時

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    self.dismiss(animated: true, completion: nil)
    print("cancel")
}

撮影した写真を保存する

保存ボタンをAction接続し、写真を保存させます。

// 写真を保存
@IBAction func savePicture(_ sender: Any) {
    let image: UIImage! = previewView.image
    
    if image != nil {
        UIImageWriteToSavedPhotosAlbum(image, self, #selector(ViewController.imageSave(_:didFinishSavingWithError:contextInfo:)), nil)
    } else {
        print("failed")
    }
}

書き込み完了の結果を受け取ります。

func imageSave(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) {
    if error != nil {
        print(error.code)
    } else {
        print("succeed")
    }
}
74 views

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*