首页 > 代码库 > C#实现二维码生成与解码
C#实现二维码生成与解码
前几天公司内部分享了一个关于二维码的例子,觉得挺好玩的,但没有提供完整的源码。有时候看到一个好玩的东西,总想自己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了!
窝查,有妹纸也能解!!!!!
【解码有风险,解码需谨慎,且行且珍惜吧。不要乱解哦,否则后果。。。哈哈~】