2017-09-28 1 views
6

J'ai un appareil photo personnalisé dans mon application et il a bien fonctionné, mais après la nouvelle mise à jour, je reçois cette erreur:Prendre photo avec l'appareil photo personnalisé iOS 11.0 Swift 4. Erreur de mise à jour

'jpegPhotoDataRepresentation(forJPEGSampleBuffer:previewPhotoSampleBuffer:)' was deprecated in iOS 11.0: Use -[AVCapturePhoto fileDataRepresentation] instead.

Ceci est la ligne où je reçois cette erreur:

guard let imageData = 
     AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer) else { 
      return 
    } 

Ceci est ma fonction entière (si nécessaire):

//Take pic function 
func photoOutput(_ captureOutput: AVCapturePhotoOutput, 
       didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, 
       previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, 
       resolvedSettings: AVCaptureResolvedPhotoSettings, 
       bracketSettings: AVCaptureBracketedStillImageSettings?, 
       error: Error?) { 


    // Make sure we get some photo sample buffer 
    guard error == nil, 
     let photoSampleBuffer = photoSampleBuffer else { 
      print("Error capturing photo: \(String(describing: error))") 
      return 
    } 
    // Convert photo same buffer to a jpeg image data by using // AVCapturePhotoOutput 
    guard let imageData = 
     AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer) else { 
      return 
    } 

    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) 

    self.tempImageView.image = image 

} 

Mes guesti on est: Que devrais-je utiliser à la place pour le faire fonctionner?

Merci.

Répondre

11

Dans iOS 11, vous devez utiliser comme ceci:

@available(iOS 11.0, *) 
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 
     let imageData = photo.fileDataRepresentation() 
} 
4

Merci @Vini App, j'ai essayé le code, il a travaillé pour moi, j'ai posté mon code pour la capture d'images et de traitement, espoir qui aidera les gens qui a besoin d'une fonction similaire dans leur application.

D'abord, vous devez configurer votre appareil de capture vidéo, la recherche google il est ici un exemple https://gist.github.com/tad-iizuka/fc35bc7835920c0b8b84e316f83e3a40

veille à ce que vous devez définir photoSetting en haut

... 
var photoSetting = AVCapturePhotoSettings() 
... 

Configurer la photo mise soit en viewDidLoad() ou viewWillAppear()

  // Configure camera 
     photoSetting = AVCapturePhotoSettings.init(format: [AVVideoCodecKey: AVVideoCodecType.jpeg]) 
     photoSetting.isAutoStillImageStabilizationEnabled = true 
     photoSetting.flashMode = .off 

Ensuite, utilisez la fonction suivante à p données d'image tamponne rocess

 func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 

    // Check if there is any error in capturing 
    guard error == nil else { 
     print("Fail to capture photo: \(String(describing: error))") 
     return 
    } 

    // Check if the pixel buffer could be converted to image data 
    guard let imageData = photo.fileDataRepresentation() else { 
     print("Fail to convert pixel buffer") 
     return 
    } 

    // Check if UIImage could be initialized with image data 
    guard let capturedImage = UIImage.init(data: imageData , scale: 1.0) else { 
     print("Fail to convert image data to UIImage") 
     return 
    } 

    // Get original image width/height 
    let imgWidth = capturedImage.size.width 
    let imgHeight = capturedImage.size.height 
    // Get origin of cropped image 
    let imgOrigin = CGPoint(x: (imgWidth - imgHeight)/2, y: (imgHeight - imgHeight)/2) 
    // Get size of cropped iamge 
    let imgSize = CGSize(width: imgHeight, height: imgHeight) 

    // Check if image could be cropped successfully 
    guard let imageRef = capturedImage.cgImage?.cropping(to: CGRect(origin: imgOrigin, size: imgSize)) else { 
     print("Fail to crop image") 
     return 
    } 

    // Convert cropped image ref to UIImage 
    imageToSave = UIImage(cgImage: imageRef, scale: 1.0, orientation: .down) 
    UIImageWriteToSavedPhotosAlbum(imageToSave, nil, nil, nil) 

    // Stop video capturing session (Freeze preview) 
    captureSession.stopRunning() 
} 

Dans cette fonction, tampon de pixel est converti en données d'image dans le format spécifié par photoSetting puis recadrée à la taille souhaitée.

Vous pouvez créer un bouton dans IB pour appeler la fonction de capture ci-dessus

@IBAction func onTakePhoto(_ sender: UIButton) { 
    if let videoConnection = videoOutput.connection(with: AVMediaType.video) { 
     // Adjust the orientaion of captured image 
     let capturePhotoSetting = AVCapturePhotoSettings.init(from: photoSetting) 
     videoConnection.videoOrientation = (previewLayer.connection?.videoOrientation)! 
     // Save captured photo to system album 
     self.videoOutput.capturePhoto(with: capturePhotoSetting, delegate: self) 
    } 
} 
+0

Définition photocomposition en haut comme une variable ne fonctionne pas pour moi, parce que par la seconde photo a été prise, l'application est écrasé en disant que je n'a pas été autorisé à utiliser les paramètres de photo. AVCapturePhotoSettings peut être défini avec "let" (not var) dans votre IBAction ou une autre fonction chaque fois que vous prenez une photo, alors cela fonctionnera très bien avec la prise de photo répétée. – VagueExplanation

+1

Salut, @VagueExplanation, merci pour la réponse mais je n'ai pas bien compris ce qui est exactement causé par le crash (ça sonne comme chaque fois que j'instancie un AVCapturePhotoSetting?). Le code qui a fonctionné a fonctionné dans une vue 'Photo Booth' dans mon application, donc en gros, vous pouvez prendre une photo et passer à la vue suivante, vous êtes satisfait ou re-prendre si vous ne l'aimez pas. La photo est enregistrée dans l'album et l'application fonctionne sur iPad. Espérons que cela sera utile? Ou peut-être vous pouvez fournir plus de détails pour la discussion? –

+0

Ah d'accord, alors peu importe. Cela dépend de la façon dont vous l'utilisez. – VagueExplanation