2016-10-15 32 views
5

trong Swift 2.3 tôi đã sử dụng mã này để chụp ảnh trong máy ảnh tùy chỉnh:Chụp ảnh với máy ảnh tùy chỉnh 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 
       } 
      }) 

    } 
} 

Nhưng dòng của mình: stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (sampleBuffer, error) -> Void in

Hiển thị lỗi này:

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

Tôi đã cố gắng giải quyết vấn đề của mình nhưng tôi luôn nhận được nhiều lỗi hơn và đó là lý do tại sao tôi đăng mã ban đầu của mình.

Có ai biết cách làm cho mã của tôi hoạt động trở lại không?

Cảm ơn bạn.

Trả lời

4

Nhờ Sharpkits tôi tìm thấy giải pháp của tôi (Mã này làm việc cho tôi):

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

Bạn có thể sử dụng AVCapturePhotoOutput như thế này trong Swift 3:

Bạn cần AVCapturePhotoCaptureDelegate mà trả về CMSampleBuffer.

Bạn có thể nhận được cũng một hình ảnh xem trước nếu bạn nói với các AVCapturePhotoSettings các 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

Cảm ơn bạn đã giúp tôi rất nhiều :) –

+1

Tôi đang sử dụng Swift 3 và trên dòng 'print (image: UIIMage ...)', tôi gặp lỗi 'Argument labels (image :) không khớp với bất kỳ quá tải nào có sẵn .' – noblerare

2

vĩ đại đang . Cảm ơn một tấn cho sự giúp đỡ và ví dụ.

Chỉ cần làm rõ đối với những người có khoa tâm thần chậm hơn như bản thân mình, phương pháp chụp (_ ... vv) được gọi đằng sau hậu trường khi bạn gọi self.cameraOutput.capturePhoto (với: settings, delegate: self) bên trong takePhoto (hoặc bất kỳ tên nào bạn đặt tên). Bạn sẽ không bao giờ thực sự gọi trực tiếp phương thức chụp. Nó xảy ra tự động.

Các vấn đề liên quan