QRCode
这个星期, 领导要我总结项目中用到的一些技术, 然后交付文档. 嘿嘿, 奉命整理.
二维码, 相信很多项目中都会要求生成这个, 然后由手机端去扫描, 或存储一些详情信息, 或存储一条链接, 可以快捷访问.
一、示例
- public ActionResult QrCode()
- {
- var s = CreateQr("策士", "", "男", DateTime.Now.AddYears(-), "");
- return File(s, "image/jpeg,image/png");
- }
- /// <summary>
- /// 生成二维码
- /// </summary>
- /// <returns>二维码相对路径</returns>
- public string CreateQr(string name, string code, string sex, DateTime birthday, string phone)
- {
- var codeParams = CodeDescriptor.Init(HttpContext.Request);
- var fileName = code + ".png";
- var path = Server.MapPath("~/QRCode/");
- var fullFileName = path + fileName;
- string content = string.Format("姓名:{0}\n编号:{1}\n性别:{2}\n年龄:{3}\n联系电话:{4}\n",
- name,
- code,
- sex,
- (birthday.Year > ? (DateTime.Now.Year - birthday.Year).ToString() : ""),
- phone);
- codeParams.Content = content;
- // Encode the content
- codeParams.TryEncode();
- using (var ms = new MemoryStream())
- {
- codeParams.Render(ms);
- #region 保存图片
- var img = Image.FromStream(ms);
- if (!Directory.Exists(path))
- {
- Directory.CreateDirectory(path);
- }
- img.Save(fullFileName);
- #endregion
- }
- return fullFileName;
- }
对这个二维码扫一扫, 就可以看到相关信息了.
二、参数解析
- /// <summary>
- /// Parse QueryString that define the QR code properties
- /// </summary>
- /// <param name="request">HttpRequest containing HTTP GET data</param>
- /// <returns>A QR code descriptor object</returns>
- public static CodeDescriptor Init(HttpRequestBase request)
- {
- var cp = new CodeDescriptor();
- // Error correction level
- if (!Enum.TryParse(request.QueryString["e"], out cp.Ecl))
- cp.Ecl = ErrorCorrectionLevel.L;
- // Code content to encode
- cp.Content = request.QueryString["t"];
- // Size of the quiet zone
- if (!Enum.TryParse(request.QueryString["q"], out cp.QuietZones))
- cp.QuietZones = QuietZoneModules.Two;
- // Module size
- if (!int.TryParse(request.QueryString["s"], out cp.ModuleSize))
- cp.ModuleSize = ;
- return cp;
- }
1. 容错率
二维码的容错率有四个级别, 不过我得先介绍一下什么叫二维码容错率.
二维码容错率就是, 在二维码编码的时候, 进行冗余操作, 这种做法的目的, 就是希望二维码在有部分被遮挡的情况下, 还能扫描出正确结果. 就像abc编码成abcabc.
- public enum ErrorCorrectionLevel
- {
- L = , //low 7%的字码可以被修正
- M = , //medium 15%
- Q = , //quartile 25%
- H = , //high 30%
- }
测试方法, 其实就是拿着扫一扫, 对二维码扫描, 扫描的时候, 慢慢的将二维码放入扫描匡, 会发现, 其实并不需要完全放入扫描匡, 就已经能出结果了.
容错率越高, 越容易快速扫描, 代价就是, 二维码编码的内容增多, 增加了二维码的复杂度.
默认情况下, 会选择L.
2. 空白
- public enum QuietZoneModules
- {
- Zero = ,
- Two = ,
- Four = ,
- }
这个属性, 表示二维码边上的空白区域的厚度, Zero表示没有空白边框, 最后的边框厚度, 是Two * 2 得到的.
3. 尺寸
这里的 ModuleSize 就是二维码图片的尺寸, 尺寸越大, 能容纳信息越多.
4. 内容编码
二维码内容默认编码为utf-8,
这里还有一些别的属性, 比如背景颜色, 绘制颜色之类的, 就不一一细说了
二维码的内容长度限制, 在文档中, 并没有找到, Api文档中说, 少到1个字符, 多到900个字符, 二维码都是能正常显示的. 当然, 二维码存储信息不易过多. The shorter the better.
如果内容过多, 可以通过二维码提供链接的方式, 让用户去请求接口, 而不是通过扫描二维码直接得到内容.
具体方法, 就是
- codeParams.Content = "http://www.baidu.com";
这里的http://是必须要的, 否则会将内容当做普通字符去解析
最后, 贴上完整的封装:
- /// <summary>
- /// Class containing the description of the QR code and wrapping encoding and rendering.
- /// </summary>
- public class CodeDescriptor
- {
- public ErrorCorrectionLevel Ecl;
- public string Content;
- public QuietZoneModules QuietZones;
- public int ModuleSize;
- public BitMatrix Matrix;
- public string ContentType;
- /// <summary>
- /// Parse QueryString that define the QR code properties
- /// </summary>
- /// <param name="request">HttpRequest containing HTTP GET data</param>
- /// <returns>A QR code descriptor object</returns>
- public static CodeDescriptor Init(HttpRequestBase request)
- {
- var cp = new CodeDescriptor();
- // Error correction level
- if (!Enum.TryParse(request.QueryString["e"], out cp.Ecl))
- cp.Ecl = ErrorCorrectionLevel.L;
- // Code content to encode
- cp.Content = request.QueryString["t"];
- // Size of the quiet zone
- if (!Enum.TryParse(request.QueryString["q"], out cp.QuietZones))
- cp.QuietZones = QuietZoneModules.Two;
- // Module size
- if (!int.TryParse(request.QueryString["s"], out cp.ModuleSize))
- cp.ModuleSize = ;
- return cp;
- }
- /// <summary>
- /// Parse QueryString that define the QR code properties
- /// </summary>
- /// <param name="request">HttpRequest containing HTTP GET data</param>
- /// <returns>A QR code descriptor object</returns>
- public static CodeDescriptor Init(HttpRequest request)
- {
- var cp = new CodeDescriptor();
- // Error correction level
- if (!Enum.TryParse(request.QueryString["e"], out cp.Ecl))
- cp.Ecl = ErrorCorrectionLevel.L;
- // Code content to encode
- cp.Content = request.QueryString["t"];
- // Size of the quiet zone
- if (!Enum.TryParse(request.QueryString["q"], out cp.QuietZones))
- cp.QuietZones = QuietZoneModules.Two;
- // Module size
- if (!int.TryParse(request.QueryString["s"], out cp.ModuleSize))
- cp.ModuleSize = ;
- return cp;
- }
- /// <summary>
- /// Encode the content with desired parameters and save the generated Matrix
- /// </summary>
- /// <returns>True if the encoding succeeded, false if the content is empty or too large to fit in a QR code</returns>
- public bool TryEncode()
- {
- var encoder = new QrEncoder(Ecl);
- QrCode qr;
- if (!encoder.TryEncode(Content, out qr))
- return false;
- Matrix = qr.Matrix;
- return true;
- }
- /// <summary>
- /// Render the Matrix as a PNG image
- /// </summary>
- /// <param name="ms">MemoryStream to store the image bytes into</param>
- public void Render(MemoryStream ms)
- {
- var render = new GraphicsRenderer(new FixedModuleSize(ModuleSize, QuietZones));
- render.WriteToStream(Matrix, ImageFormat.Png, ms);
- ContentType = "image/png";
- }
- }
二维码
参考:
QRCode的更多相关文章
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
- 使用jquery.qrcode生成二维码(转)
jQuery 的 qrcode 插件就可以在浏览器端生成二维码图片. 这个插件的使用非常简单: 1.首先在页面中加入jquery库文件和qrcode插件. <script type=" ...
- 动态生成二维码插件 jquery.qrcode.js
前段时间做项目,需要动态生成一个二维码,于是就在网上找了一下发现一个jquery插件jquery.qrcode.js,所以今天就简单说一下这个插件的使用: jquery.qrcode.js是依赖jqu ...
- qrcode 生成验证码带文字
/** * 生成二维码 * * @param int $id * @param string $file * @param boolean $is_download */public function ...
- Jquery.Qrcode在客户端动态生成二维码并添加自定义Logo
0 Jquery.Qrcode简介 Jquery.Qrcode.js是一个在浏览器端基于Jquery动态生成二维码的插件,支持Canvas和Table两种渲染方式,它的优点是在客户端动态生成,减轻了服 ...
- Pyqt+QRcode 生成 识别 二维码
1.生成二维码 python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳 一.python-qrcode介绍 python-qrco ...
- .NET 二维码生成(ThoughtWorks.QRCode)
引用ThoughtWorks.QRCode.dll (源代码里有) 1.简单二维码生成及解码代码: //生成二维码方法一 private void CreateCode_Simple(string n ...
- iOS - QRCode 二维码
1.QRCode 在 iOS7 以前,在 iOS 中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar 与 ZXing. 这两大组件我们都有用过,这里总结下各自的缺点: 1.ZBar 在扫描 ...
- jquery.qrcode 生成二维码带logo
<div id="container">这里是二维码显示位置</div> <script language="JavaScript" ...
随机推荐
- Eclipse中自动提示的方法参数都是arg0,arg1的解决方法
Eclipse中自动提示的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便. 解决方法:Preferences->Java->Installed JREs,发现 ...
- Quartz 2D在ios中的使用简述一:坐标体系
Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,官方文档:Quartz 2D Programming Guide. 一.坐标体系 这样的坐标体系就导致我们使用Quart ...
- 使用Akka.net开发第一个分布式应用
系列主题:基于消息的软件架构模型演变 既然这个系列的主题是"基于消息的架构模型演变",少不了说说Actor模型.Akka.net是一个基于Actor模型的分布式框架.如果你对分布式 ...
- 为jQuery添加Webkit的触摸方法支持
前些日子收到邮件,之前兼职的一个项目被转给了其他人,跟进的人来问我相关代码的版权问题. 我就呵呵了. 这段代码是我在做13年一份兼职的时候无聊加上去的,为jQuery添加触摸事件的支持.因为做得有点无 ...
- 固定Table的头部和左边的列-在Knockout Js使用场景下
要求:固定Table的头部和左边的列 场景:Knockout Js被用于绑定Table的数据源. 固定HTML表格的头部和列是一个很常见的需求.此文:http://www.cnblogs.com/so ...
- ls /usr/linkapp 没反应
ls /usr/linkapp ll /usr/linkapp 都是一样无反应 没有任何反应, ctrl + c / ctrl + d 都不行 但是 ls /usr/linkapp/ | wc - ...
- Android-找到包下面所有的类
Android 利用反射找到包下面所有的类 Android下其实有一个DexFile的东西,利用它我们可以很好的找到包下面所有的类 什么是DexFile? 官方的说明是这样的: Manipulates ...
- Linux服务器常用操作
Context 客户端:MacOS Terminal终端 服务器端:Linux v2.6 更新项目 进程 查看:ps -ef | grep * 杀死:kill -9 <pid> 数据库 备 ...
- SSIS Execute SQL Task 用法
Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行sel ...
- 实战MEF(4):搜索范围
在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...