欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-26 09:52:00
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (dimensio...

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

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

以上是采用.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,可以直接进入上面的链接中查看下载,在这里就不做一个示例介绍。

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