2017-11-17 2 views
0

Ich arbeite an einem Projekt, das benutzerdefinierte Kameraansicht enthält. Und ich bin nicht in der Lage, die Unteransicht über die Hauptansicht zu erfassen. Meine Hauptansicht besteht aus AVCaptureSession und ich möchte Foto von Superview und Subview beide in einem Bild.Swift 3 - Wie wird das Bild und seine Unteransicht aufgenommen?

Was ich in Code versuchen:

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) 
    } 
} 
} 

Bitte helfen Sie mir

+0

Gibt es dort keinen Code, der einen Screenshot vom Telefon erfassen würde? – Scriptable

+0

Überprüfen Sie meine aktualisierte Frage –

Antwort

1

Wenn ich verstehe Sie versuchen, den Inhalt zu erhalten (als Bild) von dem, was die Kamera greifen und einige Überlagerungsansichten .
Soweit ich mich erinnere, ist nicht möglich zu greifen, was in der AVPreviewLayer ist, vielleicht haben sie etwas in der neuesten Version geändert. Als ich es versuchte (iOS6) war das nicht möglich, der Bereich mit der AVPreviewLayer war immer leer.
Sie können den aktuellen Kamerapuffer nehmen und darin zeichnen. eine Klasse als Sitzungs delegieren Durch Setzen Sie diesen Rückruf

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

Hier erhalten Sie das Bild von der Kamera optional empfangen kann, kann dieser Puffer in Bilder mit Accelerate Rahmen oder CoreImage umgewandelt werden.
Ist nicht einfach, aber auch nicht impossible.

Verwandte Themen