在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (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) + , (flagArray.Length * this.qrCodeScale) + );
Graphics graphics = Graphics.FromImage(image);
graphics.FillRectangle(brush, new Rectangle(, , image.Width, image.Height));
brush.Color = this.qrCodeForegroundColor;
for (int i = ; i < flagArray.Length; i++)
{
for (int j = ; 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, , dst, , dst.Length);
return encoding.GetString(dst);
} public virtual sbyte[] decodeBytes(QRCodeImage qrCodeImage)
{
DecodeResult result;
Point[] adjustPoints = this.AdjustPoints;
ArrayList list = ArrayList.Synchronized(new ArrayList());
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") >= )
{
throw exception;
}
}
finally
{
this.numTryDecode++;
}
}
if (list.Count == )
{
throw new DecodingFailedException("Give up decoding");
}
int num = -;
int numErrors = 0x7fffffff;
for (int i = ; 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 = ,
QRCodeVersion = ,
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,可以直接进入上面的链接中查看下载,在这里就不做一个示例介绍。

.NET组件介绍系列:

一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)http://www.cnblogs.com/pengze0902/p/6122311.html

高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)http://www.cnblogs.com/pengze0902/p/6125570.html

最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)http://www.cnblogs.com/pengze0902/p/6124659.html

免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)http://www.cnblogs.com/pengze0902/p/6134506.html

免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)http://www.cnblogs.com/pengze0902/p/6128558.html

免费高效实用的Excel操作组件NPOI(.NET组件介绍之六)http://www.cnblogs.com/pengze0902/p/6150070.html

免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)的更多相关文章

  1. DotNet二维码操作组件ThoughtWorks.QRCode

    DotNet二维码操作组件ThoughtWorks.QRCode 在生活中有一种东西几乎已经快要成为我们的另一个电子"身份证",那就是二维码.无论是在软件开发的过程中,还是在普通用 ...

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

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

  3. ASP.NET 生成二维码(采用ThoughtWorks.QRCode和QrCode.Net两种方式)

    最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,Thought ...

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

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

  5. ASP.NET MVC 二维码生成(ThoughtWorks.QRCode)

    原文地址http://www.cnblogs.com/jys509/p/4592539.html

  6. Javascript 二维码生成库:QRCode

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. python二维码操作:QRCode和MyQR入门

    1.QRCode QRCode最简单的使用 import qrcode qrcode.make("第一个二维码").get_image().show() 根据文本生成二维码并且直接 ...

  8. PHP生成二维码【谷歌API+qrcode+圆角Logo】

    方法一:谷歌二维码API 接口地址:https://chart.googleapis.com/chart 官方文档:https://developers.google.com/chart/infogr ...

  9. jquery二维码生成插件jquery.qrcode.js

    插件描述:jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 ,使用它可以很方便的在页面上生成二维条码. 转载于:http://www.jq22.com ...

随机推荐

  1. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  2. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  3. ASP.NET Core 之 Identity 入门(三)

    前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...

  4. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  5. C语言 · 数位分离

    问题描述 编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示. 输入格式:输入只有一行,即一个1000以内的正整数. 输出格式:输出只有一行,即该整数的每 ...

  6. Javascript面向对象类文章目录

    1.javaScript的原型继承与多态性 2.JavaScript的继承实现方式 3.JS中 call() 与apply 方法

  7. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  8. 【转】java通用URL接口地址调用方式GET和POST方式

    java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...

  9. vim环境变量配置、背景色配置

    我们使用vi或者vim的时候,如果想要显示行号,可能会这样做:切换到命令模式,然后输入set nu,再按回车键就显示了:还有就是咱们在编写程序的时候,有的时候会希望按下回车键后,光标不是每次都在行首, ...

  10. vim+vundle配置

    Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用.一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能.一般流程都是下载需要的工具,然 ...