2017-11-17 17 views
0

사용자 정의 카메라보기가 포함 된 프로젝트에서 작업 중입니다. 기본보기에서 하위보기를 캡처 할 수 없습니다. 내 기본보기는 AVCaptureSession으로 구성되어 있으며 단일보기에서 하위보기와 하위보기를 모두 찍고 싶습니다.스위프트 3 - 이미지 및 하위보기를 캡처하는 방법?

내가 코드에 노력하고 무엇을 : 나는 당신이 카메라가 잡는 것의 (이미지 등) 내용과 일부 오버레이 뷰를 얻기 위해 노력하고 이해하면

class ViewController: UIViewController { 

@IBOutlet weak var cameraButton: UIButton! 

var captureSession = AVCaptureSession() 

var backCamera: AVCaptureDevice? 
var frontCamera: AVCaptureDevice? 
var currentDevice: AVCaptureDevice? 

var photoOutput: AVCapturePhotoOutput? 

var cameraPreviewLayer:AVCaptureVideoPreviewLayer? 

var image: UIImage? 

var toggleCameraGestureRecognizer = UISwipeGestureRecognizer() 

var zoomInGestureRecognizer = UISwipeGestureRecognizer() 
var zoomOutGestureRecognizer = UISwipeGestureRecognizer() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setupCaptureSession() 
    setupDevice() 
    setupInputOutput() 
    setupPreviewLayer() 
    captureSession.startRunning() 

    toggleCameraGestureRecognizer.direction = .up 
    toggleCameraGestureRecognizer.addTarget(self, action: #selector(self.switchCamera)) 
    view.addGestureRecognizer(toggleCameraGestureRecognizer) 

    // Zoom In recognizer 
    zoomInGestureRecognizer.direction = .right 
    zoomInGestureRecognizer.addTarget(self, action: #selector(zoomIn)) 
    view.addGestureRecognizer(zoomInGestureRecognizer) 

    // Zoom Out recognizer 
    zoomOutGestureRecognizer.direction = .left 
    zoomOutGestureRecognizer.addTarget(self, action: #selector(zoomOut)) 
    view.addGestureRecognizer(zoomOutGestureRecognizer) 
    styleCaptureButton() 
} 
    cameraButton.layer.borderColor = UIColor.white.cgColor 
    cameraButton.layer.borderWidth = 5 
    cameraButton.clipsToBounds = true 
    cameraButton.layer.cornerRadius = min(cameraButton.frame.width, cameraButton.frame.height)/2 
} 

func setupCaptureSession() { 
    captureSession.sessionPreset = AVCaptureSession.Preset.photo 
} 

func setupDevice() { 
    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified) 
    let devices = deviceDiscoverySession.devices 

    for device in devices { 
     if device.position == AVCaptureDevice.Position.back { 
      backCamera = device 
     } else if device.position == AVCaptureDevice.Position.front { 
      frontCamera = device 
     } 
    } 
    currentDevice = backCamera 
} 

func setupInputOutput() { 
    do { 

     let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!) 
     captureSession.addInput(captureDeviceInput) 
     photoOutput = AVCapturePhotoOutput() 
     photoOutput!.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecType.jpeg])], completionHandler: nil) 
     captureSession.addOutput(photoOutput!) 


    } catch { 
     print(error) 
    } 
} 

func setupPreviewLayer() { 
    self.cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    self.cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 
    self.cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 
    self.cameraPreviewLayer?.frame = view.frame 

    self.view.layer.insertSublayer(self.cameraPreviewLayer!, at: 0) 
} 
@IBAction func cameraButton_TouchUpInside(_ sender: Any) { 
    let settings = AVCapturePhotoSettings() 
    self.photoOutput?.capturePhoto(with: settings, delegate: self) 
} 
} 
extension ViewController: AVCapturePhotoCaptureDelegate { 
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 
    if let imageData = photo.fileDataRepresentation() { 
     self.image = UIImage(data: imageData) 
     performSegue(withIdentifier: "Preview_Segue", sender: nil) 
    } 
} 
} 

나에게

+0

휴대 전화에서 캡쳐 화면을 캡처하는 코드가 없습니다. – Scriptable

+0

업데이트 된 질문 확인 –

답변

1

도와주세요 .
내가 기억하는 한, AVPreviewLayer 안에있는 것을 잡는 것은 불가능합니다. 아마도 최신 버전에서 뭔가 바뀌었을 것입니다. (iOS6) 시도했을 때 가능하지 않았습니다. AVPreviewLayer이있는 영역은 항상 비어 있습니다.
당신이 할 수있는 일은 현재의 카메라 버퍼를 가져 와서 그 안에 그립니다. 세션 대리인으로 클래스를 설정함으로써 당신은 여기

func captureOutput(_ output: AVCaptureOutput, 
        didOutput sampleBuffer: CMSampleBuffer, 
         from connection: AVCaptureConnection) 

카메라에서 이미지를 받게됩니다 옵션이 콜백을받을 수 있습니다,이 버퍼는 Accelerate 프레임 워크 또는 CoreImage를 사용하여 이미지로 변환 할 수 있습니다.
쉽지는 않지만 impossible도 아닙니다.