C#(WinForm)实现二维码的生成与解码

一、二维码的原理

工欲善其事,必先利其器。要生成二维码,首先得了解一下,什么是二维码。关于二维码,百度百科是这么说的:二维条码(二维码)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的。二维码是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         }

解密二维码

至此二维码的生成与解码功能已经实现
在这里插入图片描述
转载自:
作者:【Why Shang】
出处:http://www.cnblogs.com/WhyShang/
转载:欢迎转载,为了保存创作热情,转载请注明出处,谢谢!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值