【Swift】最新バージョンで作成する2種類のカメラ処理の作成(画像処理 その1)【カメラ】

Описание к видео 【Swift】最新バージョンで作成する2種類のカメラ処理の作成(画像処理 その1)【カメラ】

2021年3月初旬時点での最新バージョンで作成したカメラ処理です。
色々な所が細かく変わっていますので、カメラ機能を使ったアプリを作成する場合の
ご参考になれば と思います。
また、これ以後カメラで撮影した画像の扱い方法を動画としてアップする予定です。

twitter url:  / tochio19  

アプリのコードです。
注)<>が全角ですので、半角に直してください

【info.plist】
<key>NSCameraUsageDescription</key>
<string>カメラを使用する具体的な理由を明記</string>


【ViewController.swift】
import UIKit

class ViewController: UIViewController,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate{

@IBOutlet weak var Nimg: UIImageView!


@IBAction func goCasCam(_ sender: UIButton) {

performSegue(withIdentifier: "goViewCusCam",sender: nil)
}


@IBAction func NormalCameraBt(_ sender: UIButton) {



// camera
let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.camera
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){

// インスタンスの作成
let cameraPicker = UIImagePickerController()
cameraPicker.sourceType = sourceType
cameraPicker.delegate = self
self.present(cameraPicker, animated: true, completion: nil)

}else{

}
}

// 撮影が完了
func imagePickerController(_ imagePicker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){

if let pickedImage = info[.originalImage] as? UIImage {

Nimg.image = pickedImage
}
imagePicker.dismiss(animated: true, completion: nil)

}

// 撮影がキャンセル
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

picker.dismiss(animated: true, completion: nil)
}


override func viewDidLoad() {
super.viewDidLoad()

}


}

【CusCamViewController.swift】
import UIKit

import AVFoundation

class CusCamViewController: UIViewController,
AVCapturePhotoCaptureDelegate{

@IBOutlet weak var TakeView: UIView!
@IBOutlet weak var TakeImg: UIImageView!

var input:AVCaptureDeviceInput!
var output:AVCapturePhotoOutput!
var session:AVCaptureSession!
var camera:AVCaptureDevice!

private var photoData: Data?


// take a photo
@IBAction func TakeBt(_ sender: UIButton) {

let CameraSet = AVCapturePhotoSettings()
CameraSet.flashMode = .auto
CameraSet.isHighResolutionPhotoEnabled = false

output?.capturePhoto(with: CameraSet, delegate: self)
}

// after take a photo
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {

let imageData = photo.fileDataRepresentation()
let photo = UIImage(data: imageData!)

session.stopRunning()
TakeImg.image = photo

}

override func viewDidLoad() {

super.viewDidLoad()

// camera start
// session
session = AVCaptureSession()

// camera set
camera = AVCaptureDevice.default(
AVCaptureDevice.DeviceType.builtInWideAngleCamera,
for: AVMediaType.video,
position: .back
)

// input session set
do {
input = try AVCaptureDeviceInput(device: camera)

} catch let error as NSError {
print(error)
}
if(session.canAddInput(input)) {session.addInput(input)}

// output session set
output = AVCapturePhotoOutput()

if(session.canAddOutput(output)) {session.addOutput(output)}

// preview set
let preViewL = AVCaptureVideoPreviewLayer(session: session)

// frame 親viewからの座標要素
// bounds これ自体の座標要素
print(TakeView.bounds.origin.x,TakeView.bounds.origin.y,TakeView.bounds.size.width,TakeView.bounds.size.height)
print(TakeView.frame.origin.x,TakeView.frame.origin.y,TakeView.frame.size.width,TakeView.frame.size.height)

preViewL.frame = CGRect(x: TakeView.bounds.origin.x,
y: TakeView.bounds.origin.y,
width: TakeView.bounds.size.width,
height: TakeView.bounds.size.height)

preViewL.videoGravity = AVLayerVideoGravity.resizeAspect
TakeView.layer.addSublayer(preViewL)

// camera start
session.startRunning()

}

}

Комментарии

Информация по комментариям в разработке