日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

用C#实现的条形码和二维码编码解码器

發布時間:2023/11/27 生活经验 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用C#实现的条形码和二维码编码解码器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇介紹可以在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

?

 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       } 

?

?

轉載于:https://www.cnblogs.com/lv952146/p/5908362.html

總結

以上是生活随笔為你收集整理的用C#实现的条形码和二维码编码解码器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。