欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

DotNet二维码操作组件ThoughtWorks.QRCode的方法

来源:本站整理 作者:佚名 时间:2016-12-27 TAG: 我要投稿

在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (dimensional barcode) ,又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码。设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息。相比一维条码,二维码记载更复杂的数据,比如图片、网络链接等。
今天介绍一种免费开源的二维码操作组件,ThoughtWorks.QRCode组件可以高效而稳定的生成我们需要的二维码,接下来我们详细的了解一下这个组件。
一.ThoughtWorks.QRCode组件概述:
QRCode库是一个.NET组件,可用于编码和解码QRCode。 QRCode是源自日本的二维条形码。 现在,它广泛应用于广泛的工业领域。 用于车辆部件跟踪和库存管理。QR代表“快速反应”。 它是日本公司Denso-Wave在1994年创建的,目的是高速解码内容。 如今,QR码被用于手机中以缓解数据输入。QRCode还可以打印在名片上或显示在任何显示器上,然后可以由移动电话捕获,只要移动电话具有读取QRCode的软件。QRCode库提供的功能包括:将内容编码为QR码图像,可以保存为JPEG,GIF,png?www.myhack58.com或位图格式;解码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;

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载