用C#實現的條碼和二維碼編碼解碼器

來源:互聯網
上載者:User

標籤:android   winform   blog   http   io   os   ar   使用   java   

轉自:http://www.cnblogs.com/tuyile006/archive/2013/01/16/2863367.html

 

 

本篇介紹可以在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.按所樣本子建好控制項,“產生條碼”的代碼如下:

?
//產生條碼        privatevoid button1_Click(objectsender, 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;                 //自動儲存圖片到目前的目錄                stringfilename = 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

 

 

 

--------------------------------------------------------------------------------------

備忘:

上面的Demo只是產生後的exe,沒有源碼。

自己模仿作者代碼稍微改了一點寫了一個玩,主要代碼如下,所有源碼下載:http://download.csdn.net/detail/gdjlc/5005921

 

[csharp] view plaincopyprint? 
  1. private void btnDeTwo_Click(object sender, EventArgs e)  
  2.       {  
  3.           using (OpenFileDialog openFileDialog = new OpenFileDialog())  
  4.           {  
  5.               openFileDialog.Title = "選擇二維碼圖片";  
  6.               openFileDialog.Filter = "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;";  
  7.               openFileDialog.AddExtension = true;  
  8.               openFileDialog.RestoreDirectory = true;  
  9.   
  10.               if (openFileDialog.ShowDialog() == DialogResult.OK)  
  11.               {  
  12.                   MultiFormatReader mutiReader = new MultiFormatReader();  
  13.                   Bitmap img = (Bitmap)Bitmap.FromFile(openFileDialog.FileName);  
  14.                   if (img == null)  
  15.                       return;  
  16.                   pictureBox1.Image = img;  
  17.                   LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height);  
  18.                   BinaryBitmap bb = new BinaryBitmap(new HybridBinarizer(ls));  
  19.   
  20.                   Result r = mutiReader.decode(bb);  
  21.                   txtMsg.Text = r.Text;  
  22.               }  
  23.           }  
  24.       }  

用C#實現的條碼和二維碼編碼解碼器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.