LoginSignup
6
7

More than 5 years have passed since last update.

写真撮影アプリ最小構成(Swift)

Last updated at Posted at 2018-09-13

写真撮影App

1. ユーザ許可

info.plistでカメラが使えるように設定する。
今回は、Privacy - Camera Usage DescriptionPrivacy - Photo Library Additions Usage Descriptionの二項目を加える。


スクリーンショット 2018-09-13 14.53.21.png

2. コード入力

ViewController.swift
import UIKit
import AVFoundation

//ジャスチャー
struct CommonStructure {
    static var tapGesture = UITapGestureRecognizer()
    //static var swipeGestureUP = UISwipeGestureRecognizer()
}

class ViewController: UIViewController, AVCapturePhotoCaptureDelegate {

    var cameraView = UIImageView()

    //キャプチャセッションに入力(オーディオやビデオなど)を提供し、ハードウェア固有のキャプチャ機能のコントロールを提供するデバイス。
    var captureDevice  = AVCaptureDevice.default(for: .video)
    var photoOutput: AVCapturePhotoOutput? = AVCapturePhotoOutput() //静止画、ライブ写真、その他の写真ワークフローの出力をキャプチャします。

    override func viewDidLoad() {
        super.viewDidLoad()

        var deviceInput_pre: AVCaptureDeviceInput!//3入力
        var deviceInput_nex: AVCaptureDeviceInput!//3入力
        let captureSesion = AVCaptureSession()//2セッション

        captureSesion.sessionPreset = AVCaptureSession.Preset.hd1920x1080// 解像度の設定

        cameraView.frame = view.frame
        if cameraView.frame.width != 0 {
            captureSesion.beginConfiguration()//一連の構成変更の開始を示します。
            captureSesion.commitConfiguration()//一連の構成変更をコミットします。
        }

        do {
            deviceInput_pre = try AVCaptureDeviceInput(device: captureDevice!)
            deviceInput_nex = try AVCaptureDeviceInput(device: captureDevice!)
            // 入力
            if  captureSesion.canAddInput(deviceInput_nex) {
                captureSesion.removeInput(deviceInput_pre)
                captureSesion.addInput(deviceInput_nex)
                // 出力
                if (captureSesion.canAddOutput(photoOutput!)) {
                    captureSesion.addOutput(photoOutput!)

                    captureSesion.startRunning()// カメラ起動

                    //プレビュー
                    let previewLayer: AVCaptureVideoPreviewLayer? = AVCaptureVideoPreviewLayer(session: captureSesion)//キャプチャされているときにビデオを表示できるコアアニメーションレイヤ-
                    previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill// アスペクトフィット
                    previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait// カメラの向き
                    previewLayer?.frame =  cameraView.frame
                    cameraView.layer.addSublayer(previewLayer!)
                }
            }
        } catch {
            print(error)
        }
        view.addSubview(cameraView)
        //ジャスチャー
        CommonStructure.tapGesture = UITapGestureRecognizer(target: self,action:#selector(tapGesture))
        self.view.addGestureRecognizer( CommonStructure.tapGesture)
    }

    @objc func tapGesture(sender:UITapGestureRecognizer) {
        self.photoOutput?.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
    }
    // フォトライブラリへの保存メソッド
    func photoOutput(_ output: AVCapturePhotoOutput,
                     didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {

        let photoData = photo.fileDataRepresentation()

        //A. DocumentsDirectoryに保存
        let documentsPath = NSHomeDirectory() + "/Documents"
        let storeURL = URL(fileURLWithPath:documentsPath).appendingPathComponent(UUID().uuidString)
        do {
            let _ = try photoData?.write(to: storeURL)
        } catch {
            print("error")
            return // FIXME: Alert error
        }
        //B. フォトライブラリに保存
        //UIImageWriteToSavedPhotosAlbum(UIImage(data: photoData!)!, nil, nil, nil)
    }
 }
6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7