DotNet二维码操作组件ThoughtWorks.QRCode
DotNet二维码操作组件ThoughtWorks.QRCode
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (dimensional barcode) ,又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码。设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息。相比一维条码,二维码记载更复杂的数据,比如图片、网络链接等。
今天介绍一种免费开源的二维码操作组件,ThoughtWorks.QRCode组件可以高效而稳定的生成我们需要的二维码,接下来我们详细的了解一下这个组件。
一.ThoughtWorks.QRCode组件概述:
QRCode库是一个.NET组件,可用于编码和解码QRCode。 QRCode是源自日本的二维条形码。 现在,它广泛应用于广泛的工业领域。 用于车辆部件跟踪和库存管理。QR代表“快速反应”。 它是日本公司Denso-Wave在1994年创建的,目的是高速解码内容。 如今,QR码被用于手机中以缓解数据输入。QRCode还可以打印在名片上或显示在任何显示器上,然后可以由移动电话捕获,只要移动电话具有读取QRCode的软件。QRCode库提供的功能包括:将内容编码为QR码图像,可以保存为JPEG,GIF,PNG或位图格式;解码QR码图像。
该库可用于任何.NET 2.0 Windows应用程序,ASP.NET Web应用程序或Windows Mobile设备应用程序。以下是该组件的声明”本文以及任何相关的源代码和文件均已获得代码项目开放许可证(CPOL)许可“。
二.ThoughtWorks.QRCode相关核心对象和方法解析:
有关ThoughtWorks.QRCode的主要类如下:
以上是采用.NET Reflector对DLL文件进行反编译,以此查看源代码。由于我只是下载了DLL文件,没有下载源码,所以直接利用.NET Reflector查看源码,接下来具体介绍一下组件的一些类和方法:
1.QRCodeEncoder:二维码编码类。

- public enum ENCODE_MODE
- {
- ALPHA_NUMERIC,
- NUMERIC,
- BYTE
- }
- public enum ERROR_CORRECTION
- {
- L,
- M,
- Q,
- H
- }
- public virtual Bitmap Encode(string content, Encoding encoding)
- {
- bool[][] flagArray = this.calQrcode(encoding.GetBytes(content));
- SolidBrush brush = new SolidBrush(this.qrCodeBackgroundColor);
- Bitmap image = new Bitmap((flagArray.Length * this.qrCodeScale) + 1, (flagArray.Length * this.qrCodeScale) + 1);
- Graphics graphics = Graphics.FromImage(image);
- graphics.FillRectangle(brush, new Rectangle(0, 0, image.Width, image.Height));
- brush.Color = this.qrCodeForegroundColor;
- for (int i = 0; i < flagArray.Length; i++)
- {
- for (int j = 0; j < flagArray.Length; j++)
- {
- if (flagArray[j][i])
- {
- graphics.FillRectangle(brush, j * this.qrCodeScale, i * this.qrCodeScale, this.qrCodeScale, this.qrCodeScale);
- }
- }
- }
- return image;
- }

2.QRCodeDecoder:二维码解码类。

- public virtual string decode(QRCodeImage qrCodeImage, Encoding encoding)
- {
- sbyte[] src = this.decodeBytes(qrCodeImage);
- byte[] dst = new byte[src.Length];
- Buffer.BlockCopy(src, 0, dst, 0, dst.Length);
- return encoding.GetString(dst);
- }
- public virtual sbyte[] decodeBytes(QRCodeImage qrCodeImage)
- {
- DecodeResult result;
- Point[] adjustPoints = this.AdjustPoints;
- ArrayList list = ArrayList.Synchronized(new ArrayList(10));
- while (this.numTryDecode < adjustPoints.Length)
- {
- try
- {
- result = this.decode(qrCodeImage, adjustPoints[this.numTryDecode]);
- if (result.CorrectionSucceeded)
- {
- return result.DecodedBytes;
- }
- list.Add(result);
- canvas.println("Decoding succeeded but could not correct");
- canvas.println("all errors. Retrying..");
- }
- catch (DecodingFailedException exception)
- {
- if (exception.Message.IndexOf("Finder Pattern") >= 0)
- {
- throw exception;
- }
- }
- finally
- {
- this.numTryDecode++;
- }
- }
- if (list.Count == 0)
- {
- throw new DecodingFailedException("Give up decoding");
- }
- int num = -1;
- int numErrors = 0x7fffffff;
- for (int i = 0; i < list.Count; i++)
- {
- result = (DecodeResult) list[i];
- if (result.NumErrors < numErrors)
- {
- numErrors = result.NumErrors;
- num = i;
- }
- }
- canvas.println("All trials need for correct error");
- canvas.println("Reporting #" + num + " that,");
- canvas.println("corrected minimum errors (" + numErrors + ")");
- canvas.println("Decoding finished.");
- return ((DecodeResult) list[num]).DecodedBytes;
- }

3.QRCodeBitmapImage:位图图像。

- public class QRCodeBitmapImage : QRCodeImage
- {
- // Fields
- private Bitmap image;
- // Methods
- public QRCodeBitmapImage(Bitmap image);
- public virtual int getPixel(int x, int y);
- // Properties
- public virtual int Height { get; }
- public virtual int Width { get; }
- }


- public interface QRCodeImage
- {
- // Methods
- int getPixel(int x, int y);
- // Properties
- int Height { get; }
- int Width { get; }
- }

以上是对ThoughtWorks.QRCode组件的一些方法的介绍,如果需要了解更多的方法,可以查看对应的源码。
三.ThoughtWorks.QRCode二维码操作实例:
1.生成二维码(对二维码没有进行设置)。

- /// <summary>
- /// 生成二维码
- /// </summary>
- /// <param name="content">带生成二维码的字符串</param>
- /// <param name="path">路径</param>
- /// <returns></returns>
- public static string CreatehoughtWorksQrCode(string content, string path)
- {
- if (string.IsNullOrEmpty(content))
- {
- throw new ArgumentNullException(content);
- }
- if (string.IsNullOrEmpty(path))
- {
- throw new ArgumentNullException(path);
- }
- var qrCodeEncoder = new QRCodeEncoder
- {
- QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
- QRCodeScale = 4,
- QRCodeVersion = 8,
- QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M
- };
- Image image = qrCodeEncoder.Encode(content);
- var filename = DateTime.Now.ToString("yyyymmddhhmmssfff") + ".jpg";
- var filepath = string.Format("{0}{1}", path, filename);
- FileStream fs = null;
- try
- {
- fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);
- image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
- }
- catch (IOException ex)
- {
- throw new IOException(ex.Message);
- }
- finally
- {
- if (fs != null) fs.Close();
- image.Dispose();
- }
- return CodeDecoder(filepath);
- }

2.选择生成二维码的相关类型。

- /// <summary>
- /// 选择生成二维码的相关类型
- /// <param name="strData">要生成的文字或者数字,支持中文。如: "4408810820 深圳-广州" 或者:4444444444</param>
- /// <param name="qrEncoding">三种尺寸:BYTE ,ALPHA_NUMERIC,NUMERIC</param>
- /// <param name="level">大小:L M Q H</param>
- /// <param name="version">版本:如 8</param>
- /// <param name="scale">比例:如 4</param>
- /// <returns></returns>
- /// </summary>
- public void CreateCode_Choose(string strData, string qrEncoding, string level, int version, int scale)
- {
- if (string.IsNullOrEmpty(strData))
- {
- throw new ArgumentNullException(strData);
- }
- if (string.IsNullOrEmpty(qrEncoding))
- {
- throw new ArgumentNullException(qrEncoding);
- }
- if (string.IsNullOrEmpty(level))
- {
- throw new ArgumentNullException(level);
- }
- var qrCodeEncoder = new QRCodeEncoder();
- var encoding = qrEncoding;
- switch (encoding)
- {
- case "Byte":
- qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
- break;
- case "AlphaNumeric":
- qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
- break;
- case "Numeric":
- qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
- break;
- default:
- qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
- break;
- }
- qrCodeEncoder.QRCodeScale = scale;
- qrCodeEncoder.QRCodeVersion = version;
- switch (level)
- {
- case "L":
- qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
- break;
- case "M":
- qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
- break;
- case "Q":
- qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
- break;
- default:
- qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
- break;
- }
- Image image = null;
- FileStream fs = null;
- try
- {
- //文字生成图片
- image = qrCodeEncoder.Encode(strData);
- var filename = DateTime.Now.ToString("yyyymmddhhmmssfff") + ".jpg";
- var filepath = HttpContext.Current.Server.MapPath(@"~\Upload") + "\\" + filename;
- fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);
- image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
- }
- catch (IOException ioex)
- {
- throw new IOException(ioex.Message);
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message);
- }
- finally
- {
- if (fs != null) fs.Close();
- if (image != null) image.Dispose();
- }
- }

3.二维码解码。

- /// <summary>
- /// 二维码解码
- /// </summary>
- /// <param name="filePath">图片路径</param>
- /// <returns></returns>
- public static string CodeDecoder(string filePath)
- {
- if (string.IsNullOrEmpty(filePath))
- {
- throw new ArgumentNullException(filePath);
- }
- try
- {
- if (!File.Exists(filePath))
- return null;
- var myBitmap = new Bitmap(Image.FromFile(filePath));
- var decoder = new QRCodeDecoder();
- var decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
- return decodedString;
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message);
- }
- }

四.总结:
跟以前介绍组件一样,首先是组件的概述,组件的核心类,组件的使用方法,这些在这个组件时,找改组件的相关概述时,花了不少时间,也不知道为何,这个组件没有找到相关的资料,甚至连作者都是以某某某代替,最后还是在这里找到一些介绍:https://www.codeproject.com/articles/20574/open-source-qrcode-library。但是互联网就是如此,我们不需要知道是谁制造的,只要用起来方便就可以。在生成二维码的组件和js插件中,我个人还是喜欢这个组件的,感觉很不错,任何组件和方法都是有个人偏好和使用环境,读者可以自行根据情况选择。
由于开发者提供了一个demo,可以直接进入上面的链接中查看下载,在这里就不做一个示例介绍。
DotNet二维码操作组件ThoughtWorks.QRCode的更多相关文章
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
- .NET 二维码生成(ThoughtWorks.QRCode)【转发jiangys】
.NET 二维码生成(ThoughtWorks.QRCode) 2015-06-21 22:19 by jiangys, 3790 阅读, 8 评论, 收藏, 编辑 引用ThoughtWorks.QR ...
- .NET 二维码生成(ThoughtWorks.QRCode)
引用ThoughtWorks.QRCode.dll (源代码里有) 1.简单二维码生成及解码代码: //生成二维码方法一 private void CreateCode_Simple(string n ...
- ASP.NET 生成二维码(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,Thought ...
- ASP.NET MVC 二维码生成(ThoughtWorks.QRCode)
原文地址http://www.cnblogs.com/jys509/p/4592539.html
- React Native 二维码扫描组件
学rn得朋友们,你们知道rn开源项目吗?来吧看这里:http://www.marno.cn/(rn开源项目) React Native学习之路(9) - 注册登录验证的实现 + (用Fetch实现po ...
- Javascript 二维码生成库:QRCode
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python二维码操作:QRCode和MyQR入门
1.QRCode QRCode最简单的使用 import qrcode qrcode.make("第一个二维码").get_image().show() 根据文本生成二维码并且直接 ...
- vue.js 二维码生成组件
安装 通过NPM安装 npm install vue-qart --save 插件应用 将vue-qart引入你的应用 import VueQArt from 'vue-qart' new Vue({ ...
随机推荐
- 【转】R语言笔记--颜色的使用
转自该网站:http://research.stowers-institute.org/efg/R/Color/Chart/ 科学可视化中常用的一些颜色表:http://geog.uoregon.ed ...
- 去掉 Android工程中让人很不爽的“黄色警告”
一:问题 二:解决方法 (1)选择android工程,右键Android Tools —> Clear Lint Markers 这种方式能够清除android工程里面的所有警告信息 ...
- iOS远程推送之友盟Push
更新记录: 1.2015年10月23日上午10:10分更新,优化了该类,去除了不必要的方法. ----------------------------------------------------- ...
- 多种cell混合使用
有时候我们会碰到一个tableView上有多种cell,这个时候就需要定义多种cell,根据条件判断,当满足某个条件的时候选择某个cell 先看plist文件: Person.h #import &l ...
- bat自动执行telnet
@del c:\temp.vbs @echo on error resume next >>c:\temp.vbs @echo dim WshShell>>c:\temp.vb ...
- redis中set命令的源码分析
首先在源码中的redis.c文件中有一个结构体:redisCommand redisCommandTable[],这个结构体中定义了每个命令对应的函数,源码中的set命令对应的函数是setComman ...
- 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss
转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...
- thumbnailator图片处理
一.简介 thumbnailator是一个用来对图片对象进行操作的Java类库.通过它我们可以很方面的使用代码的方式,对图片进行一些操作.如缩放,裁减,旋转,水印等.thumbnailator项目主页 ...
- 使用dbms_logmnr查看日志文件
大多为了寻找被意外修改的数据或者那条sql修改了哪些数据 如果是在线重做日志的话需要该日志是inactive模式下的 查询v$log和v$logfile获取相关信息 执行exec dbms_logmn ...
- Web Service中的几个重要术语
WSDL:web service definition language 直译:WebService定义语言 1.对应一种该类型的文件.WSDL 2.定义了Web Service的服务器与客户端应用交 ...