从网络摄像头输入以编程方式更新WPF图像控制

时间:2013-03-06 19:30:21

标签: c# wpf webcam

我正在从网络摄像头捕捉图像帧,但当我将它们设置为WPF的图像控件时,它显示为空白。

我正在使用的库返回一个Bitmap,所以我将其转换为BitmapImage,然后通过Dispatcher将我的Image控件的源设置为BitmapImage:

void OnImageCaptured(Touchless.Vision.Contracts.IFrameSource frameSource, Touchless.Vision.Contracts.Frame frame, double fps)
    {
        image = frame.Image; // This is a class variable of type System.Drawing.Bitmap 
        Dispatcher.Invoke(new Action(UpdatePicture));
    }

    private void UpdatePicture()
    {
        imageControl.Source = null;
        imageControl.Source = BitmapToBitmapImage(image);
    }

    private BitmapImage BitmapToBitmapImage(Bitmap bitmap)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            bitmap.Save(ms, ImageFormat.Png);
            ms.Position = 0;
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = ms;
            bi.EndInit();
            return bi;
        }
    }

我的Image控件上的XAML声明与可能的一样通用:

<Image x:Name="imageControl" HorizontalAlignment="Left" Height="100" Margin="94,50,0,0" VerticalAlignment="Top" Width="100"/>

Image控件中没有显示任何内容 - 没有运行时错误。我做错了什么?
非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

您需要在创建BitmapImage时设置bi.CacheOption = BitmapCacheOption.OnLoad。如果没有这个,就会懒惰地加载位图,并且在UI到达时要求它关闭流。 Microsoft在BitmapImage.CacheOption的文档中注明了这一点。

答案 1 :(得分:2)

不是将图像写入临时MemoryStream,而是通过调用Imaging.CreateBitmapSourceFromHBitmap直接从Bitmap转换为BitmapSource

private void UpdatePicture()
{
    imageControl.Source = Imaging.CreateBitmapSourceFromHBitmap(
        image.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
        BitmapSizeOptions.FromEmptyOptions());
}