Aplicación de escritorio MediaCapture Windows 8: no funciona correctamente

Estoy intentando implementar una captura de imagen a través de esta API, y necesito implementarla en una aplicación de escritorio.

El problema es que cuando CapturePhotoToStorageFileAsync la imagen en un archivo (con CapturePhotoToStorageFileAsync ) obtengo una imagen oscura (casi negra), o obtengo un archivo de tamaño cero.

Aunque mi código es muy simple:

 MediaCapture = new MediaCapture(); await mediaCapture.InitializeAsync(); Windows.Storage.StorageFile photoStorageFile; String PHOTO_FILE_NAME = "photo.jpg"; photoStorageFile = await Windows.Storage.KnownFolders.PicturesLibrary.CreateFileAsync(PHOTO_FILE_NAME, Windows.Storage.CreationCollisionOption.GenerateUniqueName); ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg(); await mediaCapture.CapturePhotoToStorageFileAsync(imageProperties, photoStorageFile); 

Leí otro hilo al respecto: las fotos capturadas son negras cuando se utiliza MediaCapture en Windows Phone 8.1

El problema es que MediaCapture.StartPreviewAsync generó una excepción “Se produjo un error inesperado en la operación solicitada”, y supongo que la razón de esto es el MediaElement que no tengo (de nuevo, escritorio).

También me complace encontrar un ejemplo funcional. Cuando realicé una búsqueda, no encontré ninguna muestra real para implementar MediaCapture en la aplicación de escritorio, vi un artículo pero sin el código adjunto: http://blogs.msdn.com/b /eternalcoding/archive/2013/10/29/how-to-use-specific-winrt-api-from-desktop-apps-capturing-a-photo-using-your-webcam-into-a-wpf-app.aspx

También encontré que otros también preguntaron sobre una muestra, pero sin una respuesta real …

¿Cómo puedo obtener una muestra de trabajo para eso?

Hacer que MediaCapture una vista previa del video de la cámara en las aplicaciones de escritorio no es trivial. No estaba seguro de que todas las piezas estuvieran allí, así que armé un código en GitHub para probarlo y parece que funciona bien.

https://github.com/mmaitre314/MediaCaptureWPF

Una advertencia: la creación de la interoperabilidad de MediaCapture / WPF requería algo de código nativo (C ++ / CLI), por lo que la aplicación debe comstackrse como x86 o x64, pero no como AnyCPU.

Para que la aplicación de su tienda interactúe con la cámara, existen dos formas, una simple y una avanzada:

  • Ya sea utilizando la interfaz de usuario provista, que es una interfaz de usuario común que se usa para capturar medios y le ahorra el dolor de manejar las operaciones básicas de captura,
  • O interactuando con la API de MediaCapture para obtener un control completo sobre todo el flujo de operaciones.

Si solo desea tomar una foto o un video de la cámara web, le sugiero que utilice el primer enfoque que utiliza principalmente la API de CameraCaptureUI , pero si necesita un control completo sobre la operación de captura, necesita algunas líneas de códigos que interactúen con la cámara web. API de MediaCapture

Aquí un ejemplo simple usando la API de CameraCaptureUI:

Digamos que tenemos la siguiente interfaz de usuario:

        

y aquí el botón de captura haga clic en el controlador:

 private async void TakePicture_Click(object sender, RoutedEventArgs e) { var camera = new CameraCaptureUI(); var image = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo); if (image != null) { var stream = await image.OpenAsync(FileAccessMode.Read); var bitmap = new BitmapImage(); bitmap.SetSource(stream); Picture.Source = bitmap; } else { (new MessageDialog("Something went wrong")).ShowAsync(); } } 

También debe ofrecer a su aplicación el permiso para usar la cámara web al verificar la capacidad de la cámara web en el manifiesto de la aplicación.

introduzca la descripción de la imagen aquí