Ответ 1
В iOS 11 вы должны использовать следующее:
@available(iOS 11.0, *)
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
let imageData = photo.fileDataRepresentation()
}
У меня есть пользовательская камера в моем приложении, и она отлично работает, но после нового обновления я получаю эту ошибку:
'jpegPhotoDataRepresentation (forJPEGSampleBuffer: previewPhotoSampleBuffer :)' устарел в iOS 11.0: вместо этого используйте [AVCapturePhoto fileDataRepresentation].
Это строка, в которой я получаю эту ошибку:
guard let imageData =
AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer) else {
return
}
Это моя целая функция (при необходимости):
//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
}
Мое приглашение: что я должен использовать, чтобы заставить его работать?
Спасибо.
В iOS 11 вы должны использовать следующее:
@available(iOS 11.0, *)
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
let imageData = photo.fileDataRepresentation()
}
Благодаря @Vini App, я пробовал код, который работал для меня, я разместил свой код для захвата и обработки изображений, надеюсь, что это поможет людям, которым нужна аналогичная функция в своем приложении.
Сначала вам нужно настроить устройство захвата видео, найти его в Google, вот пример https://gist.github.com/tad-iizuka/fc35bc7835920c0b8b84e316f83e3a40
Удостоверяется, что вам нужно определить photoSetting
вверху
...
var photoSetting = AVCapturePhotoSettings()
...
Настройте настройку фотографии либо в viewDidLoad()
либо в viewWillAppear()
// Configure camera
photoSetting = AVCapturePhotoSettings.init(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])
photoSetting.isAutoStillImageStabilizationEnabled = true
photoSetting.flashMode = .off
Затем используйте следующую функцию для обработки данных буферизованного изображения
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()
}
В этой функции буфер пикселей преобразуется в данные изображения в формате, заданном photoSetting
а затем обрезается до photoSetting
размера.
Вы можете создать кнопку в IB, чтобы вызвать функцию захвата выше
@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)
}
}
Для iOS 11.0 и ниже оба обработанных
var photoOutput : AVCapturePhotoOutput?
if #available(iOS 11.0, *)
{
photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format:[AVVideoCodecKey:AVVideoCodecType.jpeg])], completionHandler: nil)
}
else
{
photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format:[AVVideoCodecKey:AVVideoCodecJPEG])], completionHandler: nil)
}