カメラがキャプチャしたフレームをWPFで表示しようとしています。すでに画像を表示できます。しかし、イベント処理方法がわかりませんか? WinForm では Application.Idle ですが、WPF では何を使用すればよいですか? 私はすでにこのスレッドを見てきました..私はそれを作ることができませんでした.
8245 次
1 に答える
6
Timer.Elapsed イベントを使用できないのはなぜですか?
Elapsed コールバックが Worker Thread で発生することを覚えておいてください。これにより、UI の更新が不可能になります。そのため、SynchronizationContext を使用して UI 更新アクションを適切なスレッドに送信する必要があります。
private SynchronizationContext _context = SynchronizationContext.Current;
void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
using (Image<Bgr, byte> frame = capture.QueryFrame())
{
if (frame != null)
{
this._context.Send(o =>
{
using (var stream = new MemoryStream())
{
// My way to display frame
frame.Bitmap.Save(stream, ImageFormat.Bmp);
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = new MemoryStream(stream.ToArray());
bitmap.EndInit();
webcam.Source = bitmap;
}
},
null);
}
}
}
または、すべての UI タスクが Dispatcher を通過するため、DispatcherInactive イベントに反応することもできます。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//...
this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(Hooks_DispatcherInactive);
}
void Hooks_DispatcherInactive(object sender, EventArgs e)
{
using (Image<Bgr, byte> frame = capture.QueryFrame())
{
if (frame != null)
{
using (var stream = new MemoryStream())
{
// My way to display frame
frame.Bitmap.Save(stream, ImageFormat.Bmp);
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = new MemoryStream(stream.ToArray());
bitmap.EndInit();
webcam.Source = bitmap;
};
}
}
}
于 2011-01-22T09:30:39.293 に答える