3

我正在从网络摄像头捕获图像帧,但是当我将它们设置为 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 控件中没有显示任何内容 - 没有运行时错误。我究竟做错了什么?
非常感谢您的帮助!

4

2 回答 2

3

您需要bi.CacheOption = BitmapCacheOption.OnLoad在创建 BitmapImage 时进行设置。没有它,位图会被延迟加载,并且当 UI 开始请求它时,流将被关闭。Microsoft 在BitmapImage.CacheOption的文档中对此进行了说明。

于 2013-03-06T19:35:53.103 回答
3

除了将图像写入临时 MemoryStream 之外,您还可以通过调用直接从Bitmapto转换:BitmapSourceImaging.CreateBitmapSourceFromHBitmap

private void UpdatePicture()
{
    imageControl.Source = Imaging.CreateBitmapSourceFromHBitmap(
        image.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
        BitmapSizeOptions.FromEmptyOptions());
}
于 2013-03-06T20:10:33.483 回答