代码之家  ›  专栏  ›  技术社区  ›  user1591668

相机已经在运行时我怎么拍照

  •  -1
  • user1591668  · 技术社区  · 6 年前

    我有一个应用程序,它有一个Snapchat类型的摄像头,uiview显示后摄像头。我在上面有一个按钮,当我点击那个按钮时,我想拍照。现在,当我点击那个按钮时,它只会打开另一个摄像头。

    这是单击按钮的代码:

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

    但是,如上所述,这是多余的,因为我的视图控制器在VIEWDID上显示相机。

    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 回复  |  直到 6 年前
        1
  •  1
  •   matt    6 年前

    从正在运行的会话中捕获照片的命令是

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

    在这里, self ,是AvCapturePhotoCaptureDelegate。然后通过委托消息接收照片并提取并保存。