C# QRCode二维码的解析与生成

这篇具有很好参考价值的文章主要介绍了C# QRCode二维码的解析与生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  已知一张二维码图片,怎么生成一张一模一样的图片出来?

  最近有个项目,需要用到QRCode,之前只做过Datamatrix格式的,想着应该也是差不多的,于是就依葫芦画瓢,掏出我的陈年OnBarcode类库,一通修改,生成了个崭新的QRCode,与客户提供的二维码图片一比对,虽然扫出来内容一样,但明显图案并不相同,于是我就意识到,事情并不简单。原图如下:

C# QRCode二维码的解析与生成

  首先第一个怀疑的就是参数问题啦,看了一下OnBarcode.Barcode.QRCode的属性,可疑的参数有DataMode、ECL、Version等等,毕竟这几个应该是常见的参数。最大的可能就是ECL,这个是二维码的纠错级别,一般是L/M/Q/H四个等级,对应可遮挡7%/15%/25%/30%,一般如果想在二维码中插入logo的话,就要把纠错级别调高一些。

  于是我尝试了一下,修改了不同的ECL,对应输出的图案都是不同的,但还是没有生成我想要的图案。

  难道是我的陈年OnBarcode类库跟不上时代了?于是我换成了QRCoder,又是一通折腾,还是没对上。再是找了一些在线生成二维码网站(见下方链接),逐个比较,发现还真是五花八门,有些是不提供设置直接生成,有些是可修改版本及ECL的,最后结果都不太一样,幸好有些网站生成的图片是对上了的,总算有条退路。

  既然有了备用方案,那我就可以慢慢研究了。查了下QRCode的生成原理,参考《【来龙去脉系列】QRCode二维码的生成细节和原理》,这一篇讲得不错,不过他在讲Mask那里有点模糊,这也导致我一不留神就掉坑了,后面看了另外两篇才纠正回来。看完大概有了概念,至少明确了,我这个码应该是version1,Alphanumeric mode 字符编码,同时也知道还有个掩码参数(即Mask),而且从图案中可以看到Format Information,那里面存放着ECL跟Mask。文中将Format Information标注0-14,在左上角从上往下从右往左,并且说15个bits中包括5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask,那我自然就认为0-4就是所谓的数据bits了,看了下是11100,跟10101异或得出01001,ECL是01-L?但我在线生成的时候是选的H,那就肯定不对。

  这时候我发现有个在线生成网站写明了用的是ZXing,于是我又引用了ZXing尝试了一下,按照常规的参数配置了ECL-H,还是不行,一度陷入瓶颈。

  我还突发奇想试着把原图上传到在线网站去解析,说不定有哪个网站能给出点提示,但最终也只是能看到内容。不过这么一来我又打开了思路,我可以自己解析,说不定就能拿到配置参数了,感觉可行性还是有的。

  刚好ZXing就有解码的功能,尝试一下:

 1 static void ParseQRCode(string imagePath, out string data, out IDictionary<ResultMetadataType, object> hints)
 2         {
 3             hints = null;
 4             BarcodeReader reader = new BarcodeReader();
 5             reader.Options.PossibleFormats = new List<BarcodeFormat> { BarcodeFormat.QR_CODE };//可加可不加
 6             Bitmap bitmap = new Bitmap(imagePath);
 7             Result result = reader.Decode(bitmap);
 8             if (result != null)
 9             {
10                 data = result.Text;
11                 hints = result.ResultMetadata;
12             }
13             else
14             {
15                 data = null;
16             }
17         }

  输入图片路径,找了一下result的属性,果然在ResultMetadata里面存放着我要的信息:

C# QRCode二维码的解析与生成

   ECL是H,那就没错了,剩下的参数里面,这个QR_MASK_PATTERN不就是掩码参数咯,剩下两个看了下参数介绍,应该不是很重要,于是重点关注QR_MASK_PATTERN。刚好手头的代码引用的是ZXing,这里要注意的是,ZXing的Hints是不能整个赋值的,只能用Add的方式逐个插入参数:

 1 public static Bitmap CreateQRCode(string data)
 2         {
 3             Bitmap bitmap = null;
 4             GC.Collect();
 5             BarcodeWriter barCodeWriter = new BarcodeWriter();
 6             barCodeWriter.Format = BarcodeFormat.QR_CODE; // 生成码的方式(这里设置的是二维码),有条形码\二维码\还有中间嵌入图片的二维码等
 7             //barCodeWriter.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");// 支持中文字符串
 8             barCodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
 9             barCodeWriter.Options.Hints.Add(EncodeHintType.QR_MASK_PATTERN, 2);
10             barCodeWriter.Options.Height = 200;
11             barCodeWriter.Options.Width = 200;
12             barCodeWriter.Options.Margin = 0; //设置的白边大小
13             ZXing.Common.BitMatrix bm = barCodeWriter.Encode(data);
14             bitmap = barCodeWriter.Write(bm);
15             return bitmap;
16         }

  果然,结果跟原图一样(外面的圈是我自己加的):

C# QRCode二维码的解析与生成

  问题已经解决了,但我还是有个疑惑,为什么我根据图案的Format Information得出的参数是不对的,于是我继续翻资料,终于在《[译] 为程序员写的Reed-Solomon码解释》这一篇里面看到了,是逆时针读的bit,wxxxx,最开始看的那一篇是顺时针标注的啊,那不就是反过来,仔细一看,读出来是00111,跟10101异或得10010,ECL是10-H,Mask是010-2,对上了。只能说,还是得多方考证吧。

  完结撒花。

 

  • 参考资料:

《【来龙去脉系列】QRCode二维码的生成细节和原理》 https://www.cnblogs.com/tuyile006/p/10916075.html

《二维码生成原理》 https://zhuanlan.zhihu.com/p/543574464

《[译] 为程序员写的Reed-Solomon码解释》 https://www.felix021.com/blog/read.php?2116

《C# 生成二维码方法(QRCoder)》 https://www.cnblogs.com/yakniu/p/16917897.html

《.NET Core(C#)使用ZXing.Net生成条码(Barcode)和二维码(QR code)图片及示例代码》 https://www.cnblogs.com/fireicesion/p/16809637.html

《C# 利用ZXing.Net来生成条形码和二维码》 https://blog.csdn.net/lwf3115841/article/details/128429605

  • 在线工具:

OSCHINA https://tool.oschina.net/qr

互联二维码 https://www.hlcode.cn/decode

草料二维码 https://cli.im/text

二维码工坊 https://www.2weima.com/?text=A0010101文章来源地址https://www.toymoban.com/news/detail-655545.html

到了这里,关于C# QRCode二维码的解析与生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • tki-qrcode插件二维码的生成

    1、全局安装tki-qrcode插件 2、查看下载插件后的版本信息 3、在页面中引入tki-qrcode 4、生成二维码整体代码 5、效果展示 此样式是平时黑色二维码样式,此为打过马赛克的二维码(不打马赛克博客无法展示图片,无奈(O~O) 注: 二维码中的内容可绑定链接和其他内容值 根据自

    2024年02月09日
    浏览(31)
  • 详解Python生成二维码插件QrCode的使用

    二维码(QR Code)是一种常见的矩阵型条码,被广泛用于扫码支付、产品标识、活动推广等领域。Python提供了许多第三方库用于生成和解析二维码,其中最常用的是qrcode库。本文将介绍如何使用qrcode库来生成二维码,并提供相应的代码示例和详细说明。 在开始之前,我们需要

    2024年02月16日
    浏览(39)
  • vue:生成二维码 qrcode、vue-qr(二维码中间可带logo)

    一、方法一 qrcode qrcode - npm 1.1、安装 yarn add qrcode 1.2、页面引入 1.3、方法里边使用  二维码url: ​​​​​​​  1.4、options 名称 类型 默认值 说明 errorCorrectionLevel String M 错误处理级别。可选值: low ,  medium ,  quartile ,  high  or  L ,  M ,  Q ,  H maskPattern Number 可选值: 0 , 

    2023年04月12日
    浏览(34)
  • 动态二维码生成器PHP Dynamic QRcode

    什么是 PHP Dynamic QRcode ? PHP Dynamic QRcode 是一个允许生成和保存动态和静态二维码( QR 码)的应用。它具有简洁、响应灵敏且用户友好的设计。其中包含您网站中可能需要的一般功能,如:记录管理( CRUD )、安全身份验证、分页、过滤器。 什么是 Dynamic Qr codes ? Dynamic Qr co

    2024年02月11日
    浏览(59)
  • Qrcode前端生成二维码,列表循环,可以下载分享,附加功能

    前言:          项目需求,原型列表要求展示二维码,然后后端那边因为某种原因没有给我返回这个参数,无奈只好前端自己来做,于是乎便有了下面的操作,这篇文章来整理下。         主要功能:                 1.生成二维码                 2.渲染列表        

    2024年02月03日
    浏览(49)
  • vue3 qrcode 生成二维码展示 亲测可用

    网上找的好多vue3 生成二维码代码都不能用,正确办法如下 安装 script template

    2024年02月09日
    浏览(27)
  • 微信小程序生成二维码(weapp-qrcode)

    插件 npm 地址:https://www.npmjs.com/package/weapp-qrcode 插件 GitHub 地址:https://github.com/yingye/weapp-qrcode/tree/master 一、引入 1、根据 GitHub 指引将 weapp-qrcode 放到本地 uitl 文件夹下; 2、创建 canvas 3、在 js 文件中引入 weapp-qrcode 以及使用; 这里是添加了 logo 的二维码;相关参数请参考

    2024年02月15日
    浏览(35)
  • 微信小程序生成二维码插件weapp-qrcode.js

    首先创建weapp-qrcode.js文件 然后复制一下内容到weapp-qrcode.js文件 然后在index.wxml文件写入 在index.js文件写入 效果如下:  

    2024年02月12日
    浏览(34)
  • JavaScript 中生成二维码,你可以使用第三方库,其中最流行和广泛使用的是 QRCode.js。以下是使用 QRCode.js 生成二维码的基本步骤:

    要在 JavaScript 中生成二维码,你可以使用第三方库,其中最流行和广泛使用的是 QRCode.js。以下是使用 QRCode.js 生成二维码的详细的步骤如下: 步骤 1: 引入 QRCode.js 库 首先,将 QRCode.js 库引入到你的 HTML 文件中。你可以从 CDN 上获取它: 步骤 2: 创建容器 在页面中创建一个容器

    2024年01月18日
    浏览(54)
  • 微信小程序生成二维码(weapp-qrcode)可添加logo

    插件 npm 地址:https://www.npmjs.com/package/weapp-qrcode 插件 GitHub 地址:https://github.com/yingye/weapp-qrcode/tree/master 一、引入 1、根据 GitHub 指引将 weapp-qrcode 放到本地 uitl 文件夹下; 2、创建 canvas 3、在 js 文件中引入 weapp-qrcode 以及使用; 这里是添加了 logo 的二维码;相关参数请参考

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包