C# ThoughtWorks.QRCode 二维码生成和解析
介绍
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码。无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码。二维码 (dimensional barcode) ,又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码。设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息。相比一维条码,二维码记载更复杂的数据,比如图片、网络链接等。
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)许可“。
纠错能力 · L级:约可纠错7%的数据码字· M级:约可纠错15%的数据码字· Q级:约可纠错25%的数据码字· H级:约可纠错30%的数据码字
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; (纠错级别不是越大越好的!
Nuget 引用
<package id="ThoughtWorks.QRCode" version="1.1.0" targetFramework="net461" />
源码下载
中国好程序员/二维码识别生成工具-ThoughtWorks.QRCode标准库 - 码云 - 开源中国 (gitee.com)
生成二维码,不带LOGO
/// <summary> /// 生成二维码(中间不带LOGO) /// </summary> /// <param name="absoluteSave">保存的绝对路径</param> /// <param name="qrdata">要附加的内容</param> /// <returns></returns> public void CreateQRCode(string absoluteSave, string qrdata) { try { QRCodeEncoder encoder = new QRCodeEncoder(); encoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字) encoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高) encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误) encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;//错误效验、错误更正(有4个等级) encoder.QRCodeBackgroundColor = Color.White; encoder.QRCodeForegroundColor = Color.Black; System.Drawing.Image image = encoder.Encode(qrdata, Encoding.UTF8); System.IO.Directory.CreateDirectory(absoluteSave); image.Save(SaveFilePath, ImageFormat.Png); image.Dispose() } catch (Exception e) { //一些操作 } }
生成二维码,带Logo
/// <summary> /// 生成二维码(中间带LOGO) /// </summary> /// <param name="absoluteSave">保存的绝对路径</param> /// <param name="qrdata">要附加的内容</param> ///<param name="absoluteSave">保存的绝对路径</param> /// <returns></returns> public Image CreateQRCode(string qrdata, Image logo) { try { QRCodeEncoder encoder = new QRCodeEncoder(); encoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字) encoder.QRCodeScale = 5;//大小(值越大生成的二维码图片像素越高) ,带Logo,这里要设置成单数,不然logo无法居中 encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误) encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;//错误效验、错误更正(有4个等级) encoder.QRCodeBackgroundColor = Color.White; encoder.QRCodeForegroundColor = Color.Black; System.Drawing.Image image = encoder.Encode(qrdata, Encoding.UTF8); Graphics g = Graphics.FromImage(image); int width1 = image.Width / 4; int height1 = image.Height / 4; int x = image.Width / 2 - width1 / 2; int y = image.Height / 2 - height1 / 2; g.FillRectangle(new SolidBrush(Color.White), x, y, width1, height1); Bitmap copyImage = new Bitmap(logo, width1 - image.Width / 40, height1 - image.Height / 40); g.DrawImage(copyImage, x + image.Width / 40 / 2, y + image.Height / 40 / 2); copyImage.Dispose(); g.Dispose(); return image; } catch (Exception e) { //一些操作 } }
以微信二维码为例
单个方格 的 宽度 为 总宽度/40 | ![]() |
Logo区域 的 宽度 为 10个方格宽度 img.Width / 4 | ![]() |
Logo图像 的 宽度 为 9个方格的宽度 | ![]() |
Logo图像 的 边界留白 为 0.5 个方格宽度 | ![]() |
圆角还未实现 |
解析二维码
/// <summary> /// 解析二维码 /// </summary> /// <param name="absoluteSave">二维码的绝对路径</param> /// <returns></returns> public static string DeCode(string AbsoluteQRCodePath) { string decodedString = new QRCodeDecoder().decode(new QRCodeBitmapImage(new Bitmap(AbsoluteQRCodePath)), Encoding.UTF8); return decodedString; }