swift - Captura de imagen fija con AVFoundation
uiimageview (1)
si tiene como objetivo iOS 10 o superior. captureStillImageAsynchronously(from:completionHandler:)
está en desuso junto con AVCaptureStillImageOutput
.
Según la documentación
La clase AVCaptureStillImageOutput está en desuso en iOS 10.0 y no es compatible con las características más recientes de captura de la cámara, como la salida de imagen RAW, Live Photos o el color de gama amplia. En iOS 10.0 y posterior, use la clase AVCapturePhotoOutput en su lugar. (La clase AVCaptureStillImageOutput sigue siendo compatible con macOS 10.12).
Según su código, ya está utilizando AVCapturePhotoOutput
. Así que solo siga estos pasos a continuación para tomar una foto de la sesión. Lo mismo se puede encontrar aquí en la documentación de Apple .
- Crea un objeto AVCapturePhotoOutput. Use sus propiedades para determinar la configuración de captura admitida y para habilitar ciertas funciones (por ejemplo, si capturar Live Photos).
- Cree y configure un objeto AVCapturePhotoSettings para elegir características y configuraciones para una captura específica (por ejemplo, si habilitar la estabilización de imagen o flash).
- Capture una imagen pasando su objeto de configuración de fotografías al método capturePhoto (con: delegate :) junto con un objeto delegado que implementa el protocolo AVCapturePhotoCaptureDelegate. La salida de captura de fotos llama a su delegado para notificarle de eventos importantes durante el proceso de captura.
ya estás haciendo los pasos 1 y 2. Así que agrega esta línea en tu código
@IBAction func takePhoto(_sender: Any) {
print("Taking Photo")
sessionOutput.capturePhoto(with: sessionOutputSetting, delegate: self as! AVCapturePhotoCaptureDelegate)
}
e implementar la función AVCapturePhotoCaptureDelegate
optional public func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?)
Tenga en cuenta que este delegado le dará mucho control sobre la toma de fotos. Consulte la documentación para más funciones. También debe procesar los datos de imagen, lo que significa que debe convertir el búfer de muestra en UIImage.
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)
// ...
// Add the image to captureImageView here...
}
Tenga en cuenta que la imagen que obtiene se gira hacia la izquierda, por lo que debemos girar manualmente hacia la derecha para obtener una vista previa de la imagen.
Más información se puede encontrar en mi respuesta SO anterior
Actualmente estoy creando una aplicación simple que usa AVFoundation para transmitir video en UIImageView
.
Para lograr esto, creé una instancia de AVCaptureSession()
y un AVCaptureSessionPreset()
:
let input = try AVCaptureDeviceInput(device: device)
print(input)
if (captureSession.canAddInput(input)) {
captureSession.addInput(input)
if (captureSession.canAddOutput(sessionOutput)) {
captureSession.addOutput(sessionOutput)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(previewLayer)
captureSession.startRunning()
referencias de cameraView a la salida
UIImageView
.
Ahora quiero implementar una forma de capturar una imagen fija de la sesión AVCaptureSession.
Corrígeme si hay una manera más eficiente, pero planeo tener un UIImageView
adicional para mantener la imagen fija colocada encima del UIImageView
que contiene el video.
Creé un botón con acción:
@IBAction func takePhoto(_sender: Any) {
// functionality to obtain still image
}
Mi problema es que no estoy seguro de cómo obtener una imagen fija de la sesión de captura y llenar el nuevo UIImageView
con ella.
Después de ver la información / preguntas publicadas en Stack, la mayoría de las soluciones es usar:
captureStillImageAsynchronouslyFromConnection
No estoy seguro de si es solo Swift 3.0, pero xCode no reconoce esta función.
¿Podría alguien por favor asesorarme sobre cómo lograr realmente el resultado de obtener y mostrar una imagen fija al hacer clic en el botón?
Aquí hay un enlace a mi código completo para una mejor comprensión de mi programa.
Gracias de antemano por tomarse el tiempo para leer mi pregunta y no dude en decirme en caso de que haya perdido algunos datos relevantes.