2017-09-28 78 views
6

Mam niestandardowy aparat w mojej aplikacji i to działało w porządku, ale po nowej aktualizacji otrzymuję ten błąd:Robienie zdjęć z aparatu na zlecenie iOS 11,0 Swift błędu 4. Aktualizacja

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

To jest linia gdzie ja dostaję ten błąd:

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

To jest cała moja funkcja (w razie potrzeby):

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

} 

Moi guesti on is: Co powinienem użyć zamiast tego, aby działało?

Dziękuję.

Odpowiedz

11

W iOS 11, należy użyć tak:

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

Dzięki @Vini App, próbowałem kod pracował dla mnie, pisał mój kod do przechwytywania obrazu i przetwarzania, nadziei, które pomogą ludziom kto potrzebuje podobnej funkcji w swojej aplikacji.

Najpierw trzeba skonfigurować plik wideo urządzenie przechwytywania, wyszukiwania to google tutaj jest przykładem https://gist.github.com/tad-iizuka/fc35bc7835920c0b8b84e316f83e3a40

zapewnia, że ​​trzeba zdefiniować photoSetting na najwyższym

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

skonfigurować ustawienie zarówno w zdjęcie viewDidLoad() lub viewWillAppear()

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

Następnie za pomocą następującej funkcji na str rocess buforowane dane obrazowe

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

W tej funkcji, bufor piksel jest konwertowany na dane obrazu w formacie określonym przez photoSetting a następnie przycięte do rozmiaru chcesz.

Można utworzyć przycisk w IB aby wywołać funkcję przechwytywania powyżej

@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

Definiowanie fotokompozycja się szczycie jako zmienna nie działa dla mnie, bo przez drugą zdjęcie zostało zrobione, aplikacja zawieszała mówiąc nie można było używać ustawień zdjęć. Ustawienia AVCapturePhotoSettings można zdefiniować za pomocą "let" (nie var) w IBAction lub innej funkcji za każdym razem, gdy robisz zdjęcie, wtedy będzie działać dobrze z wielokrotnym robieniem zdjęć. – VagueExplanation

+1

Witam, @ VagueExplanation, dziękuję za odpowiedź, ale nie bardzo rozumiem, co dokładnie spowodowało awarię (brzmi jak za każdym razem, gdy tworzę instancję AVCapturePhotoSetting?). Wysłany kod działał w widoku "Photo Booth" w mojej aplikacji, więc w zasadzie możesz zrobić zdjęcie i przejść do następnego widoku, w którym jesteś zadowolony, lub ponownie go zabrać, jeśli ci się nie podoba. Zdjęcie zostanie zapisane w albumie, a aplikacja będzie działać na iPadzie. Mam nadzieję, że będzie to pomocne? A może możesz podać więcej szczegółów do dyskusji? –

+0

Ah w porządku, to nieważne. To zależy od tego, jak go używasz. – VagueExplanation