WPF中结合AForge与ZXing库时NewFrame事件未触发问题求助
问题描述
我开发了一个WPF程序,使用AForge库实现摄像头预览功能,以下代码原本运行正常:
LocalWebcamsCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice); LocalScannerBarcode = new VideoCaptureDevice(LocalWebcamsCollection[WebcamNumber].MonikerString); LocalScannerBarcode.NewFrame += LocalScannerBarcode_NewFrame; LocalScannerBarcode.Start();
在NewFrame事件中可以正常获取Bitmap帧:
System.Drawing.Bitmap frame; void LocalScannerBarcode_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { frame = (System.Drawing.Bitmap)eventArgs.Frame.Clone(); }
现在需要对摄像头捕获内容进行条码解码,全局声明了:
ZXing.BarcodeReader bcr;
并在LocalScannerBarcode_NewFrame事件中添加初始化代码:
if (bcr == null) bcr = new ZXing.BarcodeReader();
但添加这两行代码后,NewFrame事件不再被触发。该逻辑在Windows Forms中可以正常运行,需要在WPF环境下解决此问题。
解决方案
1. 转移BarcodeReader初始化到UI线程
AForge的NewFrame事件运行在后台工作线程中,WPF的线程模型对跨线程操作有严格限制。ZXing的BarcodeReader初始化可能隐含了与UI上下文相关的操作,在后台线程初始化会导致线程阻塞,直接卡死AForge的视频捕获流程,进而让NewFrame事件停止触发。
解决办法:提前在UI线程完成初始化,比如窗口Loaded事件或ViewModel初始化方法中:
private void Window_Loaded(object sender, RoutedEventArgs e) { bcr = new ZXing.BarcodeReader(); // 可提前配置解码参数,比如指定支持的条码格式 bcr.Options.PossibleFormats = new List<ZXing.BarcodeFormat> { ZXing.BarcodeFormat.QR_CODE, ZXing.BarcodeFormat.CODE_128 }; }
2. 异步执行条码解码,避免阻塞视频线程
即使初始化正常,在NewFrame事件中同步解码也可能因耗时过长阻塞视频捕获线程,导致后续帧无法触发事件。建议将解码操作放到线程池异步执行:
void LocalScannerBarcode_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { var frameClone = (System.Drawing.Bitmap)eventArgs.Frame.Clone(); // 异步解码,不占用视频捕获线程 Task.Run(() => { var result = bcr.Decode(frameClone); if (result != null) { // 解码成功后切回UI线程更新界面 Application.Current.Dispatcher.Invoke(() => { txtBarcodeContent.Text = result.Text; }); } frameClone.Dispose(); // 及时释放Bitmap资源 }); }
3. 替换为WPF专用ZXing包
确保使用适配WPF的ZXing版本,建议安装ZXing.Net.Wpf包,它针对WPF的线程和图像处理做了优化,减少线程冲突概率。
NuGet安装命令:
Install-Package ZXing.Net.Wpf
使用专用BarcodeReader:
using ZXing.Windows.Imaging; private void Window_Loaded(object sender, RoutedEventArgs e) { bcr = new BarcodeReader(); bcr.Format = ZXing.BarcodeFormat.All_1D; }
内容的提问来源于stack exchange,提问作者user4367090
相关产品推荐
相关产品推荐

