イメージを含む WPF ウィンドウに、USB カメラでキャプチャされたフレームを継続的に表示しようとしています。
私のコードでは、ViewModel はそのフィールドをパラメーターとしてCameraServiceClass
渡すインスタンスを作成します。次に、イベントがトリガーされるとフィールドが設定されますが、イベントが発生して内部で処理されるため、プロパティの変更を通知する方法がわかりません。_frame
ref
NewFrame
CameraViewModel.Frame
_camera_service
質問は次のとおりです。
ref
このようなパラメーターを使用する必要がありますか?CameraServiceClass
にイベントを追加し、クラスでリッスンし、changed プロパティCameraViewModel
を上げて処理するのは良い考えでしょうか?Frame
はいの場合、どうすればよいですか?CameraServiceClass
それ自体がカスタム FrameReceived イベントを通知し、ビットマップ自体をイベント引数に渡す必要がありますか? はいの場合、どうすればよいですか?
私のクラスは次のとおりです。
<Window x:Class="CameraGUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ap="clr-namespace:CameraGUI"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<ap:CameraViewModel/>
</Window.DataContext>
<Grid>
<Viewbox Stretch="Uniform">
<Image Source="{Binding Frame, Mode=OneWay}" />
</Viewbox>
</Grid>
</Window>
カメラ ビューモデル:
class CameraViewModel : ViewModelBase {
System.Drawing.Bitmap _frame_camera;
public System.Windows.Media.Imaging.BitmapImage Frame {
get {
if (_frame_camera != null) {
using(MemoryStream ms = new MemoryStream())
{
_frame_camera.Save(ms, ImageFormat.Bmp);
ms.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage;
}
} else return null;
}
}
CameraServiceClass _camera_service;
// CONSTRUTOR
public CameraViewModel() {
_camera_service = new CameraServiceClass(ref _frame_camera);
}
}
そして CameraServiceClass:
public class CameraServiceClass
{
System.Drawing.Bitmap _frame;
VideoCaptureDevice videoSource;
// CONSTRUTOR
public CameraServiceClass(ref System.Drawing.Bitmap bitmap) {
_frame = bitmap;
var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
videoSource.Start();
}
private void video_NewFrame (object sender, NewFrameEventArgs eventArgs) {
System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
_frame = bmp;
}
}