Swift - カメラで写真を撮る方法

ここでは、Swift でカメラで写真を撮る方法をご説明します。

今回は、次のように Take Photo というボタンをタップした時に、カメラが起動して写真を撮り、元の画面に撮った写真が表示されるアプリを作ります。

カメラで写真を撮る iOS アプリの準備をする

まずはテスト用にボタンをタップして、カメラを起動し、写真を撮るための iOS アプリを作ります。

新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。

Xcode で [iOS] の [App] の新規プロジェクトを作成します。

デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に撮った写真を表示するための Image View と、カメラを起動するための Button をひとつ追加します。

ボタンの Title を Take Photo にしておきます。

Swift - カメラで写真を撮る方法 1


UIImageView から、imageView という名前でアウトレットを作っておきます。

Swift - カメラで写真を撮る方法 2

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Take Photo ボタンから、takePhotoTapped という名前で TouchUpInside のアクションを作っておきます。

Swift - カメラで写真を撮る方法 3

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func takePhotoTapped(_ sender: Any) {
    }
}

Swift でカメラで写真を撮る方法

それでは、Swift で iOS アプリからカメラを起動し、写真を撮るコードを書いていきましょう。

まず、iOS アプリ内でカメラを使うので、info.plist に Privacy - Camera Usage Description (NSCameraUsageDescription) を追加しておきます。

Swift - カメラで写真を撮る方法 4

Swift - カメラで写真を撮る方法 5


次に ViewController で UIImagePickerController からのイベント受け取るために、UIImagePickerControllerDelegate と UINavigationControllerDelegate をコンフォームしておきます。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func takePhotoTapped(_ sender: Any) {
    }
}

続いて、Take Photo ボタンをタップした時に UIImagePickerController を生成して表示するコードを書きます。

先ほど、作った ViewController.swift の takePhotoTapped() を次のように変更します。

@IBAction func takePhotoTapped(_ sender: Any) {
    if UIImagePickerController.isSourceTypeAvailable(.camera) {
        let imagePicker = UIImagePickerController()
        imagePicker.sourceType = .camera
        imagePicker.delegate = self
        self.present(imagePicker, animated: true, completion: nil)
    }
    else {
        print("Camera not available.")
    }
}

2 行目でカメラが利用可能かチェックしています。

3 行目で UIImagePickerController を生成し、4 行目で sourceType を camera に設定しています。

5 行目の imagePicker.delegate = self で ImagePickerController が送ってくるイベントをこの View Controller が受けとるようにしています。

6 行目の self.present() メソッドで、生成した UIImagePickerController を表示し、カメラを起動します。


ユーザーが写真を撮って Use Photo をタップした時に、imagePickerController(_:didFinishPickingMediaWithInfo:) メソッドが実行されるので、その中で撮った写真を Image Viwer に表示します。

カメラの下の Retake、Use Photo のボタンを「再撮影」「写真を使用」のように日本語にしたい時は info.plist に Localization native development region (CFBundleDevelopmentRegion) を追加して Japan (ja_JP) を指定することで変更できます。

Swift - カメラで写真を撮る方法 6

Swift - カメラで写真を撮る方法 7


ViewController クラスに以下の imagePickerController(_:didFinishPickingMediaWithInfo:) メソッドを追加します。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true)

    guard let image = info[.originalImage] as? UIImage else {
        print("Image not found.")
        return
    }

    imageView.image = image
}

2 行目では表示していた UIImagePickerController を閉じています。

引数の info という dictionary にカメラで撮った画像が入っています。 4 ~ 7 行目では、そこから guard let で originalImage を取得して、取得できなかったら時はエラーメッセージをプリントして return しています。

9 行目で、取得した画像を imageView.image に入れて、画面に表示しています。


これで、Swift で iOS アプリからカメラを起動し、写真を撮るコードが書けました。

できあがった ViewController.swift を載せておきます。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func takePhotoTapped(_ sender: Any) {
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.sourceType = .camera
            imagePicker.delegate = self
            self.present(imagePicker, animated: true, completion: nil)
        }
        else {
            print("Camera not available.")
        }
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true)

        guard let image = info[.originalImage] as? UIImage else {
            print("Image not found.")
            return
        }

        imageView.image = image
    }
}

iOS アプリを iPhone にインストールしてテストする

写真を撮るテストはシミュレーターでできないので、iPhone にインストールしてテストします。

作った iOS アプリを iPhone にインストールする方法がわからない方は「Xcode からアプリを iPhone にインストールして実行する方法」をご覧ください。


iPhone を指定してこのアプリを実行すると、以下のような画面が表示されるので、Take Photo ボタンをタップします。

Swift - カメラで写真を撮る方法 8


カメラの利用許可を求めるダイアログが表示されるので、OK をタップします。

Swift - カメラで写真を撮る方法 9


カメラが起動するので、写真を撮ります。

Swift - カメラで写真を撮る方法 10


この写真でよければ、Use Photo をタップします。撮り直したい時は Retake をタップして撮り直してください。

Swift - カメラで写真を撮る方法 11


Use Photo をタップすると、カメラが閉じ、元の画面に戻って、撮った写真が画面に表示されます。

Swift - カメラで写真を撮る方法 12


以上、Swift でカメラで写真を撮る方法をご説明しました。

© 2024 iOS 開発入門