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

0

残念ながら、ストア以外のアプリでは CaptureElement を使用できません。>カメラのプレビューを表示できるようにするために、WPFまたはWinFormアプリで使用できる別のコンポーネントはありますか?

WinRT 以外のアプリケーションで CaptureElement に似たものを使用するための解決策として、 http ://wpfcap.codeplex.com/ を見つけました。

Windowsフォームアプリでホストされているwpfコントロールで使用しましたが、問題はありませんでした. MediaCapture を使用して写真をキャプチャし続ける必要があり、タブレットで写真が暗すぎるという問題も発生しています (PC では問題ありません)。capture.CapturePhotoToStreamAsync を呼び出すと、プレビューに表示されているとおりに写真が撮影されるようです。

于 2014-06-03T09:56:51.620 に答える
0

After the picture is taken I do the following:

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

The preview XAML control is

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