You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:05:40