.NET WinForm图像识别二维码/条形码并读取其中内容

需求:图像识别出一张图片中的二维码或者条形码,并读取其中内容。

一、安装库(特别注意,网上很多都没说清楚)

如果是基于.net framework,则安装ZXing.Net(建议0.14.0版本左右,具体看实际,版本太高,部分接口发生变化)

如果是基于.Net Standard 2.0 or .NET CORE 3.0/3.1 or .NET 5.0 or higher,则安装ZXing.Net.Bindings.Windows.Compatibility

二、WinForm示例代码(含关键优化)

csharp 复制代码
using ZXing.Common;
using ZXing;
using ZXing.Windows.Compatibility

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    // 选择图片按钮点击事件
    private void btnSelectImage_Click(object sender, EventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "图片文件|*.jpg;*.png;*.bmp";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            pictureBox1.Image = Image.FromFile(dialog.FileName);
        }
    }

    // 识别条码按钮点击事件
    private void btnDecode_Click(object sender, EventArgs e)
    {
        if (pictureBox1.Image == null)
        {
            MessageBox.Show("请先选择图片");
            return;
        }

        var bitmap = new Bitmap(pictureBox1.Image);
        
        // 创建解码器(关键配置)
        var reader = new BarcodeReader
        {
            Options = new DecodingOptions
            {
                PossibleFormats = new[] { 
                    BarcodeFormat.QR_CODE, 
                    BarcodeFormat.CODE_128,  // 条形码
                    BarcodeFormat.EAN_13 
                },
                TryHarder = true,      // 提高复杂图像识别率
                CharacterSet = "UTF-8" // 支持中文
            }
        };
        
        // 识别条码(支持多码)
        Result[] results = reader.DecodeMultiple(bitmap);
        
        if (results != null)
        {
            foreach (Result result in results)
            {
                txtResult.AppendText($"✅ 识别成功!类型:{result.BarcodeFormat},内容:{result.Text}\r\n");
            }
        }
        else
        {
            txtResult.Text = "❌ 识别失败:未检测到有效条码";
        }
    }
}

三、识别率优化技巧

csharp 复制代码
//1. 图像预处理(解决模糊/低对比度问题)
csharp
// 转换为灰度图+二值化
var luminanceSource = new BitmapLuminanceSource(bitmap);
var binarizer = new HybridBinarizer(luminanceSource);
var binBitmap = new BinaryBitmap(binarizer);

Result result = reader.Decode(binBitmap); // 使用处理后的图像
//2. 多尺度识别(针对小尺寸条码)
csharp
for (double scale = 1.0; scale <= 2.0; scale += 0.2)
{
    var scaledBitmap = new Bitmap(bitmap, 
        new Size((int)(bitmap.Width * scale), (int)(bitmap.Height * scale)));
    
    Result result = reader.Decode(scaledBitmap);
    if (result != null) break;
}
//3. 区域裁剪(复杂背景中定位条码)
csharp
// 假设已知条码在图像右下角1/4区域
Rectangle cropArea = new Rectangle(
    bitmap.Width / 2, 
    bitmap.Height / 2, 
    bitmap.Width / 2, 
    bitmap.Height / 2
);

using (Bitmap cropped = bitmap.Clone(cropArea, bitmap.PixelFormat))
{
    Result result = reader.Decode(cropped);
}

四、常见问题解决

相关推荐
唐青枫2 天前
别急着拆服务:C#.NET 微服务架构从边界设计到实战
c#·.net
唐青枫3 天前
别把 Razor 当成几段 HTML:C#.NET Razor Pages、MVC 视图与实战详解
c#·.net
宝桥南山3 天前
Microsoft Fabric - 简单尝试一下Microsoft Fabric .NET SDK
microsoft·微软·.net·.netcore·powerbi·fabric
Lost of 程序猿3 天前
.NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚
c#·asp.net·.net
慧都小妮子3 天前
Word/Excel/PPT 如何稳定导出 Markdown?文档 SDK 三线能力拆解
.net·markdown·知识库·aspose·rag·文档转换·文档互操作
唐青枫4 天前
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
c#·.net
geovindu4 天前
CSharp:Condition Variable Pattern
后端·设计模式·c#·.net·.netcore·条件变量模式·同步型模式
de之梦-御风4 天前
【未来】.NET 开发在「劳动价值重估」下的定位与走向
职场和发展·.net
fogota4 天前
C# 如何调用系统图标
c#·.net
△曉風殘月〆4 天前
.NET是什么?为什么要选择.NET?
c#·.net·.net core·clr