AVFoundationのカメラ映像とプレビューのサイズが思ったように合わない時ってありますよね。
そんな時は、videoGravityで調整します。
【準備】AVCaptureVideoPreviewLayerの設定
let previewLayer = AVCaptureVideoPreviewLayer(session: avCaptureSession) // avCaptureSessionは任意のAVCaptureSessionとします
previewLayer.frame = previewView.bounds // previewViewは任意のUIViewとします
previewLayer.connection.videoOrientation = .portrait // 向きの設定
previewView.addSubLayer(previewLayer)
【本題】プレビューサイズの設定
カメラ映像全体が以下とします。
わかりやすいようにプレビューレイヤーは横長にします。
1、縦横比を保ったまま、レイヤーサイズ内に収める
previewLayer.videoGravity = .resizeAspect
2、縦横比を変えて、レイヤーサイズを満たす
previewLayer.videoGravity = .resize
3、縦横比を保ったまま、レイヤーサイズを満たす
previewLayer.videoGravity = .resizeAspectFill
4、おまけ:映像の真ん中だけプレビューする
カメラ映像のサイズが 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を使ったアプリを作っています。
機械学習関連の情報を発信しています。