LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

详解免费开源的.Net二维码操作组件ThoughtWorks.QRCode.dll(.NET组件介绍)

admin
2022年7月28日 23:52 本文热度 3403
文章简介:本篇文章主要介绍了免费开源的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);

 }

}

四.总结:

跟以前介绍组件一样,首先是组件的概述,组件的核心类,组件的使用方法,这些在这个组件时,找改组件的相关概述时,花了不少时间,也不知道为何,这个组件没有找到相关的资料,甚至连作者都是以某某某代替,但是互联网就是如此,我们不需要知道是谁制造的,只要用起来方便就可以。在生成二维码的组件和js插件中,我个人还是喜欢这个组件的,感觉很不错,任何组件和方法都是有个人偏好和使用环境,读者可以自行根据情况选择。


该文章在 2025/4/30 16:07:20 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved