Captura de fotos con poca luz y alto rango dinámico (HDR)High dynamic range (HDR) and low-light photo capture

En este artículo se muestra cómo usar la clase AdvancedPhotoCapture para capturar fotos de alto rango dinámico (HDR).This article shows you how to use the AdvancedPhotoCapture class to capture high dynamic range (HDR) photos. Esta API también te permite obtener un marco de referencia de la captura HDR antes de que finalice el procesamiento de la imagen final.This API also allows you to obtain a reference frame from the HDR capture before the processing of the final image is complete.

Otros artículos relacionados con la captura HDR incluyen:Other articles related to HDR capture include:

Nota

A partir de la versión 1709 de Windows 10, se admite la grabación de vídeo y el uso de AdvancedPhotoCapture simultáneamente.Starting with Windows 10, version 1709, recording video and using AdvancedPhotoCapture concurrently is supported. Esto no se admite en las versiones anteriores.This is not supported in previous versions. Este cambio significa que puede tener un LowLagMediaRecording preparado y AdvancedPhotoCapture al mismo tiempo.This change means that you can have a prepared LowLagMediaRecording and AdvancedPhotoCapture at the same time. Puede iniciar o detener la grabación de vídeo entre las llamadas a MediaCapture. PrepareAdvancedPhotoCaptureAsync y AdvancedPhotoCapture. FinishAsync.You can start or stop video recording between calls to MediaCapture.PrepareAdvancedPhotoCaptureAsync and AdvancedPhotoCapture.FinishAsync. También puede llamar a AdvancedPhotoCapture. CaptureAsync mientras el vídeo se está grabando.You can also call AdvancedPhotoCapture.CaptureAsync while video is recording. Sin embargo, algunos escenarios de AdvancedPhotoCapture , como la captura de una foto HDR mientras se graban vídeos harían que algunos fotogramas de vídeo se modificaran mediante la captura de HDR, lo que da lugar a una experiencia de usuario negativa.However, some AdvancedPhotoCapture scenarios, like capturing an HDR photo while recording video would cause some video frames to be altered by the HDR capture, resulting in a negative user experience. Por esta razón, la lista de modos devueltos por AdvancedPhotoControl. SupportedModes será diferente mientras se graba el vídeo.For this reason, the list of modes returned by the AdvancedPhotoControl.SupportedModes will be different while video is recording. Debe comprobar este valor inmediatamente después de iniciar o detener la grabación de vídeo para asegurarse de que se admite el modo deseado en el estado de grabación de vídeo actual.You should check this value immediately after starting or stopping video recording to ensure that the desired mode is supported in the current video recording state.

Nota

A partir de Windows 10, versión 1709, cuando se establece AdvancedPhotoCapture en modo HDR, se omite el valor de la propiedad FlashControl. Enabled y nunca se activa el flash.Starting with Windows 10, version 1709, when the AdvancedPhotoCapture is set to HDR mode, the setting of the FlashControl.Enabled property is ignored and the flash is never fired. En el caso de otros modos de captura, si FlashControl. Enabled, invalidará la configuración de AdvancedPhotoCapture y hará que se capture una foto normal con flash.For other capture modes, if the FlashControl.Enabled, it will override the AdvancedPhotoCapture settings and cause a normal photo to be captured with flash. Si auto se establece en true, AdvancedPhotoCapture puede o no usar Flash, según el comportamiento predeterminado del controlador de la cámara para las condiciones de la escena actual.If Auto is set to true, the AdvancedPhotoCapture may or may not use flash, depending on the camera driver's default behavior for the conditions in the current scene. En versiones anteriores, la configuración de Flash de AdvancedPhotoCapture siempre invalida la configuración FlashControl. Enabled .On previous releases, the AdvancedPhotoCapture flash setting always overrides the FlashControl.Enabled setting.

Nota

Este artículo se basa en los conceptos y el código analizados en Captura básica de fotos, audio y vídeo con MediaCapture, donde se describen los pasos para implementar la captura básica de fotos y vídeo.This article builds on concepts and code discussed in Basic photo, video, and audio capture with MediaCapture, which describes the steps for implementing basic photo and video capture. Se recomienda que te familiarices con el patrón de captura de multimedia básico de ese artículo antes de pasar a escenarios de captura más avanzados.We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. El código que encontrarás en este artículo se ha agregado suponiendo que la aplicación ya tiene una instancia de MediaCapture inicializada correctamente.The code in this article assumes that your app already has an instance of MediaCapture that has been properly initialized.

Existe una muestra universal de Windows que demuestra el uso de la clase AdvancedPhotoCapture, que puedes usar para ver la API usada en contexto o como un punto de partida para tu propia aplicación.There is a Universal Windows Sample demonstrating the use of the AdvancedPhotoCapture class that you can use to see the API used in context or as a starting point for your own app. Para obtener más información, consulta Camera Advanced Capture sample (Muestra de captura de cámara avanzada).For more information see, Camera Advanced Capture sample.

Espacios nombres de captura de fotos avanzadaAdvanced photo capture namespaces

Los ejemplos de código de este artículo usan las API de los espacios de nombres siguientes además de los espacios de nombres necesarios para la captura multimedia básica.The code examples in this article use APIs in the following namespaces in addition to the namespaces required for basic media capture.

using Windows.Media.Core;
using Windows.Media.Devices;

Captura de fotos HDRHDR photo capture

Determinar si se admite la captura de fotos HDR en el dispositivo actualDetermine if HDR photo capture is supported on the current device

La técnica de captura HDR descrita en este artículo se realiza mediante el objeto AdvancedPhotoCapture.The HDR capture technique described in this article is performed using the AdvancedPhotoCapture object. No todos los dispositivos admiten la captura HDR con AdvancedPhotoCapture.Not all devices support HDR capture with AdvancedPhotoCapture. Determina si el dispositivo en el que se está ejecutando la aplicación admite la técnica mediante la obtención del elemento VideoDeviceController del objeto MediaCapture y luego la obtención de la propiedad AdvancedPhotoControl.Determine if the device on which your app is currently running supports the technique by getting the MediaCapture object's VideoDeviceController and then getting the AdvancedPhotoControl property. Compruebe la colección SupportedModes del controlador de dispositivo de vídeo para ver si incluye AdvancedPhotoMode. HDR. Si es así, se admite la captura de HDR mediante AdvancedPhotoCapture .Check the video device controller's SupportedModes collection to see if it includes AdvancedPhotoMode.Hdr. If it does, HDR capture using AdvancedPhotoCapture is supported.

bool _hdrSupported;
private void IsHdrPhotoSupported()
{
    _hdrSupported = _mediaCapture.VideoDeviceController.AdvancedPhotoControl.SupportedModes.Contains(Windows.Media.Devices.AdvancedPhotoMode.Hdr);
}

Configurar y preparar el objeto AdvancedPhotoCaptureConfigure and prepare the AdvancedPhotoCapture object

Dado que necesitarás acceder a la instancia de AdvancedPhotoCapture desde varias ubicaciones dentro del código, se debe declarar una variable de miembro que contenga el objeto.Because you will need to access the AdvancedPhotoCapture instance from multiple places within your code, you should declare a member variable to hold the object.

private AdvancedPhotoCapture _advancedCapture;

En la aplicación, después de inicializar el objeto MediaCapture , cree un objeto AdvancedPhotoCaptureSettings y establezca el modo en AdvancedPhotoMode. HDR. Llame al método Configure del objeto AdvancedPhotoControl , pasando el objeto AdvancedPhotoCaptureSettings que ha creado.In your app, after you have initialized the MediaCapture object, create an AdvancedPhotoCaptureSettings object and set the mode to AdvancedPhotoMode.Hdr. Call the AdvancedPhotoControl object's Configure method, passing in the AdvancedPhotoCaptureSettings object you created.

Llama al método PrepareAdvancedPhotoCaptureAsync del objeto MediaCapture y pasa un objeto ImageEncodingProperties que especifique el tipo de codificación que debe usar la captura.Call the MediaCapture object's PrepareAdvancedPhotoCaptureAsync, passing in an ImageEncodingProperties object specifying the type of encoding the capture should use. La clase ImageEncodingProperties proporciona métodos estáticos para crear las codificaciones de imagen que son compatibles con MediaCapture.The ImageEncodingProperties class provides static methods for creating the image encodings that are supported by MediaCapture.

PrepareAdvancedPhotoCaptureAsync devuelve el objeto AdvancedPhotoCapture que se usará para iniciar la captura de fotos.PrepareAdvancedPhotoCaptureAsync returns the AdvancedPhotoCapture object you will use to initiate photo capture. Puedes usar este objeto para registrar los controladores para los elementos OptionalReferencePhotoCaptured y AllPhotosCaptured que se describen más adelante en este artículo.You can use this object to register handlers for the OptionalReferencePhotoCaptured and AllPhotosCaptured which are discussed later in this article.

if (_hdrSupported == false) return;

// Choose HDR mode
var settings = new AdvancedPhotoCaptureSettings { Mode = AdvancedPhotoMode.Hdr };

// Configure the mode
_mediaCapture.VideoDeviceController.AdvancedPhotoControl.Configure(settings);

// Prepare for an advanced capture
_advancedCapture = 
    await _mediaCapture.PrepareAdvancedPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Nv12));

// Register for events published by the AdvancedCapture
_advancedCapture.AllPhotosCaptured += AdvancedCapture_AllPhotosCaptured;
_advancedCapture.OptionalReferencePhotoCaptured += AdvancedCapture_OptionalReferencePhotoCaptured;

Capturar una foto HDRCapture an HDR photo

Captura una foto HDR mediante una llamada al método CaptureAsync del objeto AdvancedPhotoCapture.Capture an HDR photo by calling the AdvancedPhotoCapture object's CaptureAsync method. Este método devuelve un objeto AdvancedCapturedPhoto que proporciona la foto capturada en su propiedad Frame.This method returns an AdvancedCapturedPhoto object that provides the captured photo in its Frame property.

try
{

    // Start capture, and pass the context object
    AdvancedCapturedPhoto advancedCapturedPhoto = await _advancedCapture.CaptureAsync();

    using (var frame = advancedCapturedPhoto.Frame)
    {
        // Read the current orientation of the camera and the capture time
        var photoOrientation = CameraRotationHelper.ConvertSimpleOrientationToPhotoOrientation(
            _rotationHelper.GetCameraCaptureOrientation());
        var fileName = String.Format("SimplePhoto_{0}_HDR.jpg", DateTime.Now.ToString("HHmmss"));
        await SaveCapturedFrameAsync(frame, fileName, photoOrientation);
    }
}
catch (Exception ex)
{
    Debug.WriteLine("Exception when taking an HDR photo: {0}", ex.ToString());
}

La mayoría de las aplicaciones de fotografía querrán codificar la rotación de la foto capturada en el archivo de imagen para que pueda mostrarse correctamente en otros dispositivos y aplicaciones.Most photography apps will want to encode a captured photo's rotation into the image file so that it can be displayed correctly by other apps and devices. En este ejemplo se muestra el uso de la clase auxiliar CameraRotationHelper para calcular la orientación correcta del archivo.This example shows the use of the helper class CameraRotationHelper to calculate the proper orientation for the file. Esta clase se describe y muestra en su totalidad en el artículo Controlar la orientación del dispositivo con MediaCapture.This class is described and listed in full in the article Handle device orientation with MediaCapture.

El método auxiliar SaveCapturedFrameAsync, que guarda la imagen en el disco, se explica más adelante en este artículo.The SaveCapturedFrameAsync helper method, which saves the image to disk, is discussed later in this article.

Obtener el marco de referencia opcionalGet optional reference frame

El proceso HDR captura distintos marcos y, después, los compone en una sola imagen una vez que todos los marcos se han capturado.The HDR process captures multiple frames and then composites them into a single image after all of the frames have been captured. Puedes obtener acceso a un fotograma después de se capture, pero antes que todo el proceso HDR se complete mediante el control del evento OptionalReferencePhotoCaptured.You can get access to a frame after it is captured but before the entire HDR process is complete by handling the OptionalReferencePhotoCaptured event. No es necesario hacerlo si solamente estás interesado en el resultado final de la foto HDR.You don't need to do this if you are only interested in the final HDR photo result.

Importante

OptionalReferencePhotoCaptured no se genera en dispositivos que admiten hardware HDR y, por tanto, no se generan los marcos de referencia.OptionalReferencePhotoCaptured is not raised on devices that support hardware HDR and therefore do not generate reference frames. La aplicación debe controlar el caso donde no se genera este evento.Your app should handle the case where this event is not raised.

Dado que el fotograma de referencia llega fuera del contexto de la llamada a CaptureAsync, se ofrece un mecanismo para pasar información del contexto al controlador OptionalReferencePhotoCaptured.Because the reference frame arrives out of context of the call to CaptureAsync, a mechanism is provided to pass context information to the OptionalReferencePhotoCaptured handler. Primero debes llamar a un objeto que contenga la información del contexto.First you should call an object that will contain your context information. Tú decides el nombre y el contenido de este objeto.The name and contents of this object is up to you. Este ejemplo define un objeto que tiene miembros para realizar un seguimiento del nombre de archivo y de la orientación de cámara de la captura.This example defines an object that has members to track the file name and camera orientation of the capture.

public class MyAdvancedCaptureContextObject
{
    public string CaptureFileName;
    public PhotoOrientation CaptureOrientation;
}

Crea una nueva instancia del objeto de contexto, rellena sus miembros y luego pásala a la sobrecarga de CaptureAsync que acepta un objeto como un parámetro.Create a new instance of your context object, populate its members, and then pass it into the overload of CaptureAsync that accepts an object as a parameter.

// Read the current orientation of the camera and the capture time
var photoOrientation = CameraRotationHelper.ConvertSimpleOrientationToPhotoOrientation(
        _rotationHelper.GetCameraCaptureOrientation());
var fileName = String.Format("SimplePhoto_{0}_HDR.jpg", DateTime.Now.ToString("HHmmss"));

// Create a context object, to identify the capture in the OptionalReferencePhotoCaptured event
var context = new MyAdvancedCaptureContextObject()
{
    CaptureFileName = fileName,
    CaptureOrientation = photoOrientation
};

// Start capture, and pass the context object
AdvancedCapturedPhoto advancedCapturedPhoto = await _advancedCapture.CaptureAsync(context);

En el controlador de eventos OptionalReferencePhotoCaptured, convierte la propiedad Context del objeto OptionalReferencePhotoCapturedEventArgs a la clase del objeto de contexto.In the OptionalReferencePhotoCaptured event handler, cast the Context property of the OptionalReferencePhotoCapturedEventArgs object to your context object class. En este ejemplo se modifica el nombre de archivo para distinguir la imagen del fotograma de referencia de la imagen HDR final y después se llama al método auxiliar SaveCapturedFrameAsync para guardar la imagen.This example modifies the file name to distinguish the reference frame image from the final HDR image and then calls the SaveCapturedFrameAsync helper method to save the image.

private async void AdvancedCapture_OptionalReferencePhotoCaptured(AdvancedPhotoCapture sender, OptionalReferencePhotoCapturedEventArgs args)
{
    // Retrieve the context (i.e. what capture does this belong to?)
    var context = args.Context as MyAdvancedCaptureContextObject;

    // Remove "_HDR" from the name of the capture to create the name of the reference
    var referenceName = context.CaptureFileName.Replace("_HDR", "");

    using (var frame = args.Frame)
    {
        await SaveCapturedFrameAsync(frame, referenceName, context.CaptureOrientation);
    }
}

Recibir una notificación cuando se han capturado todos los fotogramasReceive a notification when all frames have been captured

La captura de fotos HDR tiene dos pasos.The HDR photo capture has two steps. En primer lugar, se capturan varios marcos y, a continuación, se procesan los marcos en la imagen HDR final.First, multiple frames are captured, and then the frames are processed into the final HDR image. No puedes iniciar otra captura mientras se sigan capturando los fotogramas HDR de origen, pero puedes iniciar una captura después de que se han capturado todos los fotogramas, si bien antes de que finalice el posprocesamiento HDR.You can't initiate another capture while the source HDR frames are still being captured, but you can initiate a capture after all of the frames have been captured but before the HDR post-processing is complete. El evento AllPhotosCaptured se genera cuando las capturas HDR se completan, lo que te permite saber que puedes iniciar otra captura.The AllPhotosCaptured event is raised when the HDR captures are complete, letting you know that you can initiate another capture. Un escenario típico consiste en deshabilitar el botón de captura de la interfaz de usuario cuando comienza la captura HDR para después volver a habilitarlo cuando se genera AllPhotosCaptured.A typical scenario is to disable your UI's capture button when HDR capture begins and then reenable it when AllPhotosCaptured is raised.

private void AdvancedCapture_AllPhotosCaptured(AdvancedPhotoCapture sender, object args)
{
    // Update UI to enable capture button
}

Limpiar el objeto AdvancedPhotoCaptureClean up the AdvancedPhotoCapture object

Cuando la aplicación haya terminado de capturar, antes de eliminar el objeto MediaCapture, debes apagar el objeto AdvancedPhotoCapture con una llamada a FinishAsync y establecer la variable de miembro en null.When your app is done capturing, before disposing of the MediaCapture object, you should shut down the AdvancedPhotoCapture object by calling FinishAsync and setting your member variable to null.

await _advancedCapture.FinishAsync();
_advancedCapture = null;

Captura de fotos con poca luzLow-light photo capture

A partir de Windows 10, versión 1607, se puede usar la clase AdvancedPhotoCapture para capturar fotos con un algoritmo integrado que mejora la calidad de las fotos que se capturan con configuración de poca luz.Starting with Windows 10, version 1607, AdvancedPhotoCapture can be used to capture photos using a built-in algorithm that enhances the quality of photos captured in low-light settings. Cuando uses la característica de poca luz de la clase AdvancedPhotoCapture, el sistema evaluará la escena actual y, si es necesario, aplicará un algoritmo para compensar las condiciones de poca luz.When you use the low-light feature of the AdvancedPhotoCapture class, the system will evaluate the current scene and, if needed, apply an algorithm to compensate for low-light conditions. Si el sistema determina que el algoritmo no es necesario, se realiza una captura normal en su lugar.If the system determines that the algorithm is not needed, a regular capture is performed instead.

Antes de usar una captura de fotos con poca luz, determina si el dispositivo en el que se está ejecutando la aplicación admite la técnica mediante la obtención del elemento VideoDeviceController del objeto MediaCapture y, luego, la obtención de la propiedad AdvancedPhotoControl.Before using low-light photo capture, determine if the device on which your app is currently running supports the technique by getting the MediaCapture object's VideoDeviceController and then getting the AdvancedPhotoControl property. Comprueba la colección SupportedModes del controlador del dispositivo de vídeo para ver si incluye AdvancedPhotoMode.LowLight.Check the video device controller's SupportedModes collection to see if it includes AdvancedPhotoMode.LowLight. Si es así, se admite la captura con poca luz mediante AdvancedPhotoCapture.If it does, low-light capture using AdvancedPhotoCapture is supported.

bool _lowLightSupported;
_lowLightSupported = 
_mediaCapture.VideoDeviceController.AdvancedPhotoControl.SupportedModes.Contains(Windows.Media.Devices.AdvancedPhotoMode.LowLight);

A continuación, declara una variable de miembro para almacenar el objeto AdvancedPhotoCapture.Next, declare a member variable to store the AdvancedPhotoCapture object.

private AdvancedPhotoCapture _advancedCapture;

En la aplicación, después de inicializar el objeto MediaCapture, crea un objeto AdvancedPhotoCaptureSettings y establece el modo en AdvancedPhotoMode.LowLight.In your app, after you have initialized the MediaCapture object, create an AdvancedPhotoCaptureSettings object and set the mode to AdvancedPhotoMode.LowLight. Llama al método Configure del objeto AdvancedPhotoControl y pasa el objeto AdvancedPhotoCaptureSettings que creaste.Call the AdvancedPhotoControl object's Configure method, passing in the AdvancedPhotoCaptureSettings object you created.

Llama al método PrepareAdvancedPhotoCaptureAsync del objeto MediaCapture y pasa un objeto ImageEncodingProperties que especifique el tipo de codificación que debe usar la captura.Call the MediaCapture object's PrepareAdvancedPhotoCaptureAsync, passing in an ImageEncodingProperties object specifying the type of encoding the capture should use.

if (_lowLightSupported == false) return;

// Choose LowLight mode
var settings = new AdvancedPhotoCaptureSettings { Mode = AdvancedPhotoMode.LowLight };
_mediaCapture.VideoDeviceController.AdvancedPhotoControl.Configure(settings);

// Prepare for an advanced capture
_advancedCapture = 
    await _mediaCapture.PrepareAdvancedPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Nv12));

Para capturar una foto, llama a CaptureAsync.To capture a photo, call CaptureAsync.

AdvancedCapturedPhoto advancedCapturedPhoto = await _advancedCapture.CaptureAsync();
var photoOrientation = ConvertOrientationToPhotoOrientation(GetCameraOrientation());
var fileName = String.Format("SimplePhoto_{0}_LowLight.jpg", DateTime.Now.ToString("HHmmss"));
await SaveCapturedFrameAsync(advancedCapturedPhoto.Frame, fileName, photoOrientation);

Como en el ejemplo de HDR anterior, en este ejemplo se usa una clase auxiliar denominada CameraRotationHelper para determinar el valor de rotación que se debe codificar en la imagen para que pueda mostrarse correctamente en otros dispositivos y aplicaciones.Like the HDR example above, this example uses a helper class called CameraRotationHelper to determine the rotation value that should be encoded into the image so that it can be displayed properly by other apps and devices. Esta clase se describe y muestra en su totalidad en el artículo Controlar la orientación del dispositivo con MediaCapture.This class is described and listed in full in the article Handle device orientation with MediaCapture.

El método auxiliar SaveCapturedFrameAsync, que guarda la imagen en el disco, se explica más adelante en este artículo.The SaveCapturedFrameAsync helper method, which saves the image to disk, is discussed later in this article.

Puedes capturar varias fotos con poca luz sin volver a configurar el objeto AdvancedPhotoCapture, pero, al terminar la captura, debes llamar a FinishAsync para limpiar el objeto y los recursos asociados.You can capture multiple low-light photos without reconfiguring the AdvancedPhotoCapture object, but when you are done capturing, you should call FinishAsync to clean up the object and associated resources.

await _advancedCapture.FinishAsync();
_advancedCapture = null;

Trabajo con objetos AdvancedCapturedPhotoWorking with AdvancedCapturedPhoto objects

AdvancedPhotoCapture.CaptureAsync devuelve un objeto AdvancedCapturedPhoto que representa la foto capturada.AdvancedPhotoCapture.CaptureAsync returns an AdvancedCapturedPhoto object representing the captured photo. Este objeto expone la propiedad Frame, que devuelve un objeto CapturedFrame que representa la imagen.This object exposes the Frame property which returns a CapturedFrame object representing the image. El evento OptionalReferencePhotoCaptured también proporciona un objeto CapturedFrame en sus argumentos.The OptionalReferencePhotoCaptured event also provides a CapturedFrame object in its event args. Después de obtener un objeto de este tipo, hay una serie de cosas que puedes hacer con él, como crear un objeto SoftwareBitmap o guardar la imagen en un archivo.After you get an object of this type, there are a number of things you can do with it, including creating a SoftwareBitmap or saving the image to a file.

Obtener un objeto SoftwareBitmap de un objeto CapturedFrameGet a SoftwareBitmap from a CapturedFrame

Para obtener un objeto SoftwareBitmap de un objeto CapturedFrame fácilmente, solo tienes que acceder a la propiedad SoftwareBitmap del objeto.It's trivial to get a SoftwareBitmap from a CapturedFrame object by simply accessing the SoftwareBitmap property of the object. Sin embargo, la mayoría de los formatos de codificación no admiten SoftwareBitmap con AdvancedPhotoCapture, por lo que debes comprobar que la propiedad no sea nula antes de usarla.However, most encoding formats do not support SoftwareBitmap with AdvancedPhotoCapture, so you should check and make sure the property is not null before using it.

SoftwareBitmap bitmap;
if (advancedCapturedPhoto.Frame.SoftwareBitmap != null)
{
    bitmap = advancedCapturedPhoto.Frame.SoftwareBitmap;
}

En la versión actual, el único formato de codificación que admite SoftwareBitmap para AdvancedPhotoCapture es NV12 sin comprimir.In the current release, the only encoding format that supports SoftwareBitmap for AdvancedPhotoCapture is uncompressed NV12. Por lo tanto, si quieres usar esta característica, debes especificar esa codificación cuando llames a PrepareAdvancedPhotoCaptureAsync.So, if you want to use this feature, you must specify that encoding when you call PrepareAdvancedPhotoCaptureAsync.

_advancedCapture =
    await _mediaCapture.PrepareAdvancedPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Nv12));

Por supuesto, siempre puedes guardar la imagen en un archivo y, luego, cargar el archivo en un objeto SoftwareBitmap en otro paso.Of course, you can always save the image to a file and then load the file into a SoftwareBitmap in a separate step. Para obtener más información sobre el uso del objeto SoftwareBitmap, consulta Crear, editar y guardar imágenes de mapa de bits.For more information about working with SoftwareBitmap, see Create, edit, and save bitmap images.

Guardar un objeto CapturedFrame en un archivoSave a CapturedFrame to a file

La clase CapturedFrame implementa la interfaz IInputStream, de modo que puede usarse como entrada para una clase BitmapDecoder; posteriormente, una clase BitmapEncoder puede usarse para escribir los datos de imagen en el disco.The CapturedFrame class implements the IInputStream interface, so it can be used as the input to a BitmapDecoder, and then a BitmapEncoder can be used to write the image data to disk.

En el ejemplo siguiente, se crea una carpeta nueva en la biblioteca de imágenes del usuario y se crea un archivo dentro de esta carpeta.In the following example, a new folder in the user's pictures library is created and a file is created within this folder. Ten en cuenta que la aplicación deberá incluir la funcionalidad Biblioteca de imágenes en el archivo de manifiesto de la aplicación para poder acceder a este directorio.Note that your app will need to include the Pictures Library capability in your app manifest file in order to access this directory. A continuación, se abre una secuencia de archivos en el archivo especificado.A file stream is then opened to the specified file. Después, se llama a BitmapDecoder.CreateAsync para crear el descodificador desde la clase CapturedFrame.Next, the BitmapDecoder.CreateAsync is called to create the decoder from the CapturedFrame. Luego, CreateForTranscodingAsync crea un codificador desde la secuencia de archivos y el descodificador.Then CreateForTranscodingAsync creates an encoder from the file stream and the decoder.

En los pasos siguientes se codifica la orientación de la foto en el archivo de imagen mediante el método BitmapProperties del codificador.The next steps encode the orientation of the photo into the image file by using the BitmapProperties of the encoder. Para obtener más información sobre cómo controlar la orientación al capturar imágenes, consulta Controlar la orientación del dispositivo con MediaCapture.For more information about handling orientation when capturing images, see Handle device orientation with MediaCapture.

Por último, la imagen se escribe en el archivo con una llamada a FlushAsync.Finally, the image is written to the file with a call to FlushAsync.

private static async Task<StorageFile> SaveCapturedFrameAsync(CapturedFrame frame, string fileName, PhotoOrientation photoOrientation)
{
    var folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("MyApp", CreationCollisionOption.OpenIfExists);
    var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);

    using (var inputStream = frame)
    {
        using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
            var decoder = await BitmapDecoder.CreateAsync(inputStream);
            var encoder = await BitmapEncoder.CreateForTranscodingAsync(fileStream, decoder);
            var properties = new BitmapPropertySet {
                { "System.Photo.Orientation", new BitmapTypedValue(photoOrientation, PropertyType.UInt16) } };
            await encoder.BitmapProperties.SetPropertiesAsync(properties);
            await encoder.FlushAsync();
        }
    }
    return file;
}