25
Copyright © Up-frontier, Inc. All rights reserved. iOS 10 new Camera 1

iOS 10 new Camera

  • Upload
    gaprot

  • View
    241

  • Download
    2

Embed Size (px)

Citation preview

Page 1: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

iOS 10 new Camera

1

Page 2: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

⽬次1. カメラ機能について

2. AVCapturePhotoOutput

3. AVCapturePhotoSettings

4. 実装

5. iPhone7Plus のデュアルカメラ

2

Page 3: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

カメラ機能について

3

Page 4: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

従来の⽅法

従来iOSで写真撮影といえば

UIImagePickerController

AVFoundation

を使⽤する⽅法の2つが良く使われる

4

Page 5: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

従来の⽅法

従来iOSで写真撮影といえば

UIImagePickerController

AVFoundation

を使⽤する⽅法の2つが良く使われる

今回のメインはコレ

5

Page 6: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

iOS 10 は?

iOS 10 では AVFoundation の中の AVCaptureStillImageOutput が deprecated になった

そのため別な⽅法として AVCapturePhotoOutput を使⽤する

6

Page 7: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCapturePhotoOutput

7

Page 8: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCapturePhotoOutput とは

静⽌画撮影をサポートする

AVCaptureOutput のサブクラス

AVCaptureStillImageOutput の代わりとして使⽤

様々なインターフェースが実装されている

使⽤可能なのは iOS 10 から

8

Page 9: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

撮影

AVCapturePhotoOutput の capturePhoto

呼ぶ際にデータを作成するための設定を渡す

AVCapturePhotoSettings

AVCapturePhotoCaptureDelegate

9

Page 10: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

撮影

AVCapturePhotoOutput の capturePhoto

呼ぶ際にデータを作成するための設定を渡す

AVCapturePhotoSettings

AVCapturePhotoCaptureDelegate

画像効果等の設定

10

Page 11: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

撮影

AVCapturePhotoOutput の capturePhoto

呼ぶ際にデータを作成するための設定を渡す

AVCapturePhotoSettings

AVCapturePhotoCaptureDelegate

画像効果等の設定

結果の返ってくる Delegate

11

Page 12: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCapturePhotoSettings

12

Page 13: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCapturePhotoSettings とは

写真のキャプチャに関する設定を記述する

画像に対しての効果などもここに記述

フラッシュのモード

ハイレゾの使⽤

13

Page 14: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCapturePhotoSettings とは

このインスタンスは使い回しができない

使い回しをしようとすると例外が発⽣

再利⽤するためのメソッドが⽤意してある

init(from:) に使い回したい settings を渡す

14

Page 15: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

実装

15

Page 16: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCaptureSession の設定基本的なコードは従来と変わらない

session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()

16

Page 17: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCaptureSession の設定基本的なコードは従来と変わらない

session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()

AVCapture Session の設定

17

Page 18: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCaptureSession の設定基本的なコードは従来と変わらない

session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()

AVCapture Session の設定

プレビューを表⽰する⽤のレイヤー作成

18

Page 19: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCaptureSession の設定基本的なコードは従来と変わらない

session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()

AVCapture Session の設定

プレビューを表⽰する⽤のレイヤー作成

デバイスの設定

19

Page 20: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

AVCaptureSession の設定基本的なコードは従来と変わらない

session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()

実際に変わるのはここ!

20

Page 21: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

コード func takePicture(){ let settingsForMonitoring = AVCapturePhotoSettings() settingsForMonitoring.flashMode = .auto settingsForMonitoring.isAutoStillImageStabilizationEnabled = true settingsForMonitoring.isHighResolutionPhotoEnabled = false // settings と delegate を渡す photoOutput?.capturePhoto(with: settingsForMonitoring, delegate: self) }

extension ViewController:AVCapturePhotoCaptureDelegate{ func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { /* ~~ ここでデータを保存したり画像の加⼯を⾏う ~~*/ } }

21

Page 22: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

コード func takePicture(){ let settingsForMonitoring = AVCapturePhotoSettings() settingsForMonitoring.flashMode = .auto settingsForMonitoring.isAutoStillImageStabilizationEnabled = true settingsForMonitoring.isHighResolutionPhotoEnabled = false // settings と delegate を渡す photoOutput?.capturePhoto(with: settingsForMonitoring, delegate: self) }

extension ViewController:AVCapturePhotoCaptureDelegate{ func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { /* ~~ ここでデータを保存したり画像の加⼯を⾏う ~~*/ } }

ここでAVCapturePhotoSettingsを設定している

22

Page 23: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

iPhone 7 Plus の デュアルカメラ

23

Page 24: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

デュアルカメラ

• iPhone 7 plus には背⾯に 2 つのカメラがついてる

• カメラアプリでそれらを指定して使⽤することが出来るのかどうか確認した

24

Page 25: iOS 10 new Camera

Copyright © Up-frontier, Inc. All rights reserved.

⽚⽅のカメラの指定AVCaptureDevice.defaultDevice(withDeviceType: mediaType: position:)

上記メソッドの withDeviceType に設定

builtInWideAngleCamera : 左カメラ

builtInTelephotoCamera : 右カメラ

指定しない版のメソッドなら左カメラ

25