7

在 Windows 8 桌面应用程序上,我需要使用 C# 4.5 中的相机拍照。

我尝试使用 CameraCaptureUI 类,但它在桌面应用程序上不可用。

所以我尝试使用适用于 Metro 应用程序或桌面应用程序的 MediaCapture 类。根据此处找到的示例,它效果很好:http: //code.msdn.microsoft.com/windowsapps/media-capture-sample-adf87622/

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;

我可以使用相机拍照,但无法在拍照前显示预览。为了能够显示预览,我必须使用组件 CaptureElement,例如使用以下代码:

captureElement.Source = mediaCapture;
await mediaCapture.startPreviewAsync();

不幸的是,我不能在非商店应用程序上使用 CaptureElement。我可以在 WPF 或 WinForm 应用程序中使用另一个组件来显示相机的预览吗?

4

3 回答 3

4

迟到的回复,但以防将来对人们有所帮助:可以通过 D3DImage 和一些本机互操作来在 WPF 中预览 MediaCapture(创建自定义媒体基础接收器,获取 DirectX 11 纹理,将它们转换为 DirectX 9)。它是一些代码,但可以封装,因此从 C# 调用它仍然很简单。这是一些代码示例: https ://github.com/mmaitre314/MediaCaptureWPF

于 2015-07-19T22:42:30.500 回答
0

拍摄照片后,我执行以下操作:

_ms.Seek(0);
var _bmp = new BitmapImage();
_bmp.SetSource(_ms);
preview1.Source = _bmp;

预览 XAML 控件是

<Image x:Name="preview1" Margin="850,90,102,362" />
于 2013-10-15T15:04:11.620 回答
0

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 ?

For a solution to using something similar to CaptureElement in a non-WinRT application, I've found this: http://wpfcap.codeplex.com/

I have used it on a wpf control hosted in a Windows forms app and had no problems. Only that I had to keep using MediaCapture to capture photos and I'm also having the problem of the pictures too dark on the tablet (ok on pc). It seems that calling capture.CapturePhotoToStreamAsync sincronously takes the photo as you see it on the preview.

于 2014-06-03T09:56:51.620 回答