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

 更新时间:2016年12月14日 14:09:07   作者:彭泽0902  
本篇文章主要介绍了免费开源的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插件中,我个人还是喜欢这个组件的,感觉很不错,任何组件和方法都是有个人偏好和使用环境,读者可以自行根据情况选择。

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

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

相关文章

  • linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)

    linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)

    在上一篇中,我们做了基于linq to sql 的多条件组合查询,但通过监视数据库发现,这样做的成本比较高,每次都要取出全部的数据到内存进行筛选.
    2011-08-08
  • Asp.Net MVC4通过id更新表单内容的思路详解

    Asp.Net MVC4通过id更新表单内容的思路详解

    一个表单一旦创建完,其中大部分的字段便不可再编辑。只能编辑其中部分字段。下面通过本文给大家分享Asp.Net MVC4通过id更新表单内容的思路详解,需要的朋友参考下吧
    2017-07-07
  • ASP.NET创建动态缩略图的方法

    ASP.NET创建动态缩略图的方法

    这篇文章主要介绍了ASP.NET创建动态缩略图的方法,实例分析了asp.net动态操作图片的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 在ASP.NET Core Mvc集成MarkDown的方法

    在ASP.NET Core Mvc集成MarkDown的方法

    这篇文章主要介绍了在ASP.NET Core Mvc集成MarkDown的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 完美解决Could not load file or assembly AjaxPro.2 or one of its dependencies. 拒绝访问。

    完美解决Could not load file or assembly AjaxPro.2 or one of its

    Could not load file or assembly AjaxPro.2,经排查原来是mcafee限制了
    2007-08-08
  • .NET C#使用微信公众号登录网站

    .NET C#使用微信公众号登录网站

    这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 如何将asp.net core程序部署到Linux服务器

    如何将asp.net core程序部署到Linux服务器

    这篇文章主要介绍了将asp.net core程序部署到Linux服务器上的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • ASP.NET Core 奇技淫巧之接口代理转发的实现

    ASP.NET Core 奇技淫巧之接口代理转发的实现

    这篇文章主要介绍了ASP.NET Core 奇技淫巧之接口代理转发的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 详解VS2017 Linux 上.NET Core调试

    详解VS2017 Linux 上.NET Core调试

    这篇文章主要介绍了详解VS2017 Linux 上.NET Core调试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • .NET Core 反射底层原理解析

    .NET Core 反射底层原理解析

    本文介绍了.NET中的反射机制,包括前期绑定(EarlyBinding)和后期绑定(LateBinding)的概念,反射是一种强大的工具,但在性能要求较高的场景中应谨慎使用,感兴趣的朋友跟随小编一起看看吧
    2024-11-11

最新评论