C#使用ZBar实现识别条形码

 更新时间:2023年07月24日 08:17:47   作者:2206  
目前主流的识别库主要有ZXing.NET和ZBar,本文主要介绍的是如何使用ZBar库实现识别条形码功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

一.识别库

目前主流的识别库主要有ZXing.NET和ZBar,这里我使用的是ZBar,ZXing.NET也试过,同等条件下,识别率不高。

ZBar相关类库包括:libzbar.dll,libzbar-cil.dll,libiconv-2.dll;

很奇怪为什么不能直接引用libzbar.dll,实际使用时引用的是libzbar-cil.dll,libiconv-2.dll是libzbar-cil.dll用来映射libzbar.dll的。

二.从一张图片中提取多个条形码

先上截图:

需要提取条形码的图片:

识别结果

三.主要代码

/// <summary>
        /// 条码识别
        /// </summary>
        private void ScanBarCode(string fileName)
        {
            DateTime now = DateTime.Now;
            Image primaryImage = Image.FromFile(fileName);
            Bitmap pImg = MakeGrayscale3((Bitmap)primaryImage);
            using (ZBar.ImageScanner scanner = new ZBar.ImageScanner())
            {
                scanner.SetConfiguration(ZBar.SymbolType.None, ZBar.Config.Enable, 0);
                scanner.SetConfiguration(ZBar.SymbolType.CODE39, ZBar.Config.Enable, 1);
                scanner.SetConfiguration(ZBar.SymbolType.CODE128, ZBar.Config.Enable, 1);
                List<ZBar.Symbol> symbols = new List<ZBar.Symbol>();
                symbols = scanner.Scan((Image)pImg);
                if (symbols != null && symbols.Count > 0)
                {
                    string result = string.Empty;
                    symbols.ForEach(s => result += "条码内容:" + s.Data + " 条码质量:" + s.Quality + Environment.NewLine);
                    MessageBox.Show(result);
                }
            }
        }
        /// <summary>
        /// 处理图片灰度
        /// </summary>
        /// <param name="original"></param>
        /// <returns></returns>
        public 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;
        }

四.注意事项

如果条码识别率不高,考虑是图片的DPI不够。我的项目初期使用的是500万像素的高拍仪,拍出来的图片识别率始终不高,DPI为96。后来更换为800万像素的高拍仪,DPI为120,识别率从60%直接上升到95%+。当然,也需要对图片做一些裁剪。另外,灰度处理是必须的,可减少拍摄照片时反光引起的识别率不高问题。

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

相关文章

  • C#子类对基类方法的继承、重写与隐藏详解

    C#子类对基类方法的继承、重写与隐藏详解

    这篇文章主要介绍了C#子类对基类方法的继承、重写与隐藏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • C#集合之不变集合的用法

    C#集合之不变集合的用法

    这篇文章介绍了C#集合之不变集合的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • c#项目将dll打包到exe中的步骤

    c#项目将dll打包到exe中的步骤

    这篇文章主要介绍了c#项目将dll打包到exe中的步骤,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • Visual C#中如何使用IComparable和IComparer接口

    Visual C#中如何使用IComparable和IComparer接口

    这篇文章主要介绍了C#中使用IComparable和IComparer接口,在本例中,该对象被用作第二个参数被传递给Array.Sort的接受IComparer实例的重载方法,需要的朋友可以参考下
    2023-04-04
  • c# 实现圆形的进度条(ProgressBar)

    c# 实现圆形的进度条(ProgressBar)

    这篇文章主要介绍了c# 如何实现圆形的进度条(ProgressBar),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • Unity实现鼠标拖动3D物体

    Unity实现鼠标拖动3D物体

    这篇文章主要为大家详细介绍了Unity实现鼠标拖动3D物体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • C#利用delegate实现Javascript的each方法

    C#利用delegate实现Javascript的each方法

    这篇文章主要为大家介绍了介绍了C#利用delegate实现Javascript的each方法,感兴趣的朋友可以参考一下
    2016-01-01
  • C# 实现绘制PDF嵌套表格案例详解

    C# 实现绘制PDF嵌套表格案例详解

    嵌套表格,顾名思义,就是在一张表格中的特定单元格中再插入一个或者多个表格,本文将为大家介绍C#绘制PDF嵌套表格的代码示例,需要的同学可以参考一下
    2021-11-11
  • C#实现读取注册表监控当前操作系统已安装软件变化的方法

    C#实现读取注册表监控当前操作系统已安装软件变化的方法

    这篇文章主要介绍了C#实现读取注册表监控当前操作系统已安装软件变化的方法,涉及C#针对注册表的读取与监控技巧,非常具有实用价值,需要的朋友可以参考下
    2015-08-08
  • WPF下如何自定义MessageBox消息提示

    WPF下如何自定义MessageBox消息提示

    这篇文章主要介绍了WPF下如何自定义MessageBox消息提示问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论