Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Taking photo with custom camera iOS 11.0 Swift 4. Update error

I have a custom camera in my app and it worked fine, but after the new update I am getting this error:

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

This is the line where I'm getting that error:

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

This is my whole function (if needed):

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

My guestion is: What should I use instead to make it work?

Thank you.

like image 477
0ndre_ Avatar asked Sep 28 '17 21:09

0ndre_


2 Answers

In iOS 11, you should use like this :

@available(iOS 11.0, *) func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {         let imageData = photo.fileDataRepresentation() } 
like image 116
Vini App Avatar answered Sep 19 '22 15:09

Vini App


Thanks @Vini App, I tried the code it worked for me, I posted my code for image capturing and processing, hope that will help people who needs similar function in their app.

First you need to setup your video capturing device, search it google here is an example https://gist.github.com/tad-iizuka/fc35bc7835920c0b8b84e316f83e3a40

Makes sure that you need to define photoSetting at the top

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

Configure the photo setting either in viewDidLoad() or viewWillAppear()

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

Then use the following function to process buffered image data

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

In this function, pixel buffer is converted to image data in the format specified by photoSetting and then cropped to the size you want.

You can create a button in IB to call the capturing function above

@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)     } } 
like image 29
infinity_coding7 Avatar answered Sep 19 '22 15:09

infinity_coding7