在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (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:二维码编码类。

  1. public enum ENCODE_MODE
  2. {
  3. ALPHA_NUMERIC,
  4. NUMERIC,
  5. BYTE
  6. }
  7.  
  8. public enum ERROR_CORRECTION
  9. {
  10. L,
  11. M,
  12. Q,
  13. H
  14. }
  15.  
  16. public virtual Bitmap Encode(string content, Encoding encoding)
  17. {
  18. bool[][] flagArray = this.calQrcode(encoding.GetBytes(content));
  19. SolidBrush brush = new SolidBrush(this.qrCodeBackgroundColor);
  20. Bitmap image = new Bitmap((flagArray.Length * this.qrCodeScale) + , (flagArray.Length * this.qrCodeScale) + );
  21. Graphics graphics = Graphics.FromImage(image);
  22. graphics.FillRectangle(brush, new Rectangle(, , image.Width, image.Height));
  23. brush.Color = this.qrCodeForegroundColor;
  24. for (int i = ; i < flagArray.Length; i++)
  25. {
  26. for (int j = ; j < flagArray.Length; j++)
  27. {
  28. if (flagArray[j][i])
  29. {
  30. graphics.FillRectangle(brush, j * this.qrCodeScale, i * this.qrCodeScale, this.qrCodeScale, this.qrCodeScale);
  31. }
  32. }
  33. }
  34. return image;
  35. }

2.QRCodeDecoder:二维码解码类。

  1. public virtual string decode(QRCodeImage qrCodeImage, Encoding encoding)
  2. {
  3. sbyte[] src = this.decodeBytes(qrCodeImage);
  4. byte[] dst = new byte[src.Length];
  5. Buffer.BlockCopy(src, , dst, , dst.Length);
  6. return encoding.GetString(dst);
  7. }
  8.  
  9. public virtual sbyte[] decodeBytes(QRCodeImage qrCodeImage)
  10. {
  11. DecodeResult result;
  12. Point[] adjustPoints = this.AdjustPoints;
  13. ArrayList list = ArrayList.Synchronized(new ArrayList());
  14. while (this.numTryDecode < adjustPoints.Length)
  15. {
  16. try
  17. {
  18. result = this.decode(qrCodeImage, adjustPoints[this.numTryDecode]);
  19. if (result.CorrectionSucceeded)
  20. {
  21. return result.DecodedBytes;
  22. }
  23. list.Add(result);
  24. canvas.println("Decoding succeeded but could not correct");
  25. canvas.println("all errors. Retrying..");
  26. }
  27. catch (DecodingFailedException exception)
  28. {
  29. if (exception.Message.IndexOf("Finder Pattern") >= )
  30. {
  31. throw exception;
  32. }
  33. }
  34. finally
  35. {
  36. this.numTryDecode++;
  37. }
  38. }
  39. if (list.Count == )
  40. {
  41. throw new DecodingFailedException("Give up decoding");
  42. }
  43. int num = -;
  44. int numErrors = 0x7fffffff;
  45. for (int i = ; i < list.Count; i++)
  46. {
  47. result = (DecodeResult) list[i];
  48. if (result.NumErrors < numErrors)
  49. {
  50. numErrors = result.NumErrors;
  51. num = i;
  52. }
  53. }
  54. canvas.println("All trials need for correct error");
  55. canvas.println("Reporting #" + num + " that,");
  56. canvas.println("corrected minimum errors (" + numErrors + ")");
  57. canvas.println("Decoding finished.");
  58. return ((DecodeResult) list[num]).DecodedBytes;
  59. }

3.QRCodeBitmapImage:位图图像。

  1. public class QRCodeBitmapImage : QRCodeImage
  2. {
  3. // Fields
  4. private Bitmap image;
  5.  
  6. // Methods
  7. public QRCodeBitmapImage(Bitmap image);
  8. public virtual int getPixel(int x, int y);
  9.  
  10. // Properties
  11. public virtual int Height { get; }
  12. public virtual int Width { get; }
  13. }
  1. public interface QRCodeImage
  2. {
  3. // Methods
  4. int getPixel(int x, int y);
  5.  
  6. // Properties
  7. int Height { get; }
  8. int Width { get; }
  9. }

以上是对ThoughtWorks.QRCode组件的一些方法的介绍,如果需要了解更多的方法,可以查看对应的源码。

三.ThoughtWorks.QRCode二维码操作实例:

1.生成二维码(对二维码没有进行设置)。

  1. /// <summary>
  2. /// 生成二维码
  3. /// </summary>
  4. /// <param name="content">带生成二维码的字符串</param>
  5. /// <param name="path">路径</param>
  6. /// <returns></returns>
  7. public static string CreatehoughtWorksQrCode(string content, string path)
  8. {
  9. if (string.IsNullOrEmpty(content))
  10. {
  11. throw new ArgumentNullException(content);
  12. }
  13. if (string.IsNullOrEmpty(path))
  14. {
  15. throw new ArgumentNullException(path);
  16. }
  17. var qrCodeEncoder = new QRCodeEncoder
  18. {
  19. QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
  20. QRCodeScale = ,
  21. QRCodeVersion = ,
  22. QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M
  23. };
  24. Image image = qrCodeEncoder.Encode(content);
  25. var filename = DateTime.Now.ToString("yyyymmddhhmmssfff") + ".jpg";
  26. var filepath = string.Format("{0}{1}", path, filename);
  27. FileStream fs = null;
  28. try
  29. {
  30. fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);
  31. image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
  32. }
  33. catch (IOException ex)
  34. {
  35. throw new IOException(ex.Message);
  36. }
  37. finally
  38. {
  39. if (fs != null) fs.Close();
  40. image.Dispose();
  41. }
  42. return CodeDecoder(filepath);
  43. }

2.选择生成二维码的相关类型。

  1. /// <summary>
  2. /// 选择生成二维码的相关类型
  3. /// <param name="strData">要生成的文字或者数字,支持中文。如: "4408810820 深圳-广州" 或者:4444444444</param>
  4. /// <param name="qrEncoding">三种尺寸:BYTE ,ALPHA_NUMERIC,NUMERIC</param>
  5. /// <param name="level">大小:L M Q H</param>
  6. /// <param name="version">版本:如 8</param>
  7. /// <param name="scale">比例:如 4</param>
  8. /// <returns></returns>
  9. /// </summary>
  10. public void CreateCode_Choose(string strData, string qrEncoding, string level, int version, int scale)
  11. {
  12. if (string.IsNullOrEmpty(strData))
  13. {
  14. throw new ArgumentNullException(strData);
  15. }
  16. if (string.IsNullOrEmpty(qrEncoding))
  17. {
  18. throw new ArgumentNullException(qrEncoding);
  19. }
  20. if (string.IsNullOrEmpty(level))
  21. {
  22. throw new ArgumentNullException(level);
  23. }
  24. var qrCodeEncoder = new QRCodeEncoder();
  25. var encoding = qrEncoding;
  26. switch (encoding)
  27. {
  28. case "Byte":
  29. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
  30. break;
  31. case "AlphaNumeric":
  32. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
  33. break;
  34. case "Numeric":
  35. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
  36. break;
  37. default:
  38. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
  39. break;
  40. }
  41. qrCodeEncoder.QRCodeScale = scale;
  42. qrCodeEncoder.QRCodeVersion = version;
  43. switch (level)
  44. {
  45. case "L":
  46. qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
  47. break;
  48. case "M":
  49. qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
  50. break;
  51. case "Q":
  52. qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
  53. break;
  54. default:
  55. qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
  56. break;
  57. }
  58. Image image = null;
  59. FileStream fs = null;
  60. try
  61. {
  62. //文字生成图片
  63. image = qrCodeEncoder.Encode(strData);
  64. var filename = DateTime.Now.ToString("yyyymmddhhmmssfff") + ".jpg";
  65. var filepath = HttpContext.Current.Server.MapPath(@"~\Upload") + "\\" + filename;
  66. fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);
  67. image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
  68. }
  69. catch (IOException ioex)
  70. {
  71. throw new IOException(ioex.Message);
  72. }
  73. catch (Exception ex)
  74. {
  75. throw new Exception(ex.Message);
  76. }
  77. finally
  78. {
  79. if (fs != null) fs.Close();
  80. if (image != null) image.Dispose();
  81. }
  82. }

3.二维码解码。

  1. /// <summary>
  2. /// 二维码解码
  3. /// </summary>
  4. /// <param name="filePath">图片路径</param>
  5. /// <returns></returns>
  6. public static string CodeDecoder(string filePath)
  7. {
  8. if (string.IsNullOrEmpty(filePath))
  9. {
  10. throw new ArgumentNullException(filePath);
  11. }
  12. try
  13. {
  14. if (!File.Exists(filePath))
  15. return null;
  16. var myBitmap = new Bitmap(Image.FromFile(filePath));
  17. var decoder = new QRCodeDecoder();
  18. var decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
  19. return decodedString;
  20. }
  21. catch (Exception ex)
  22. {
  23. throw new Exception(ex.Message);
  24. }
  25. }

四.总结:

跟以前介绍组件一样,首先是组件的概述,组件的核心类,组件的使用方法,这些在这个组件时,找改组件的相关概述时,花了不少时间,也不知道为何,这个组件没有找到相关的资料,甚至连作者都是以某某某代替,最后还是在这里找到一些介绍: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. Asp.Net Mvc 使用WebUploader 多图片上传

    来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...

  2. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  3. 6. ModelDriven拦截器、Preparable 拦截器

    1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...

  4. html5 与视频

    1.视频支持格式. 有3种视频格式被浏览器广泛支持:.ogg,.mp4,.webm. Theora+Vorbis=.ogg  (Theora:视频编码器,Vorbis:音频编码器) H.264+$$$ ...

  5. Velocity初探小结--velocity使用语法详解

    做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...

  6. iOS开发 判断当前APP版本和升级

    从iOS8系统开始,用户可以在设置里面设置在WiFi环境下,自动更新安装的App.此功能大大方便了用户,但是一些用户没有开启此项功能,因此还是需要在程序里面提示用户的 方法一:在服务器接口约定对应的数 ...

  7. Linux-Rhel6 恢复误删文件

    需要工具extundelete(可通过xshell上传下载到linux)知识点:ifconifig eth0             查看ipfdisk /dev/sda          管理磁盘m ...

  8. FineReport如何部署Tomcat服务器集群

    环境准备 Tomcat服务器集群中需要进行环境准备: Apache:Apache是http服务器,利用其对Tomcat进行负载均衡,这里使用的版本是Apache HTTP Server2.0.64: ...

  9. 前端如何正确选择offer,到底选哪个?

    文章背景:来自于一次线上交流,当时回答感觉比较粗糙,做个阶段性的总结,也分享给其它朋友. 当时的题目是,共2个offer,如何选择: 1. 美团外卖前端 2. 京东深圳前端研发(只有通过邮件,还有收到 ...

  10. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...