2016-10-15 11 views
5

in Swift 2.3 habe ich diesen Code ein Bild in benutzerdefinierter Kamera zu nehmen:Foto Taking mit benutzerdefinierter Kamera Swift 3

func didPressTakePhoto(){ 

     if let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) { 

      stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (sampleBuffer, error) -> Void in 
       if sampleBuffer != nil { 
        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
        let dataProvider = CGDataProviderCreateWithCFData(imageData) 
        let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) 
        let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right) 


        self.captureImageView.image = image 
       } 
      }) 

    } 
} 

Aber seine Linie: stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (sampleBuffer, error) -> Void in

Zeigt dieser Fehler:

Value of type 'AVCapturePhotoOutput' has no member 'captureStillImageAsynchronouslyFromConnection'

Ich habe versucht, mein Problem zu lösen, aber ich bekomme immer mehr Fehler und deshalb poste ich meinen ursprünglichen Code.

Kann jemand meinen Code wieder arbeiten lassen?

Vielen Dank.

Antwort

4

Dank Sharpkits ich meine Lösung gefunden (Dieser Code funktioniert für mich):

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

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

     if let sampleBuffer = photoSampleBuffer, let previewBuffer = previewPhotoSampleBuffer, 
      let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) { 

      let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: nil) 
      let dataProvider = CGDataProvider(data: imageData as! CFData) 

      let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.absoluteColorimetric) 


      let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right) 

      let cropedImage = self.cropToSquare(image: image) 

      let newImage = self.scaleImageWith(cropedImage, and: CGSize(width: 600, height: 600)) 

      print(UIScreen.main.bounds.width) 


      self.tempImageView.image = newImage 
      self.tempImageView.isHidden = false 


     } else { 

     } 
    } 
7

Sie können maximal 3 AVCapturePhotoOutput wie dies in Swift verwenden:

Sie benötigen die AVCapturePhotoCaptureDelegate, die die CMSampleBuffer zurückgibt.

Sie können auch ein Vorschaubild, wenn Sie das sagen AVCapturePhotoSettings die previewFormat

class CameraCaptureOutput: NSObject, AVCapturePhotoCaptureDelegate { 

    let cameraOutput = AVCapturePhotoOutput() 

    func capturePhoto() { 

     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 
      self.cameraOutput.capturePhoto(with: settings, delegate: self) 

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

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

     if let sampleBuffer = photoSampleBuffer, let previewBuffer = previewPhotoSampleBuffer, let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) { 
      print(image: UIImage(data: dataImage).size) 
     } else { 

     } 
    } 
} 
+0

Danke, dass du mir sehr geholfen hast :) –

+1

Ich benutze Swift 3 und auf der Zeile 'print (image: UIIMage ...)' bekomme ich eine Fehlermeldung 'Argument labels (image :) passen nicht zu den verfügbaren Überladungen .' – noblerare

2

Große Code . Vielen Dank für die Hilfe und Beispiele.

Nur um für diejenigen von langsameren geistigen Fähigkeiten wie mir zu klären, wird die Capture (_ ... etc) -Methode hinter den Kulissen aufgerufen, wenn Sie in der Self.cameraOutput.capturePhoto aufrufen (mit: Einstellungen, Delegate: Selbst) Ihr TakePhoto (oder wie immer Sie es nennen) Methode. Sie werden die Capture-Methode niemals direkt aufrufen. Es passiert automatisch.

Verwandte Themen