2017-10-24 6 views
1

카메라 응용 프로그램을 구현 중입니다. 다음과 같이 카메라를 시작합니다.AVCaptureVideoPreviewLayer에서 실시간 확대

let input = try AVCaptureDeviceInput(device: captureDevice!) 
    captureSession = AVCaptureSession() 
    captureSession?.addInput(input) 
    videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) 
    videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 
    videoPreviewLayer?.frame = view.layer.bounds 
    previewView.layer.insertSublayer(videoPreviewLayer!, at: 0) 

이제 미리보기 레이어 위에 작은 직사각형을 찍고 싶습니다. 그 사각형 영역에서 미리보기 레이어에서 특정 영역을 확대하고 싶습니다. 이를 수행하기 위해 다른보기 위에 새로운 UIView를 추가했지만 미리보기에서 특정 영역을 표시하는 방법을 모르겠습니다 (예 : 확대/축소 비율 = 2). 다음 그림은 갖고 싶은 것을 보여줍니다 : enter image description here 어떻게해야합니까?

답변

0

마지막으로 해결책을 찾았습니다. 아이디어는 카메라 출력에서 ​​실시간 프레임을 추출한 다음 UIImage보기를 사용하여 확대 된 프레임을 표시하는 것입니다. 코드의 일부가되어 다음 것은 비디오 출력을 추가합니다 :

let videoOutput = AVCaptureVideoDataOutput() 
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "sample buffer")) 
guard captureSession.canAddOutput(videoOutput) else { return } 
captureSession.addOutput(videoOutput) 

우리는 위임 기능을 구현해야합니다

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
    guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else { return } 
    DispatchQueue.main.async { [unowned self] in 
     self.delegate?.captured(image: uiImage) 
    } 
} 

private func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage? { 
    guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return nil } 
    let ciImage = CIImage(cvPixelBuffer: imageBuffer) 
    guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else { return nil } 
    return UIImage(cgImage: cgImage) 
} 

코드는 다음과 article에서 찍은.