Как сделать снимок автоматически, если он умещается в прямоугольнике наложения слоя предварительного просмотра? - PullRequest
0 голосов
/ 07 февраля 2020

enter image description here

Я очень новичок в Swift

Я сделал предварительный просмотр камеры в Swift, добавил один прямоугольник поверх него в качестве наложения ( как это изображение) enter image description here

и всякий раз, когда документ подходит точно к прямоугольнику, я хочу сделать автоматический захват и обрезать окончательное изображение до размера прямоугольника.

До сих пор я так много сделал

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // Setup your camera here...
        captureSession = AVCaptureSession()
        captureSession.sessionPreset = .medium
        guard let backCamera = AVCaptureDevice.default(for: AVMediaType.video)
            else {
                print("Unable to access back camera!")
                return
        }

        do {
            let input = try AVCaptureDeviceInput(device: backCamera)
            //Step 9
            stillImageOutput = AVCapturePhotoOutput()

            if captureSession.canAddInput(input) && captureSession.canAddOutput(stillImageOutput) {
                captureSession.addInput(input)
                captureSession.addOutput(stillImageOutput)
                setupLivePreview()
            }
        }
        catch let error  {
            print("Error Unable to initialize back camera:  \(error.localizedDescription)")
        }

    }



func setupLivePreview() {

        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

        videoPreviewLayer.videoGravity = .resizeAspect
        videoPreviewLayer.connection?.videoOrientation = .portrait
        self.camerapreview.layer.addSublayer(videoPreviewLayer)

        //Step12
        //Add preview layer for drawing
        let previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
        previewLayer.frame = self.camerapreview.layer.frame
        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        self.view.layer.addSublayer(previewLayer)
        //Add Rectangle
        let cgRect = CGRect(x: 100, y:200, width: 300, height:200)
        myView.frame = cgRect
        myView.backgroundColor = UIColor.clear
        myView.isOpaque = false
        myView.layer.cornerRadius = 10
        myView.layer.borderColor =  UIColor.lightGray.cgColor
        myView.layer.borderWidth = 3
        myView.layer.masksToBounds = true
        previewLayer.addSublayer(myView.layer)
        // Bring the camera button to front
        DispatchQueue.global(qos: .userInitiated).async { //[weak self] in
            self.captureSession.startRunning()
            //Step 13
        }

//        DispatchQueue.main.async {
//            self.videoPreviewLayer.frame = self.previewView.bounds
//        }
    }

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

        guard let imageData = photo.fileDataRepresentation()
            else { return }

        let image = UIImage(data: imageData)
        self.name.image = image
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.captureSession.stopRunning()
    }

Но я не могу получить логи c из

  1. Как проверить, что документ помещается в оверлейный прямоугольник? Как запустить автозапись тогда?

Просьба помочь

...