在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (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,可以直接进入上面的链接中查看下载,在这里就不做一个示例介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# ThoughtWorks.QRCode实例
# .NET
# 二维码生成
# thoughtworks.qrcode
# .NET 开源配置组件 AgileConfig的使用简介
# ASP.NET开源导入导出库Magicodes.IE完成Csv导入导出的方法
# 详解开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)
# 详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
# 详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
# 详解最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
# 详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
# .NET中开源文档操作组件DocX的介绍与使用
# 基于.NET平台常用的框架和开源程序整理
# .NET 开源项目Polly的简单介绍
# 是在
# 应用程序
# 日本
# 源代码
# 都是
# 是一个
# 也不
# 互联网
# 在这里
# 在这个
# 可用于
# 还可以
# 不需要
# 就不
# 基础上
# 有一种
# 它是
# 花了
# 三种
# 很不错
相关文章:
活动邀请函制作网站有哪些,活动邀请函文案?
济南企业网站制作公司,济南社保单位网上缴费步骤?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何用虚拟主机快速搭建网站?详细步骤解析
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站主机是否属于云主机类型?
山东云建站价格为何差异显著?
内网网站制作软件,内网的网站如何发布到外网?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
音响网站制作视频教程,隆霸音响官方网站?
红河网站制作公司,红河事业单位身份证如何上传?
如何基于PHP生成高效IDC网络公司建站源码?
视频网站制作教程,怎么样制作优酷网的小视频?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
如何用狗爹虚拟主机快速搭建网站?
重庆市网站制作公司,重庆招聘网站哪个好?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
建站主机功能解析:服务器选择与快速搭建指南
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
建站主机如何选?高性价比方案全解析
图册素材网站设计制作软件,图册的导出方式有几种?
已有域名如何快速搭建专属网站?
如何通过西部数码建站助手快速创建专业网站?
Android使用GridView实现日历的简单功能
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
广州商城建站系统开发成本与周期如何控制?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何通过万网虚拟主机快速搭建网站?
如何高效利用亚马逊云主机搭建企业网站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
,制作一个手机app网站要多少钱?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
香港服务器租用每月最低只需15元?
教学网站制作软件,学习*后期制作的网站有哪些?
如何配置WinSCP新建站点的密钥验证步骤?
如何在IIS管理器中快速创建并配置网站?
如何通过VPS建站无需域名直接访问?
建站之星后台密码遗忘?如何快速找回?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
如何快速搭建FTP站点实现文件共享?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
临沂网站制作企业,临沂第三中学官方网站?
如何通过虚拟主机快速完成网站搭建?
简单实现Android文件上传
*请认真填写需求信息,我们会在24小时内与您取得联系。