2017-11-17 7 views
0

私はカスタムカメラview.Andを含むプロジェクトに取り組んでいます。私はメインビュー上でサブビューをキャプチャすることができません。私のメインビューは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もありません。

関連する問題