前几天公司内部分享了一个关于二维码的例子,觉得挺好玩的,但没有提供完整的源码。有时候看到一个好玩的东西,总想自己Demo一个,于是抽空就自己研究了一下。

  一、二维码的原理

  工欲善其事,必先利其器。要生成二维码,首先得了解一下,什么是二维码。关于二维码,百度百科是这么说的:二维条码(二维码)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的。二维码是DOI(Digital Object Unique Identifier,数字对象唯一识别符)的一种。二维码的优点:二维码存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后可以正常读取);空间利用率高。

  好吧。关于二维码的原理我也是读了个大概。了解了一些二维码的概念。虽然平时身边离不开二维码,但我们却很少知道,为什么二维码长成这样?现在都是彩屏时代,为什么二维码却是黑白的?这是因为:二维码的黑色表示二进制的“1”,白色表示二进制的“0”(原因就不说了吧)。

  二、二维码加密与解密

  首先去http://zxingnet.codeplex.com/下载一个资源文件,下载后解压,找到文件夹"net4.5",然后找到Zxing.dll,引入到工程文件中。

  引入dll后,自己可以根据需要完成相关二维码的功能。如下图:

  生成二维码核心代码如下:

 /// <summary>
/// 生成二维码
/// </summary>
/// <param name="msg">二维码信息</param>
/// <returns>图片</returns>
private Bitmap GenByZXingNet(string msg)
{
BarcodeWriter writer = new BarcodeWriter();
writer.Format = BarcodeFormat.QR_CODE;
writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//编码问题
writer.Options.Hints.Add(
EncodeHintType.ERROR_CORRECTION,
ZXing.QrCode.Internal.ErrorCorrectionLevel.H );
const int codeSizeInPixels = ; //设置图片长宽
writer.Options.Height = writer.Options.Width = codeSizeInPixels;
writer.Options.Margin = ;//设置边框
ZXing.Common.BitMatrix bm = writer.Encode(msg);
Bitmap img = writer.Write(bm);
return img;
}

生成二维码

  同时,可以给二维码进行解密,User可以上传二维码图片进行解码:

 private void btnUpload_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog(); //创建一个对话框对象
ofd.Title = "请选择上传的图片"; //为对话框设置标题
ofd.Filter = "图片格式|*.bmp"; //设置筛选的图片格式
ofd.Multiselect = false; //设置是否允许多选 if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string filePath = ofd.FileName;//获得文件的完整路径(包括名字后后缀)
txtUploadFile.Text = filePath;//将文件路径显示在文本框中
int position = filePath.LastIndexOf("\\");
string fileName = filePath.Substring(position + );
using (Stream stream = ofd.OpenFile())
{
using (FileStream fs = new FileStream( fileName, FileMode.Create))
{
stream.CopyTo(fs);
fs.Flush();
}
this.pictureBox1.ImageLocation = fileName;
}
}
}

WinForm 上传图片

  图片上传成功后,点解密二维码即可!

 /// <summary>
/// 解密二维码
/// </summary>
/// <param name="barcodeBitmap">图片</param>
/// <returns>二维码信息</returns>
private string DecodeQrCode(Bitmap barcodeBitmap)
{
BarcodeReader reader = new BarcodeReader();
reader.Options.CharacterSet = "UTF-8";
var result = reader.Decode(barcodeBitmap);
return (result == null) ? null : result.Text;
}

解密二维码

  至此,二维码的生成与解码已经顺利OK了!

  

  窝查,有妹纸也能解!!!!!

【解码有风险,解码需谨慎,且行且珍惜吧。】

C#实现二维码生成与解码的更多相关文章

  1. C#二维码生成与解码(二)

    本文内容在<C#二维码生成与解码>的基础上增加了纠错级别和Logo图标加入,增加了二维码的功能.关于透明度在这里没有单独显现,因为在颜色里面就已经包含,颜色值由8位8进制构成,最前面的两位 ...

  2. Java二维码生成与解码

      基于google zxing 的Java二维码生成与解码   一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...

  3. HTML-DEV-ToolLink(常用的在线字符串编解码、代码压缩、美化、JSON格式化、正则表达式、时间转换工具、二维码生成与解码等工具,支持在线搜索和Chrome插件。)

    HTML-DEV-ToolLink:https://github.com/easonjim/HTML-DEV-ToolLink 常用的在线字符串编解码.代码压缩.美化.JSON格式化.正则表达式.时间 ...

  4. Java二维码生成与解码工具Zxing使用

    Zxing是Google研发的一款非常好用的开放源代码的二维码生成工具,目前源码托管在github上,源码地址: https://github.com/zxing/zxing 可以看到Zxing库有很 ...

  5. C#二维码生成与解码

    [窗体效果图] [程序源代码] using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  6. .NET 二维码生成(ThoughtWorks.QRCode)

    引用ThoughtWorks.QRCode.dll (源代码里有) 1.简单二维码生成及解码代码: //生成二维码方法一 private void CreateCode_Simple(string n ...

  7. .NET 二维码生成(ThoughtWorks.QRCode)【转发jiangys】

    .NET 二维码生成(ThoughtWorks.QRCode) 2015-06-21 22:19 by jiangys, 3790 阅读, 8 评论, 收藏, 编辑 引用ThoughtWorks.QR ...

  8. Asp.Net 之 二维码生成

    首先,引用 ThoughtWorks.QRCode.dll . 简单二维码生成及解码代码: //生成二维码方法一 private void CreateCode_Simple(string nr) { ...

  9. simple go web application & 二维码生成 & 打包部署

    go语言简易web应用 & 二维码生成及解码 & 打包部署 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html 前言(闲 ...

随机推荐

  1. vuex基本熟悉与使用

    vuex的入门与使用讲解 官网:https://vuex.vuejs.org/zh/guide/state.html 定义:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式 ...

  2. RPC终结点映射

    “没有更多的终结点可用”错误消息表示 RPC 终结点映射程序无法对基于 RPC 运行的服务使用大于 1024 的端口.注意:RPC 终结点映射程序在端口 135 上运行. http://support ...

  3. C# 日期格式化的中的(/)正斜杠的问题(与操作系统设置有关)

    Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd" )); //这行代码, 如果你在系统日期格式默认的情况下输出 2013/0 ...

  4. BASIC-16_蓝桥杯_分解质因数

    代码示例: #include <stdio.h> int i = 0 ;int Primes(int a){ for (i = 2 ; i <= a/2 ; i ++) { if ( ...

  5. Java学习——Eclipse下载,java配置,新建,输入输出

    Eclipse下载,java配置:  基本的软件是JDK,它可以编译.运行Java程序,下载地址是:https://www.oracle.com/technetwork/java/javase/dow ...

  6. HTML5: input:file上传类型控制

    ylbtech-HTML5: input:file上传类型控制   1. 一.input:file 属性返回顶部 一.input:file属性 属性值有以下几个比较常用: accept:表示可以选择的 ...

  7. 学习笔记之100 TOP Ikm C++ Online Test Questions

    100 TOP Ikm C++ Online Test Questions 2017 http://interviewquestionstutorials.com/tag/100-top-ikm-c- ...

  8. 廖雪峰Java1-1Java入门-java简介

    Java特点: 一种面向对象的跨平台变成语言 以字节码方式运行在虚拟机上 自带功能齐全的类库 非常活跃的开源社区支持 Java优点: 简单.健壮.安全 跨平台,一次编写,到处运行 高度优化的虚拟机 J ...

  9. 关于clearfix和clear的研究

    今天领导跟我说到这个问题,我上网找了些资料,已转载一篇文章到本博客(后一篇),摘自百度文库. ps:还有一种写法就是: CSS代码: .clearfix:after { content: " ...

  10. PHP-Socket服务端客户端发送接收通信实例详解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://fighter.blog.51cto.com/1318618/1533957 So ...