详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (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,可以直接进入上面的链接中查看下载,在这里就不做一个示例介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
-
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
-
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
-
详解开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)
-
详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
-
详解免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
-
详解开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)
-
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
-
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
-
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)