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

发布时间 - 2026-01-10 21:49:00    点击率:

在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (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插件中,我个人还是喜欢这个组件的,感觉很不错,任何组件和方法都是有个人偏好和使用环境,读者可以自行根据情况选择。

 由于开发者提供了一个demo,可以直接进入上面的链接中查看下载,在这里就不做一个示例介绍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ThoughtWorks.QRCode实例  # .NET  # 二维码生成  # thoughtworks.qrcode  # .NET 开源配置组件 AgileConfig的使用简介  # ASP.NET开源导入导出库Magicodes.IE完成Csv导入导出的方法  # 详解开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)  # 详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  # 详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  # 详解最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)  # 详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)  # .NET中开源文档操作组件DocX的介绍与使用  # 基于.NET平台常用的框架和开源程序整理  # .NET 开源项目Polly的简单介绍  # 是在  # 应用程序  # 日本  # 源代码  # 都是  # 是一个  # 也不  # 互联网  # 在这里  # 在这个  # 可用于  # 还可以  # 不需要  # 就不  # 基础上  # 有一种  # 它是  # 花了  # 三种  # 很不错 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  网站制作企业,网站的banner和导航栏是指什么?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  打造顶配客厅影院,这份100寸电视推荐名单请查收  Firefox Developer Edition开发者版本入口  nodejs redis 发布订阅机制封装实现方法及实例代码  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何用花生壳三步快速搭建专属网站?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel怎么在Blade中安全地输出原始HTML内容  网页设计与网站制作内容,怎样注册网站?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何在阿里云高效完成企业建站全流程?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何在 React 中条件性地遍历数组并渲染元素  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel定时任务怎么设置_Laravel Crontab调度器配置  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel如何处理文件下载请求?(Response示例)  javascript基本数据类型及类型检测常用方法小结  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  iOS发送验证码倒计时应用  大连 网站制作,大连天途有线官网?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何用PHP快速搭建CMS系统?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在云虚拟主机上快速搭建个人网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  详解CentOS6.5 安装 MySQL5.1.71的方法  C#如何调用原生C++ COM对象详解  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  教你用AI将一段旋律扩展成一首完整的曲子  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像