我正在尝试在 PictureBox
上绘制图像来 self 用 WindowsFormsHost
插入的相机.代码简单如下:
<Window x:Class="videoTEst.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="583" Width="1132"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms">
<StackPanel Background="LightBlue" Height="513" Width="1077">
<StackPanel HorizontalAlignment="Center" Width="450" Orientation="Horizontal">
<Button Name="ButtonOpen" Content="Load" Click="ButtonOpen_OnClick" />
<Button Name="ButtonLoadImage" Content="Load image" Click="ButtonLoadImage_OnClick" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<WindowsFormsHost Name="WinFormsHost" Height="440" Width="690" HorizontalAlignment="Left">
<wf:PictureBox x:Name="PictureBoxvideo" SizeMode="Normal" Paint="PictureBoxvideo_Paint"></wf:PictureBox>
</WindowsFormsHost>
<ListBox Name="ListBoxLog" />
</StackPanel>
</StackPanel>
然后我像这样用相机作画:
private void asyncVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Image temp = PictureBoxvideo.Image;
Bitmap bitmap = eventArgs.Frame;
PictureBoxvideo.Image = new Bitmap(bitmap);
if (temp != null) temp.Dispose();
bitmap.Dispose();
}
此代码完美运行。
但是当我改变 <Window>
标记为 <UserControl>
(因为我希望它嵌入我自己的 UserControl
),它不绘画!!
为什么它不在 UserControl
上绘画? ?
为什么我不使用 Image
来自 WPF?
Image
有一个线程使用真的很困惑,每当我尝试在 Image
上绘画时, Bitmap
之前被处理掉了。
最佳答案
您可以简单地使用 WPF Image 控件代替 WindowsFormsHost 中的 PictureBox:
<StackPanel Orientation="Horizontal">
<Image x:Name="image" Height="440" Width="690" HorizontalAlignment="Left"/>
...
</StackPanel>
您现在可以使用 this answer 中所示的代码从 Bitmap 对象创建一个 BitmapImage。或在 this answer ,通过额外调用 Freeze
使其可以在 UI 线程中访问:
Bitmap bitmap = eventArgs.Frame; // your NewFrameEventArgs
BitmapImage bitmapImage = new BitmapImage();
using (var stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Bmp);
stream.Seek(0, SeekOrigin.Begin);
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
}
bitmapImage.Freeze();
最后,您将通过调用 Dispatcher 来更新 UI 线程中的 Image 控件:
image.Dispatcher.Invoke((Action)(() => image.Source = bitmapImage));
关于wpf - 在 UserControl WPF 内的 PictureBox 上绘制图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18127519/