How to capture picture with AVCaptureSession in Swift?

前端 未结 2 1999
旧巷少年郎
旧巷少年郎 2020-12-04 11:28

I have a UIViewController in which I use AVCaptureSession to show the camera and it is working just fine and fast. I placed a UIButton

相关标签:
2条回答
  • 2020-12-04 11:46

    AVCaptureSession Sample

    import UIKit
    import AVFoundation
    class ViewController: UIViewController {
        let captureSession = AVCaptureSession()
        let stillImageOutput = AVCaptureStillImageOutput()
        var error: NSError?
        override func viewDidLoad() {
            super.viewDidLoad()
            let devices = AVCaptureDevice.devices().filter{ $0.hasMediaType(AVMediaTypeVideo) && $0.position == AVCaptureDevicePosition.Back }
            if let captureDevice = devices.first as? AVCaptureDevice  {
    
                captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &error))
                captureSession.sessionPreset = AVCaptureSessionPresetPhoto
                captureSession.startRunning()
                stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]
                if captureSession.canAddOutput(stillImageOutput) {
                    captureSession.addOutput(stillImageOutput)
                }
                if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
                    previewLayer.bounds = view.bounds
                    previewLayer.position = CGPointMake(view.bounds.midX, view.bounds.midY)
                    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                    let cameraPreview = UIView(frame: CGRectMake(0.0, 0.0, view.bounds.size.width, view.bounds.size.height))
                    cameraPreview.layer.addSublayer(previewLayer)
                    cameraPreview.addGestureRecognizer(UITapGestureRecognizer(target: self, action:"saveToCamera:"))
                    view.addSubview(cameraPreview)
                }
            }
        }
        func saveToCamera(sender: UITapGestureRecognizer) {
            if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) {
                stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
                    (imageDataSampleBuffer, error) -> Void in
                    let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                     UIImageWriteToSavedPhotosAlbum(UIImage(data: imageData), nil, nil, nil)
                }
            }
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    

    UIImagePickerController Sample

    import UIKit
    
    class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        let imagePicker = UIImagePickerController()
        @IBOutlet weak var imageViewer: UIImageView!
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
                dismissViewControllerAnimated(true, completion: nil)
                 imageViewer.image = image
        }
        @IBAction func presentImagePicker(sender: AnyObject) {
    
            if UIImagePickerController.isCameraDeviceAvailable( UIImagePickerControllerCameraDevice.Front) {
    
                imagePicker.delegate = self
                imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
                presentViewController(imagePicker, animated: true, completion: nil)
    
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 11:58

    As AVCaptureStillImageOutput is deprecated, I created another Swift example of using AVCaptureSession and AVCapturePhotoOutput in iOS 10. Check this out.

    0 讨论(0)
提交回复
热议问题