[轉]用C#實現的條形碼和二維碼編碼解碼器


條形碼的標准

條形碼的標准有ENA條形碼、UPC條形碼、二五條形碼、交叉二五條形碼、庫德巴條形碼、三九條形碼和128條形碼等,而商品上最常使用的就是EAN商品條形碼。EAN商品條形碼亦稱通用商品條形碼,由國際物品編碼協會制定,通用於世界各地,是目前國際上使用最廣泛的一種商品條形碼。我國目前在國內推行使用的也是這種商品條形碼。EAN商品條形碼分為EAN-13(標准版)和EAN-8(縮短版)兩種。

二維碼的編碼標准:

全球現有的二維碼多達200種以上,其中常見的技術標准有PDF417(美系標准),QRCode(日系標准),Code49,Code16K,CodeOne,DM(韓系標准),GM(中國標准),CM(中國標准)等20余種。用得最多的是QRcode。

下面借助google的開源項目zxing來實現1D/2D的編碼和解碼,測試效果如下:

   

zxing的官方地址是:http://code.google.com/p/zxing/

zxing的功能還是很強大的,最初是用java編寫,並支持Android、ios、symbian等手機操作系統。

不過不知是何原因,該官網連一個例子也沒有,文檔也是字典式的把所有類列出來,一點都沒為讀者考慮。

下面我把如果使用zxing完成上圖所示例子講解一遍,供初學者參考:

1.我們新建一個Winform測試項目;

2.從官網下載zxing開源項目,大概16m的樣子,解壓縮后打開zxing-2.1\csharp目錄,將該目錄拷貝到我們新建的Winform項目下(方便調試和看源碼,並非一定要如此);

3.winform項目中添加對zxing項目的引用;

4.按上圖所示例子建好控件,“生成條形碼”的代碼如下:

//生成條形碼
         private  void  button1_Click( object  sender, EventArgs e)
         {
             lbshow.Text = "" ;
             Regex rg = new  Regex( "^[0-9]{13}$" );
             if  (!rg.IsMatch(txtMsg.Text))
             {
                 MessageBox.Show( "本例子采用EAN_13編碼,需要輸入13位數字" );
                 return ;
             }
            
             try
             {
                 MultiFormatWriter mutiWriter = new  com.google.zxing.MultiFormatWriter();
                 ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.EAN_13, 363, 150);
                 Bitmap img= bm.ToBitmap();
                 pictureBox1.Image =img;
 
                 //自動保存圖片到當前目錄
                 string  filename = System.Environment.CurrentDirectory + "\\EAN_13"  + DateTime.Now.Ticks.ToString() + ".jpg" ;
                 img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
                 lbshow.Text = "圖片已保存到:"  + filename;
             }
             catch (Exception ee)
             { MessageBox.Show(ee.Message); }
         }

 其中需要注意BarcodeFormat參數,可以打開定義看到具體的編碼方式,自己百度每種編碼方式對輸入的要求。

這里EAN_13編碼要求是13位長度的數字,並且滿足:把所有偶數序號位上的數相加求和,用求出的和乘3,再把所有奇數序號上的數相加求和,用求出的和加上剛才偶數序號上的數,然后得出和能被10整除。(這個規則校驗在UPCEANReader類的checkStandardUPCEANChecksum方法里面,如果不需要,可以去掉)

生成二維碼的代碼與上面相似:

復制代碼
 //生成二維碼
        private void button2_Click(object sender, EventArgs e)
        {
            lbshow.Text = "";
            try
            {
                MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter();
                ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, 300, 300);
                Bitmap img = bm.ToBitmap();
                pictureBox1.Image = img;

                //自動保存圖片到當前目錄
                string filename = System.Environment.CurrentDirectory + "\\QR" + DateTime.Now.Ticks.ToString() + ".jpg";
                img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
                lbshow.Text = "圖片已保存到:" + filename;
            }
            catch (Exception ee)
            { MessageBox.Show(ee.Message); }
        }
復制代碼

注意編碼問題,在com.google.zxing.qrcode.encoder.Encoder類中修改默認編碼為utf-8,否則解碼出現的是亂碼。

System.String DEFAULT_BYTE_MODE_ENCODING = "UTF-8";  

此處之前是"ISO-8859-1",之所以改成UTF-8是因為,在解碼的時候程序會猜測可能的編碼,如果猜測失敗則默認是UTF-8,代碼在com.google.zxing.qrcode.decoder.DecodedBitStreamParser類的guessEncoding方法中。

所以此開源項目也缺少全局性思考,連編碼和解碼的默認編碼方式都不一致。

經網友反映,還是有些中文會出現解碼成亂碼,而有些又可以,估計還是guessEncoding方法猜測編碼出現了偏差,直接將guessEncoding方法寫成返回UTF8就行了。

4.實現圖片解碼,即把條形碼或二維碼圖片解碼成其真實內容,當然在pc上應用不大,但可能只是還沒發現而已,代碼如下:

復制代碼
     //解碼操作
        private void button3_Click(object sender, EventArgs e)
        {
            MultiFormatReader mutiReader = new com.google.zxing.MultiFormatReader();
            Bitmap img = (Bitmap)Bitmap.FromFile(opFilePath);
            if (img == null)
                return;
            LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height);
            BinaryBitmap bb = new BinaryBitmap(new com.google.zxing.common.HybridBinarizer(ls));

            Result r= mutiReader.decode(bb);
            txtMsg.Text = r.Text;
        }
復制代碼

opFilePath是圖片路徑,你可以用openFileDialog控件打開文件來得到路徑。

 

下載:

Demo   源碼

 注意:點解碼按鈕前要先選擇一張二維碼或條形碼圖片,即先點擊“…”按鈕選擇圖片,然后再點“解碼”按鈕。

 

在二維碼中間插入小圖片

 

      大家都知道現在QR碼越來越好看了,可以給里面加入各種圖案和圖像。QRcode采用里德-所羅門碼來進行編碼,里德-所羅門碼是一種帶有容錯機制的編碼方法,采用這種機制掃描的時候並不需要讀取所有的比特位,因此也使得簡單的在QRcode中少量的更改信息,比如加入小型的圖片等等,成為了可能。之前我給大家免費提供了使用zxing開源項目改造而成的一二維碼編碼解碼器,但未能插入圖片。這次經過一番努力,成功將圖片插入二維碼,並能編碼和解碼。插入圖片的關鍵在於二維碼容錯系數的調整,源碼中有詳盡描述。

界面:

 


免責聲明!

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



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