Как я могу сделать снимок и просмотреть его
Я недавно добавил cameraView
к моему проекту, и все работает хорошо. Хотя сейчас я еще не делаю снимки, и это то, что я хочу реализовать дальше...
было бы здорово, если бы вы могли показать мне, как я могу реализовать захват фотографии и предварительный просмотр ее с помощью кода, который у меня есть
так TakePhoto
функция сделает снимок, а затем сделанное изображение будет показано мне в previewPhotoViewController
CustomCameraView:
import UIKit
import AVFoundation
class CustomCameraViewController: UIViewController,UIImagePickerControllerDelegate {
@IBOutlet weak var cameraView: UIView!
let session: AVCaptureSession = AVCaptureSession()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
session.sessionPreset = AVCaptureSessionPresetHigh
if let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) {
do {
try session.addInput(AVCaptureDeviceInput(device: device))
} catch {
print(error.localizedDescription)
}
guard let previewLayer = AVCaptureVideoPreviewLayer(session: session) else {
print("no preview layer")
return
}
self.cameraView.layer.addSublayer(previewLayer)
previewLayer.frame = self.view.layer.bounds
}
session.startRunning()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidLoad() {
super.viewDidLoad()
}
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
func TakePhoto(_ sender: UIButton) {
//Wants to take photo with this button funcntion...
}
и я начал со страницы предварительного просмотра:
PreviewPhotoViewController:
import UIKit
class PhotoPreviewViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
var takenPhoto :UIImage?
override func viewDidLoad() {
super.viewDidLoad()
if let availableImage = takenPhoto {
imageView.image = availableImage
}
}
@IBAction func dismissView(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Спасибо за помощь
1 ответ
За AVCaptureSession
Посмотри на это. Я только что создал образец использования AVCaptureSession
что является упрощением образца Apple AVCam.
Не забудьте установить Privacy - Camera Usage Description
в вашем .plist
,
Так как есть некоторые ошибки, приводящие к аварийному завершению AVCaptureSession в симуляторе iOS10, отсюда. Я предпочитаю использовать UIImagePickerController
, Вы можете проверить следующий пример:
import UIKit
import AVFoundation
import MobileCoreServices
class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func takePhoto(_ sender: UIButton) {
self.presentPhotoCamera(canEdit: false)
}
func presentPhotoCamera(canEdit: Bool) {
if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
return
}
let type = kUTTypeImage as String
let imagePicker = UIImagePickerController()
if UIImagePickerController.isSourceTypeAvailable(.camera) {
if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) {
if availableTypes.contains(type) {
imagePicker.mediaTypes = [type]
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
}
}
if UIImagePickerController.isCameraDeviceAvailable(.rear) {
imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear
} else if UIImagePickerController.isCameraDeviceAvailable(.front) {
imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front
}
} else { return }
imagePicker.allowsEditing = canEdit
imagePicker.showsCameraControls = true
imagePicker.delegate = self
DispatchQueue.main.async {
self.present(imagePicker, animated: true, completion: nil)
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
picker.dismiss(animated: true, completion: {
self.imageView.image = image
})
}
}