在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%+。當然,也需要對圖片做一些裁剪。另外,灰度處理是必須的,可減少拍攝照片時反光引起的識別率不高問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM