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