カメラアプリを作ってみよう

Blog

 

今回、紹介するのはUIImagePickerControllerを使ってカメラアプリを作っていきます。

主に、カメラアプリはUIImgaePickerControllerかAVFoundationを使う。

 

 

この二つの違いは、

  • UIImagePickerControllerは実装が簡単だが、難しいことは出来ない。
  • AVFoundationは実装がやや難しいが、難しいことが出来る。

 

 

今回は、簡単に実装できるUIImagePickerControlllerを使いたいと思います。

なお、カメラはシュミレーターでは実行できないので実機で試します。

 

 

UIの実装

 

  • Buttonを3つ、ImageViewを1つ置く。
  • Buttonにそれぞれ「カメラ起動」「保存」「アルバム」と記入。

 

 

Action Outlet接続

 

  • ImageViewをOutlet接続。Nameを「imageView」に。
  • ButtonをAction接続。Nameをそれぞれ「camera」「save」「album」に。

 

 @IBOutlet weak var imageView: UIImageView!
 @IBAction func camera(_ sender: Any) {   
    }
 @IBAction func save(_ sender: Any) {
    }
 @IBAction func album(_ sender: Any) {
    }

 

 

 

 

Delegateの設定

 

  • UIImagePickerControllerDelegate, UINavigationControllerDelegateを記入。

 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

 

 

 

 

info.plistの設定

 

カメラを利用する際にinfo.plistに追加。

 

info.plistに追加するものが2つあります。

  • NSPhotoLibraryAddUsageDescription
  • NSCameraUsageDescription

をInfo.pistに追加します。

 

  • Info.plistを開いて、「+」をクリック。
  • 「NSPhotoLibraryAddUsageDescription」、「NSCameraUsageDescription」を追加。

 

 

 

 

必要なコードの記入

 

 

  • 撮影が完了した時、キャンセルされた時、書き込みが完了した時のコードを記入。

 

 

    // 撮影が完了時した時に呼ばれる
    func imagePickerController(_ imagePicker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [String : Any]) {
        
        if let pickedImage = info[UIImagePickerControllerOriginalImage]
            as? UIImage {
            
            imageView.contentMode = .scaleAspectFit
            imageView.image = pickedImage
            
        }
        //閉じる処理
        imagePicker.dismiss(animated: true, completion: nil)
    }
    
    // 撮影がキャンセルされた時に呼ばれる
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    
    }
    
    // 書き込み完了結果の受け取り
    @objc func image(_ image: UIImage,
                     didFinishSavingWithError error: NSError!,
                     contextInfo: UnsafeMutableRawPointer) {
        
        if error != nil {
            print(error.code)
           
        }
        else{
        print("ok!")
            
        }
    }

 

 

 

Actionボタンのコード記入

 

  • cameraボタンのコード記入

 

  @IBAction func camera(_ 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")
            
        }
        
    }

 

  • saveボタンのコード記入

 

 @IBAction func save(_ sender: Any) {
        
        let image:UIImage! = imageView.image
        
        if image != nil {
            UIImageWriteToSavedPhotosAlbum(image, self,
                                           #selector(ViewController.image(_:didFinishSavingWithError:contextInfo:)),
                                           nil)
        }
        else{
            print("error")
        }
    }

 

  • albumボタンのコード記入

 

  @IBAction func album(_ sender: Any) {
        
        let sourceType:UIImagePickerControllerSourceType =
            UIImagePickerControllerSourceType.photoLibrary
        
        if UIImagePickerController.isSourceTypeAvailable(
            UIImagePickerControllerSourceType.photoLibrary){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.present(cameraPicker, animated: true, completion: nil)
            
        }
        else{
            print("error")
        }
    }

 

これで完了です。

 

実機で実行して写真が撮れて、アルバムを起動できれば完成です。

UIimagePickerControllerは実装が簡単なため難しいことはできませんが、手軽にカメラを使いたい場合はおすすめです。

 

全コード

 

//
//  ViewController.swift
//  UIImagePickerControllerを使って写真を撮ってみよう
//
//
//

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    
    @IBOutlet weak var imageView: UIImageView!
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    
    @IBAction func camera(_ 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")
            
        }
        
    }
    
    @IBAction func save(_ sender: Any) {
        
        let image:UIImage! = imageView.image
        
        if image != nil {
            UIImageWriteToSavedPhotosAlbum(image, self,
                                           #selector(ViewController.image(_:didFinishSavingWithError:contextInfo:)),
                                           nil)
        }
        else{
            print("error")
        }
    }
    
    
    
    
    @IBAction func album(_ sender: Any) {
        
        let sourceType:UIImagePickerControllerSourceType =
            UIImagePickerControllerSourceType.photoLibrary
        
        if UIImagePickerController.isSourceTypeAvailable(
            UIImagePickerControllerSourceType.photoLibrary){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.present(cameraPicker, animated: true, completion: nil)
            
        }
        else{
            print("error")
        }
    }
    

    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    
    // 撮影が完了時した時に呼ばれる
    func imagePickerController(_ imagePicker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [String : Any]) {
        
        if let pickedImage = info[UIImagePickerControllerOriginalImage]
            as? UIImage {
            
            imageView.contentMode = .scaleAspectFit
            imageView.image = pickedImage
            
        }
        //閉じる処理
        imagePicker.dismiss(animated: true, completion: nil)
    }
    
    // 撮影がキャンセルされた時に呼ばれる
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    
    }
    
    // 書き込み完了結果の受け取り
    @objc func image(_ image: UIImage,
                     didFinishSavingWithError error: NSError!,
                     contextInfo: UnsafeMutableRawPointer) {
        
        if error != nil {
            print(error.code)
           
        }
        else{
        print("ok!")
            
        }
    }

}

 

 

 

 

実行結果 (実機: iPhone7)

 

 

 

以上で「UIImagePickerControllerを使って写真を撮ってみよう」の説明を終わります。

 

 

🤗

 

コメント