Как я могу сделать снимок, когда камера уже работает - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть приложение с камерой типа Snapchat, где UIView отображает заднюю камеру.У меня есть кнопка сверху, и когда я нажимаю эту кнопку, я хочу сделать снимок.Прямо сейчас, когда я нажимаю эту кнопку, она просто открывает другую камеру.

Это код для нажатия кнопки:

@IBAction func takePhoto(_ sender: UIButton) {
    imagePicker =  UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .camera
    present(imagePicker, animated: true, completion: nil)
}

Однако, как указано выше, это избыточно, так как мой ViewControllerотображает камеру на ViewDidAppear.

override func viewDidAppear(_ animated: Bool) {
    self.ShowCamera(self.frontCamera)
    fullView.isHidden = false
}

func ShowCamera(_ front: Bool) {
    self.captureSession.sessionPreset = AVCaptureSession.Preset.photo

    if let availableDevices = AVCaptureDevice.DiscoverySession(deviceTypes: [ .builtInWideAngleCamera,.builtInMicrophone],
                                                                mediaType: AVMediaType.video, position: .back).devices.first {
        self.captureDevice = availableDevices
        if captureSession.isRunning != true {
            self.beginSession()
        }
    }

    if self.captureDevice == nil {
        print("capture device is nil")
        return
    }

    do {
        try self.captureSession.removeInput(AVCaptureDeviceInput(device: self.captureDevice!))
    } catch let error as NSError {
        print(error)
    }
}

func beginSession() {
    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice)
        captureSession.addInput(captureDeviceInput)
    } catch {
        print(error.localizedDescription)
    }

    captureSession.startRunning()

    let preview = AVCaptureVideoPreviewLayer(session: captureSession)
    self.previewLayer = preview
    preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
    CameraView.layer.insertSublayer(self.previewLayer, at: 0)
    self.previewLayer.frame = self.CameraView.layer.frame

    let dataOutput = AVCaptureVideoDataOutput()
    dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString) : NSNumber(value: kCVPixelFormatType_32BGRA)] as [String : Any]
    dataOutput.alwaysDiscardsLateVideoFrames = true

    if captureSession.canAddOutput(dataOutput)
    {
        captureSession.addOutput(dataOutput)
    }

    captureSession.commitConfiguration()
}

Весь код выше просто получает UIView и показывает камеру.Кнопка для TakePhoto - это подслой, который отображается поверх изображения с камеры.Когда я нажимаю эту кнопку, я хочу использовать любое изображение, отображаемое на моей камере.

1 Ответ

0 голосов
/ 27 ноября 2018

Команда для захвата фотографии из текущего сеанса:

guard let output = captureSession.outputs[0] as? AVCapturePhotoOutput 
else {return}
output.capturePhoto(with: settings, delegate: self)

Здесь self - это AVCapturePhotoCaptureDelegate.Затем вы получаете фотографию через сообщения делегатов, извлекаете и сохраняете ее.

...