.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);
}

四、常见问题解决

相关推荐
一个帅气昵称啊8 小时前
.Net通过EFCore和仓储模式实现统一数据权限管控并且相关权限配置动态生成
.net·efcore·仓储模式
helloworddm9 小时前
CalculateGrainDirectoryPartition
服务器·c#·.net
步步为营DotNet10 小时前
深度剖析.NET中HttpClient的请求重试机制:可靠性提升与实践优化
开发语言·php·.net
ChaITSimpleLove11 小时前
使用 .net10 构建 AI 友好的 RSS 订阅机器人
人工智能·.net·mcp·ai bot·rss bot
专注VB编程开发20年11 小时前
vb.net宿主程序通过统一接口直接调用,命名空间要一致
服务器·前端·.net
ChaITSimpleLove1 天前
基于 .NET Garnet 1.0.91 实现高性能分布式锁(使用 Lua 脚本)
分布式·.net·lua
用户4488466710601 天前
.NET进阶——深入理解线程(2)Thread入门到精通
c#·.net
一个帅气昵称啊1 天前
.Net——AI智能体开发基于 Microsoft Agent Framework 实现第三方聊天历史存储
人工智能·microsoft·.net