2017-03-02 1 views
1

Ich verwende Swift 3, Xcode 8.2.Swift 3 - Benutzerdefinierte Kameraansicht - zeigt das Standbild des Fotos nach dem Klick an

Ich habe eine benutzerdefinierte Kamera-Ansicht, die die Video-Feed-Fein und eine Schaltfläche, die ich als Shutter fungieren möchte angezeigt. Wenn der Benutzer auf die Schaltfläche tippt, möchte ich ein Bild aufnehmen und es wird auf dem Bildschirm angezeigt. (ZB wie ein Snapchat oder Facebook Messenger Artkamera Verhalten)

Hier ist mein Code:

import UIKit 
import AVFoundation 

class CameraVC: UIViewController, AVCapturePhotoCaptureDelegate { 

    // this is where the camera feed from the phone is going to be displayed 
    @IBOutlet var cameraView : UIView! 

    var shutterButton : UIButton = UIButton.init(type: .custom) 

    // manages capture activity and coordinates the flow of data from input devices to capture outputs. 
    var capture_session = AVCaptureSession() 

    // a capture output for use in workflows related to still photography. 
    var session_output = AVCapturePhotoOutput() 

    // preview layer that we will have on our view so users can see the photo we took 
    var preview_layer = AVCaptureVideoPreviewLayer() 

    // still picture image is what we show as the picture taken, frozen on the screen 
    var still_picture_image : UIImage! 

    ... //more code in viewWillAppear that sets up the camera feed 

    // called when the shutter button is pressed 
    func shutterButtonPressed() { 

     // get the actual video feed and take a photo from that feed 
     session_output.capturePhoto(with: AVCapturePhotoSettings.init(format: [AVVideoCodecKey : AVVideoCodecJPEG]), delegate: self as AVCapturePhotoCaptureDelegate) 
    } 

    func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 

     // take the session output, get the buffer, and create an image from that buffer 
     if let sampleBuffer = photoSampleBuffer, 
      let previewBuffer = previewPhotoSampleBuffer, 
      let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) { 

      print("Here") // doesn't get here 

     } 

    } 

Es scheint nicht „hier“ zu drucken, wenn Sie diesen Code ausgeführt wird, und ich kann jede Swift nicht finden 3 Tutorials zur Anzeige dieses Bildes. Ich schätze, ich möchte die imageData nehmen und sie meiner still_picture_image zuweisen und diese über den Kamera-Feed irgendwie überlagern.

Jede Hilfe oder ein Punkt in die richtige Richtung wäre eine große Hilfe.

EDIT

Nach dem folgenden meinem Code hinzufügen:

 if let error = error { 
      print(error.localizedDescription) 
     } 

Aber ich immer noch nicht jeder Fehler gedruckt werden.

+0

Sie haben soeben einen UIImageView mit dem aufgenommenen hinzufügen könnten Bild richtig? –

+0

Theoretisch, ja, aber das Wort "Here" wird nicht in meinem Code gedruckt, also scheint es nicht über diese 'if' Aussage hinauszukommen. – noblerare

+0

Haben Sie 'captureSession? .startRunning()' aufgerufen? Hey, kannst du den Code in voller Länge posten? –

Antwort

0

Fügen Sie den folgenden Code in Ihre Delegatmethode aus den Fehlern drucken geworfen:

if let error = error { 
    print(error.localizedDescription) 
} 

Sobald Sie Ihre Fehler gelöst bekommen, ich glaube, dieser Beitrag sollen Ihnen helfen, das Bild zu extrahieren: Taking photo with custom camera Swift 3

+0

Okay, ich habe meinen ursprünglichen Post aktualisiert. – noblerare

0

Okay, ich habe mein Problem herausgefunden:

Ziehen Sie zuerst ein UIImageView auf das Storyboard und lassen Sie es den gesamten Bildschirm aufnehmen. Hier wird das Standbild nach dem Drücken des Auslösers angezeigt.

Erstellen Sie diese Variable im Code und verknüpfen Sie sie.

@IBOutlet weak var stillPicture : UIImageView! 

Dann in viewDidLoad stellen Sie sicher, dass Sie die UIImageView auf der Oberseite der Kamera-Ansicht ein.

self.view.insertSubview(stillPicture, aboveSubview: your_camera_view) 

Dies ist die Funktion, die aufgerufen wird, wenn der Auslöser gedrückt wird:

func shutterButtonPressed() { 

    let settings = AVCapturePhotoSettings() 

    let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first! 
    let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType, 
         kCVPixelBufferWidthKey as String: 160, 
         kCVPixelBufferHeightKey as String: 160, 
         ] 
    settings.previewPhotoFormat = previewFormat 
    session_output.capturePhoto(with: settings, delegate: self) 
} 

in Ihrem Capture-Delegaten Dann:

func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 
     if let error = error { 
      print(error.localizedDescription) 
     } 

     // take the session output, get the buffer, and create an image from that buffer 
     if let sampleBuffer = photoSampleBuffer, let previewBuffer = previewPhotoSampleBuffer, let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) { 
      // this is the image that the user has taken! 
      let takenImage : UIImage = UIImage(data: dataImage)! 
      stillPicture?.image = takenImage     
     } else { 
      print("Error setting up photo capture") 
     } 
} 
Verwandte Themen