如何在Swift3中仅捕获图像自定义摄像机视图区域

时间:2017-01-02 07:20:04

标签: ios camera swift3 avcapturesession

我有自定义相机视图。我想要的是,当我按下按钮时,我只想捕捉自定义摄像机视图内的图像。但是整个屏幕不仅仅是摄像机视图。我还将预览图层的帧设置为cameraView的帧。这是我的代码

 class CustomCameraVC: UIViewController, AVCapturePhotoCaptureDelegate {

    @IBOutlet weak var cameraView: UIView!
    @IBOutlet weak var shotImage: UIImageView!

    var captureSession: AVCaptureSession!
    var imageOutput: AVCapturePhotoOutput!



    override func viewDidLoad() {
        super.viewDidLoad()

    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)


        captureSession = AVCaptureSession()
        captureSession.sessionPreset = AVCaptureSessionPresetMedium
        imageOutput = AVCapturePhotoOutput()


        let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

        do {
            let input = try AVCaptureDeviceInput(device: device)

            if captureSession.canAddInput(input) {

                captureSession.addInput(input)

                if captureSession.canAddOutput(imageOutput) {

                    captureSession.addOutput(imageOutput)
                    captureSession.startRunning()

                    let captureVideoLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession)
                    captureVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

                    captureVideoLayer.frame = self.cameraView.layer.frame

                    self.cameraView.layer.addSublayer(captureVideoLayer)
                }
            }


        } catch {

            print("error")
        }
    }


    @IBAction func takePhoto(_ sender: UIButton) {

        let settingsForMonitoring = AVCapturePhotoSettings()
        settingsForMonitoring.flashMode = .auto
        settingsForMonitoring.isAutoStillImageStabilizationEnabled = true
        settingsForMonitoring.isHighResolutionPhotoEnabled = false
        imageOutput?.capturePhoto(with: settingsForMonitoring, delegate: self)

    }

    func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {


        if let photoSampleBuffer = photoSampleBuffer {
            let photoData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer)
            let image = UIImage(data: photoData!)

            shotImage.image = UIImage(data: photoData!)

            UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
        }

    } 
}

0 个答案:

没有答案