海水正藍

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          本篇介紹可以在C#中使用的1D/2D編碼解碼器。條形碼的應用已經非常普遍,幾乎所有超市里面的商品上面都印有條形碼;二維碼也開始應用到很多場合,如火車票有二維碼識別、網易的首頁有二維碼圖標,用戶只需要用手機掃描一下就可以看到手機版網易的網址,免去了輸入長串字符的麻煩。

          條形碼的標準

          條形碼的標準有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.按上圖所示例子建好控件,“生成條形碼”的代碼如下:

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

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

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

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

           1 //生成二維碼
           2         private void button2_Click(object sender, EventArgs e)
           3         {
           4             lbshow.Text = "";
           5             try
           6             {
           7                 MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter();
           8                 ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, 300, 300);
           9                 Bitmap img = bm.ToBitmap();
          10                 pictureBox1.Image = img;
          11 
          12                 //自動保存圖片到當前目錄
          13                 string filename = System.Environment.CurrentDirectory + "\\QR" + DateTime.Now.Ticks.ToString() + ".jpg";
          14                 img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
          15                 lbshow.Text = "圖片已保存到:" + filename;
          16             }
          17             catch (Exception ee)
          18             { MessageBox.Show(ee.Message); }
          19         }


          注意編碼問題,在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方法中。

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

           

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

           1 //解碼操作
           2         private void button3_Click(object sender, EventArgs e)
           3         {
           4             MultiFormatReader mutiReader = new com.google.zxing.MultiFormatReader();
           5             Bitmap img = (Bitmap)Bitmap.FromFile(opFilePath);
           6             if (img == null)
           7                 return;
           8             LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height);
           9             BinaryBitmap bb = new BinaryBitmap(new com.google.zxing.common.HybridBinarizer(ls));
          10 
          11             Result r= mutiReader.decode(bb);
          12             txtMsg.Text = r.Text;
          13         }

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

          原文出自:http://www.cnblogs.com/tuyile006/archive/2013/01/16/2863367.html 


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 吴堡县| 怀远县| 宽城| 丁青县| 阳山县| 黄平县| 庆元县| 奇台县| 弋阳县| 宜川县| 湖南省| 忻城县| 兴和县| 舒城县| 启东市| 资溪县| 大石桥市| 长宁县| 蓬安县| 惠东县| 赣州市| 海盐县| 望江县| 崇文区| 浪卡子县| 襄城县| 彭泽县| 华池县| 富民县| 惠来县| 景宁| 辰溪县| 拜城县| 横峰县| 荃湾区| 海城市| 德阳市| 区。| 罗田县| 丹棱县| 马关县|