Click here to Skip to main content
15,881,872 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
On a Windows 8 desktop app, I need to take a photo using the camera in C# 4.5.

I've tried to use the CameraCaptureUI class, but it is not available on a desktop app.

So I try to use the MediaCapture class, which is available for Metro app or desktop app. It works great, based on the example found here : http://code.msdn.microsoft.com/windowsapps/media-capture-sample-adf87622/

C#
var capture = new MediaCapture();
// Find the camera device id to use
string deviceId = "";
var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(Windows.Devices.Enumeration.DeviceClass.VideoCapture);
for (var i = 0; i < devices.Count; i++) {
     Console.WriteLine(devices[i]);
     deviceId = devices[i].Id;
}

// init the settings of the capture
var settings = new MediaCaptureInitializationSettings();
settings.AudioDeviceId = "";
settings.VideoDeviceId = deviceId;
settings.PhotoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.Photo;
settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Video;
await capture.InitializeAsync(settings);

// Find the highest resolution available
VideoEncodingProperties resolutionMax = null;
int max = 0;
var resolutions = capture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.Photo);
for (var i = 0; i < resolutions.Count; i++) {
     VideoEncodingProperties res = (VideoEncodingProperties)resolutions[i];
     Console.WriteLine("resolution : " + res.Width + "x" + res.Height);
     if (res.Width * res.Height > max) {
          max = (int)(res.Width * res.Height);
          resolutionMax = res;
     }
}
await capture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, resolutionMax);

ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
var fPhotoStream = new InMemoryRandomAccessStream();

// THE 2 LINES I NEED TO ADD
// captureElement.Source = capture;
// await capture.StartPreviewAsync();

// Take the photo and show it on the screen
await capture.CapturePhotoToStreamAsync(imageProperties, fPhotoStream);
await fPhotoStream.FlushAsync();
fPhotoStream.Seek(0);

byte[] bytes = new byte[fPhotoStream.Size];
await fPhotoStream.ReadAsync(bytes.AsBuffer(), (uint)fPhotoStream.Size, InputStreamOptions.None);

BitmapImage bitmapImage = new BitmapImage();
MemoryStream byteStream = new MemoryStream(bytes);
bitmapImage.BeginInit();
bitmapImage.StreamSource = byteStream;
bitmapImage.EndInit();
image.Source = bitmapImage;


I can take a photo using the camera, but I'm unable to show a preview before taking the photo.
To be able to show the preview, I have to use the component CaptureElement, for example with the following code :
C#
captureElement.Source = mediaCapture;
await mediaCapture.startPreviewAsync();


Unfortunately, I cannot use a CaptureElement on a non store app.
Is there another component that I can use in a WPF or WinForm app, to be able to show the preview of the camera ?
Posted
Comments
Jonathan Morales Vélez 12-Feb-13 11:26am    
Hi,

I'm also trying to capture a photo from a desktop wpf app. I see you say you can use the MediaCapture class on the desktop app too, but I don't know how you are doing it. I can't find the reference to MediaCapture class on my desktop app. Am I missing something. Could you tell me how you use the MediaCapture class in a wpf desktop app please?

Thank you
Ray20 12-Feb-13 11:37am    
See this link to be able to use MediaCapture API on a desktop app : http://www.hanselman.com/blog/HowToCallWinRTAPIsInWindows8FromCDesktopApplicationsWinRTDiagram.aspx
Hope it will help you
Member 9038124 29-Oct-14 23:43pm    
Any solution to this problem? I am having the exact same issue.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900