2017-10-24 3 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から取られました。

関連する問題