前幾天公司內部分享了一個關於二維碼的例子,覺得挺好玩的,但沒有提供完整的源碼。有時候看到一個好玩的東西,總想自己Demo一個,於是抽空就自己研究了一下。
一、二維碼的原理
工欲善其事,必先利其器。要生成二維碼,首先得了解一下,什么是二維碼。關於二維碼,百度百科是這么說的:二維條碼(二維碼)是用某種特定的幾何圖形按一定規律在平面(二維方向)分布的黑白相間的圖形記錄數據符號信息的。二維碼是DOI(Digital Object Unique Identifier,數字對象唯一識別符)的一種。二維碼的優點:二維碼存儲的數據量更大;可以包含數字、字符,及中文文本等混合內容;有一定的容錯性(在部分損壞以后可以正常讀取);空間利用率高。
好吧。關於二維碼的原理我也是讀了個大概。了解了一些二維碼的概念。雖然平時身邊離不開二維碼,但我們卻很少知道,為什么二維碼長成這樣?現在都是彩屏時代,為什么二維碼卻是黑白的?這是因為:二維碼的黑色表示二進制的“1”,白色表示二進制的“0”(原因就不說了吧)。
二、二維碼加密與解密
首先去http://zxingnet.codeplex.com/下載一個資源文件,下載后解壓,找到文件夾"net4.5",然后找到Zxing.dll,引入到工程文件中。
引入dll后,自己可以根據需要完成相關二維碼的功能。如下圖:
生成二維碼核心代碼如下:

1 /// <summary> 2 /// 生成二維碼 3 /// </summary> 4 /// <param name="msg">二維碼信息</param> 5 /// <returns>圖片</returns> 6 private Bitmap GenByZXingNet(string msg) 7 { 8 BarcodeWriter writer = new BarcodeWriter(); 9 writer.Format = BarcodeFormat.QR_CODE; 10 writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//編碼問題 11 writer.Options.Hints.Add( 12 EncodeHintType.ERROR_CORRECTION, 13 ZXing.QrCode.Internal.ErrorCorrectionLevel.H 14 15 ); 16 const int codeSizeInPixels = 250; //設置圖片長寬 17 writer.Options.Height = writer.Options.Width = codeSizeInPixels; 18 writer.Options.Margin = 0;//設置邊框 19 ZXing.Common.BitMatrix bm = writer.Encode(msg); 20 Bitmap img = writer.Write(bm); 21 return img; 22 }
同時,可以給二維碼進行解密,User可以上傳二維碼圖片進行解碼:

1 private void btnUpload_Click(object sender, EventArgs e) 2 { 3 OpenFileDialog ofd = new OpenFileDialog(); //創建一個對話框對象 4 ofd.Title = "請選擇上傳的圖片"; //為對話框設置標題 5 ofd.Filter = "圖片格式|*.bmp"; //設置篩選的圖片格式 6 ofd.Multiselect = false; //設置是否允許多選 7 8 if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 9 { 10 string filePath = ofd.FileName;//獲得文件的完整路徑(包括名字后后綴) 11 txtUploadFile.Text = filePath;//將文件路徑顯示在文本框中 12 int position = filePath.LastIndexOf("\\"); 13 string fileName = filePath.Substring(position + 1); 14 using (Stream stream = ofd.OpenFile()) 15 { 16 using (FileStream fs = new FileStream( fileName, FileMode.Create)) 17 { 18 stream.CopyTo(fs); 19 fs.Flush(); 20 } 21 this.pictureBox1.ImageLocation = fileName; 22 } 23 } 24 }
圖片上傳成功后,點解密二維碼即可!

1 /// <summary> 2 /// 解密二維碼 3 /// </summary> 4 /// <param name="barcodeBitmap">圖片</param> 5 /// <returns>二維碼信息</returns> 6 private string DecodeQrCode(Bitmap barcodeBitmap) 7 { 8 BarcodeReader reader = new BarcodeReader(); 9 reader.Options.CharacterSet = "UTF-8"; 10 var result = reader.Decode(barcodeBitmap); 11 return (result == null) ? null : result.Text; 12 }
至此,二維碼的生成與解碼已經順利OK了!
窩查,有妹紙也能解!!!!!
【解碼有風險,解碼需謹慎,且行且珍惜吧。】