How to capture image only custom camera view area in Swift3

1k Views Asked by At

I have the custom camera view. What I want is that I only want to capture the image inside of custom camera view when I press button.But it take the whole screen not just camera view. I also set preview layer's frame to cameraView's frame. Here is my code

 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

There are 0 best solutions below