LoginSignup
9
6

More than 3 years have passed since last update.

AVFoundationのカメラ映像とプレビューのサイズが思ったように合わない時ってありますよね。
そんな時は、videoGravityで調整します。

【準備】AVCaptureVideoPreviewLayerの設定

let previewLayer = AVCaptureVideoPreviewLayer(session: avCaptureSession) // avCaptureSessionは任意のAVCaptureSessionとします
previewLayer.frame = previewView.bounds // previewViewは任意のUIViewとします
previewLayer.connection.videoOrientation = .portrait // 向きの設定
previewView.addSubLayer(previewLayer)

【本題】プレビューサイズの設定

カメラ映像全体が以下とします。
pexels-fotografierende-2397448.jpg
わかりやすいようにプレビューレイヤーは横長にします。

1、縦横比を保ったまま、レイヤーサイズ内に収める

pexels-tuấn-kiệt-jr-3830482.jpg

previewLayer.videoGravity = .resizeAspect

2、縦横比を変えて、レイヤーサイズを満たす

pexels-fotografierende-2397448.jpg

previewLayer.videoGravity = .resize

3、縦横比を保ったまま、レイヤーサイズを満たす

pexels-tuấn-kiệt-jr-3830482.jpg
映像の一部しか映りません。

previewLayer.videoGravity = .resizeAspectFill

4、おまけ:映像の真ん中だけプレビューする

11.png
カメラ映像のサイズが 1920 / 1080 で 上記画像のように真ん中の 810 / 1080 をプレビューしたいとします。

let previewViewSize = previewView.bounds.size // previewViewは任意のUIViewとします
let widthAspect = previewViewSize.width / 1080
let heightAspect = previewViewSize.height / 810
print(widthAspect,heightAspect)
previewLayer?.frame = CGRect(x: -(1080 / 2) * widthAspect, y: -(810/ 2) * heightAspect, width: 1080 * widthAspect, height: 1920 * heightAspect)
previewView.layer.addSublayer(previewLayer!)
previewLayer.videoGravity = .resizeAspect

プレビューレイヤーをビューより大きくして、はみ出させて真ん中だけビューから見えています。

🐣


お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

9
6
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
9
6