Capturar fotos e vídeos com a interface do usuário da câmera interna do Windows
Este artigo descreve como usar a classe CameraCaptureUI para capturar fotos ou vídeos usando a interface do usuário da câmera interna do Windows. Esse recurso é fácil de usar. Ele permite que seu aplicativo obtenha uma foto ou vídeo capturado pelo usuário com apenas algumas linhas de código.
Se você quiser fornecer sua própria interface do usuário da câmera ou se seu cenário exigir um controle mais robusto e de baixo nível da operação de captura, use a classe MediaCapture e implemente sua própria experiência de captura. Para obter mais informações, consulte Captura básica de foto, vídeo e áudio com MediaCapture.
Observação
Você não deve especificar os recursos de webcam nem microfone no arquivo de manifesto do aplicativo se o aplicativo usar apenas CameraCaptureUI. Se você fizer isso, seu aplicativo será exibido nas configurações de privacidade da câmera do dispositivo, mas mesmo que o usuário negue o acesso da câmera ao seu aplicativo, isso não impedirá que o CameraCaptureUI capture mídia.
Isso ocorre porque o aplicativo de câmera interno do Windows é um aplicativo primário confiável que exige que o usuário inicie a captura de foto, áudio e vídeo pressionando um botão. Seu aplicativo poderá falhar na certificação do Kit de Certificação de Aplicativos do Windows quando enviado à Microsoft Store se você especificar os recursos de webcam ou microfone ao usar CameraCaptureUI como seu único mecanismo de captura de fotos.
Você deve especificar os recursos de webcam ou microfone no arquivo de manifesto do aplicativo se estiver usando o MediaCapture para capturar áudio, fotos ou vídeo programaticamente.
Capturar uma foto com CameraCaptureUI
Para usar a interface do usuário de captura de câmera, inclua o namespace Windows.Media.Capture em seu projeto. Para fazer operações de arquivo com o arquivo de imagem retornado, inclua Windows.Storage.
using Windows.Media.Capture;
using Windows.Storage;
#include <winrt/Windows.Media.Capture.h>
#include <winrt/Windows.Media.Playback.h>
#include <winrt/Windows.Storage.h>
using namespace winrt;
using namespace Windows::Media::Capture;
using namespace Windows::Storage;
Para capturar uma foto, crie um novo objeto CameraCaptureUI. Usando a propriedade PhotoSettings do objeto, você pode especificar propriedades para a foto retornada, como o formato de imagem da foto. Por padrão, a interface do usuário de captura da câmera dá suporte ao corte da foto antes que ela seja retornada. Isso pode ser desabilitado com a propriedade AllowCropping . Este exemplo define o CroppedSizeInPixels para solicitar que a imagem retornada tenha 200 x 200 em pixels.
Observação
Não há suporte para o corte de imagem no CameraCaptureUI para dispositivos na família de dispositivos móveis. O valor da propriedade AllowCropping é ignorado quando o aplicativo está em execução nesses dispositivos.
Chame CaptureFileAsync e especifique CameraCaptureUIMode.Photo para especificar que uma foto deve ser capturada. O método retorna uma instância StorageFile que contém a imagem se a captura for bem-sucedida. Se o usuário cancelar a captura, o objeto retornado será nulo.
CameraCaptureUI captureUI = new CameraCaptureUI();
captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg;
captureUI.PhotoSettings.CroppedSizeInPixels = new Size(200, 200);
StorageFile photo = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Photo);
if (photo == null)
{
// User cancelled photo capture
return;
}
CameraCaptureUI captureUI;
captureUI.PhotoSettings().Format(CameraCaptureUIPhotoFormat::Jpeg);
captureUI.PhotoSettings().CroppedSizeInPixels({ 200, 200 });
StorageFile photo = co_await captureUI.CaptureFileAsync(CameraCaptureUIMode::Photo);
if (!photo)
{
// User cancelled photo capture
co_return;
}
O StorageFile que contém a foto capturada recebe um nome gerado dinamicamente e é salvo na pasta local do aplicativo. Para organizar melhor as fotos capturadas, você pode mover o arquivo para uma pasta diferente.
StorageFolder destinationFolder =
await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfilePhotoFolder",
CreationCollisionOption.OpenIfExists);
await photo.CopyAsync(destinationFolder, "ProfilePhoto.jpg", NameCollisionOption.ReplaceExisting);
await photo.DeleteAsync();
StorageFolder destinationFolder =
co_await ApplicationData::Current().LocalFolder().CreateFolderAsync(L"ProfilePhotoFolder",
CreationCollisionOption::OpenIfExists);
co_await photo.CopyAsync(destinationFolder, L"ProfilePhoto.jpg", NameCollisionOption::ReplaceExisting);
co_await photo.DeleteAsync();
Para usar sua foto em seu aplicativo, talvez você queira criar um objeto SoftwareBitmap que possa ser usado com vários recursos diferentes do aplicativo Universal do Windows.
Primeiro, inclua o namespace Windows.Graphics.Imaging em seu projeto.
using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Storage.Streams.h>
using namespace Windows::Graphics::Imaging;
using namespace Windows::Storage::Streams;
Chame OpenAsync para obter um fluxo do arquivo de imagem. Chame BitmapDecoder.CreateAsync para obter um decodificador de bitmap para o fluxo. Em seguida, chame GetSoftwareBitmap para obter uma representação SoftwareBitmap da imagem.
IRandomAccessStream stream = await photo.OpenAsync(FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync();
IRandomAccessStream stream = co_await photo.OpenAsync(FileAccessMode::Read);
BitmapDecoder decoder = co_await BitmapDecoder::CreateAsync(stream);
SoftwareBitmap softwareBitmap = co_await decoder.GetSoftwareBitmapAsync();
Para exibir a imagem em sua interface do usuário, declare um controle Image em sua página XAML.
<Image x:Name="imageControl" Width="200" Height="200"/>
<Image x:Name="imageControl" Width="200" Height="200"/>
Para usar o bitmap de software em sua página XAML, inclua o namespace using Windows.UI.Xaml.Media.Imaging em seu projeto.
using Windows.UI.Xaml.Media.Imaging;
#include <winrt/Windows.UI.Xaml.Media.Imaging.h>
using namespace Windows::UI::Xaml::Media::Imaging;
O controle Image requer que a origem da imagem esteja no formato BGRA8 com alfa pré-multiplicado ou sem alfa. Chame o método estático SoftwareBitmap.Convert para criar um novo bitmap de software com o formato desejado. Em seguida, crie um novo objeto SoftwareBitmapSource e chame-o de SetBitmapAsync para atribuir o bitmap de software à origem. Por fim, defina a propriedade Source do controle Image para exibir a foto capturada na interface do usuário.
SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap.Convert(softwareBitmap,
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied);
SoftwareBitmapSource bitmapSource = new SoftwareBitmapSource();
await bitmapSource.SetBitmapAsync(softwareBitmapBGR8);
imageControl.Source = bitmapSource;
SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap::Convert(softwareBitmap,
BitmapPixelFormat::Bgra8,
BitmapAlphaMode::Premultiplied);
SoftwareBitmapSource bitmapSource;
co_await bitmapSource.SetBitmapAsync(softwareBitmapBGR8);
imageControl().Source(bitmapSource);
Capturar um vídeo com CameraCaptureUI
Para capturar um vídeo, crie um novo objeto CameraCaptureUI. Usando a propriedade VideoSettings do objeto, você pode especificar propriedades para o vídeo retornado, como o formato do vídeo.
Chame CaptureFileAsync e especifique Video para capturar um vídeo. O método retorna uma instância StorageFile contendo o vídeo se a captura for bem-sucedida. Se você cancelar a captura, o objeto retornado será nulo.
CameraCaptureUI captureUI = new CameraCaptureUI();
captureUI.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4;
StorageFile videoFile = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Video);
if (videoFile == null)
{
// User cancelled photo capture
return;
}
CameraCaptureUI captureUI;
captureUI.VideoSettings().Format(CameraCaptureUIVideoFormat::Mp4);
StorageFile videoFile = co_await captureUI.CaptureFileAsync(CameraCaptureUIMode::Video);
if (!videoFile)
{
// User cancelled photo capture
co_return;
}
O que você faz com o arquivo de vídeo capturado depende do cenário do seu aplicativo. O restante deste artigo mostra como criar rapidamente uma composição de mídia a partir de um ou mais vídeos capturados e mostrá-la em sua interface do usuário.
Primeiro, adicione um controle MediaPlayerElement no qual a composição de vídeo será exibida em sua página XAML.
<MediaPlayerElement x:Name="mediaPlayerElement" Width="320" Height="240" AreTransportControlsEnabled="True"/>
Quando o arquivo de vídeo retornar da interface do usuário de captura da câmera, crie um novo MediaSource chamando CreateFromStorageFile. Chame o método Play do MediaPlayer padrão associado ao MediaPlayerElement para reproduzir o vídeo.
mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
mediaPlayerElement.MediaPlayer.Play();
mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile));
mediaPlayerElement().MediaPlayer().Play();