3

PictureBoxで挿入したカメラから に画像をペイントしようとしてい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ですか?

なぜ私はImageWPFから使用していないのですか? Imageのスレッド化の使用法は非常に紛らわしく、 にペイントしようとするとImageBitmapは以前に破棄されていました。

4

1 に答える 1

4

WindowsFormsHost の PictureBox の代わりに、単純に WPF Image コントロールを使用できます。

<StackPanel Orientation="Horizontal">
    <Image x:Name="image" Height="440" Width="690" HorizontalAlignment="Left"/>
    ...
</StackPanel>

この回答またはこの回答に示されているコードを使用して Bitmap オブジェクトから BitmapImage を作成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));
于 2013-08-08T17:00:49.177 に答える