C#实现条形码识别的解决方案分享

 更新时间:2023年07月24日 10:10:18   作者:二次元攻城狮  
主流的识别库主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR码检测和解码功能,所以本文主要和大家分享了使用ZBar进行条形码识别的示例代码,需要的可以参考一下

简介

主流的识别库主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR码检测和解码功能。本文使用的是ZBar,同等条件下ZBar识别率更高,图片和部分代码参考在C#中使用ZBar识别条形码

使用ZBar

通过NuGet安装ZBar,必须使用1.0.0版本,最新的1.0.2版本无法自动生成相关的dll并且使用不了1.0.0版的dll库默认支持netcoreapp3.1,在.NET6环境下也能正常使用,正常情况下输出目录会自动生成lib文件夹和dll文件

注:ZBar 1.0.0在x86平台下可正常运行,但Debug会报错,建议使用x64或AnyCPU。

条码识别:

/// <summary>
/// 条码识别
/// </summary>
static List<ZBar.Symbol> ScanBarCode(string filename)
{
    var bitmap = (Bitmap)Image.FromFile(filename);
    bitmap = MakeGrayscale3(bitmap);
    List<ZBar.Symbol> result = new List<ZBar.Symbol>();
    using (var scanner = new ZBar.ImageScanner())
    {
        var symbols = scanner.Scan(bitmap);
        if (symbols != null && symbols.Count > 0)
        {
            result.AddRange(symbols);
        }
    }
    return result;
}
/// <summary>
/// 处理图片灰度
/// </summary>
static Bitmap MakeGrayscale3(Bitmap original)
{
    //create a blank bitmap the same size as original
    Bitmap newBitmap = new Bitmap(original.Width, original.Height);
    //get a graphics object from the new image
    Graphics g = Graphics.FromImage(newBitmap);
    //create the grayscale ColorMatrix
    System.Drawing.Imaging.ColorMatrix colorMatrix = new System.Drawing.Imaging.ColorMatrix(
        new float[][]
        {
            new float[] {.3f, .3f, .3f, 0, 0},
            new float[] {.59f, .59f, .59f, 0, 0},
            new float[] {.11f, .11f, .11f, 0, 0},
            new float[] {0, 0, 0, 1, 0},
            new float[] {0, 0, 0, 0, 1}
      });
    //create some image attributes
    ImageAttributes attributes = new ImageAttributes();
    //set the color matrix attribute
    attributes.SetColorMatrix(colorMatrix);
    //draw the original image on the new image
    //using the grayscale color matrix
    g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
       0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
    //dispose the Graphics object
    g.Dispose();
    return newBitmap;
}

使用方法:

Console.WriteLine(ZBar.ZBar.Version);
var symbols = ScanBarCode("426301-20160127111209879-611759974.jpg");
string result = string.Empty;
symbols.ForEach(s => Console.WriteLine($"条码类型:{s.Type} 条码内容:{s.Data} 条码质量:{s.Quality}"));
Console.ReadKey();

扩展:其它条码识别库

在C#平台下还有一个ThoughtWorks.QRCode库也支持条码解析,具体效果还没有测试。原始代码最后的版本是在2015年,后面的版本只是将库做了个标准版,按自己的需求选择版本:

识别库使用方法参考:C#使用zxing,zbar,thoughtworkQRcode解析二维码

扩展:开源扫码软件

推荐一个C# WPF 原生开发的在电脑上识别条码的工具软件QrCodeScanner,功能如下:

支持四种模式:截图识别 + 摄像头识别 + 本地图片识别 + 作为扫描枪使用

支持ZbarZxing两种主流引擎

支持多码同扫

支持Material Design缤纷主题色与暗黑模式

独创的扫描枪模

到此这篇关于C#实现条形码识别的解决方案分享的文章就介绍到这了,更多相关C#条形码识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • WinForm子窗体访问父窗体控件的实现方法

    WinForm子窗体访问父窗体控件的实现方法

    WinForm子窗体访问父窗体控件的实现方法,需要的朋友可以参考一下
    2013-03-03
  • 使用C#判断文件是否为图片的多种方法

    使用C#判断文件是否为图片的多种方法

    在开发中,我们常需要判断一个文件是否为图片,这看似简单,但要实现得既高效又严谨,需要根据不同场景选择合适的方法,本文记录了几种常见的判断方式,并推荐使用 SixLabors.ImageSharp 来替代已被淘汰的 System.Drawing,需要的朋友可以参考下
    2024-10-10
  • C#中Trim()、TrimStart()、TrimEnd()的用法介绍

    C#中Trim()、TrimStart()、TrimEnd()的用法介绍

    这篇文章主要介绍了C#中Trim()、TrimStart()、TrimEnd()的用法,有需要的朋友可以参考一下
    2014-01-01
  • ADO.NET实体数据模型详细介绍

    ADO.NET实体数据模型详细介绍

    本文将详细介绍ADO.NET实体数据模型,下面先看看简单的单表的增删改查操作,然后再看多表的关联查询,带参数查询等
    2012-11-11
  • C# 函数覆盖总结学习(推荐)

    C# 函数覆盖总结学习(推荐)

    下面小编就为大家带来一篇C# 函数覆盖总结学习(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • c#多线程通信之委托事件

    c#多线程通信之委托事件

    这篇文章主要介绍了c#多线程通信之委托事件,对多线程感兴趣的同学可以参考下
    2021-04-04
  • C#/C++ 通过ODBC连接OceanBase Oracle租户的详细过程

    C#/C++ 通过ODBC连接OceanBase Oracle租户的详细过程

    近期我们项目正处于将Oracle数据库迁移到OceanBase Oracle租户模式的阶段,考虑到我们项目采用了C++和C#混合开发,并且使用了多种技术,因此存在多种数据库连接方式,C#连接OceanBase的案例相对较少,因此我特意记录下这一过程,感兴趣的朋友一起看看吧
    2024-05-05
  • 带你复习c# 托管和非托管资源

    带你复习c# 托管和非托管资源

    这篇文章主要介绍了c# 托管和非托管资源的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#取得随机颜色的方法

    C#取得随机颜色的方法

    这篇文章主要介绍了C#取得随机颜色的方法,通过自定义函数实现随机颜色的功能,非常具有实用价值,需要的朋友可以参考下
    2015-01-01
  • C#清除字符串内空格的方法

    C#清除字符串内空格的方法

    这篇文章主要介绍了C#清除字符串内空格的方法,是C#操作字符串非常实用的技巧,需要的朋友可以参考下
    2014-10-10

最新评论