• 在C#中使用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的。

        ZBar识别库包含在源码中,文末可直接下载。

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

        先上截图:

        需要提取条形码的图片:

        

        识别结果

        

        主要代码:

        

    /// <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%+。当然,也需要对图片做一些裁剪。另外,灰度处理是必须的,可减少拍摄照片时反光引起的识别率不高问题。

        

        源码下载:条码识别

  • 相关阅读:
    pdf文件的导入导出
    扩展方法用法整理
    c#批量插入数据库Demo
    Linq表达式和Lambda表达式用法对比
    Lambda表达式的诞生过程
    LeetCode77. Combinations(剑指offer38-2)
    LeetCode47.Permutations II(剑指offer38-1)
    LeetCode567. Permutation in String
    LeetCode46. Permutations
    图解HTTP-1.web和网络基础
  • 原文地址:https://www.cnblogs.com/the-three/p/5162576.html
Copyright © 2020-2023  润新知