千家信息网

DotNet二维码操作组件ThoughtWorksQRCode怎么用

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章给大家介绍DotNet二维码操作组件ThoughtWorks.QRCode怎么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在生活中有一种东西几乎已经快要成为我们的另一
千家信息网最后更新 2025年01月20日DotNet二维码操作组件ThoughtWorksQRCode怎么用

这篇文章给大家介绍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.生成二维码(对二维码没有进行设置)。

 ///   /// 生成二维码  ///   /// 带生成二维码的字符串  /// 路径  ///   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.选择生成二维码的相关类型。

 ///   /// 选择生成二维码的相关类型  /// 要生成的文字或者数字,支持中文。如: "4408810820 深圳-广州" 或者:4444444444  /// 三种尺寸:BYTE ,ALPHA_NUMERIC,NUMERIC  /// 大小:L M Q H  /// 版本:如 8  /// 比例:如 4  ///   ///   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.二维码解码。

///   /// 二维码解码  ///   /// 图片路径  ///   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插件中,我个人还是喜欢这个组件的,感觉很不错,任何组件和方法都是有个人偏好和使用环境,读者可以自行根据情况选择。

关于DotNet二维码操作组件ThoughtWorks.QRCode怎么用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0