基于ZXing.NET实现的二维码生成和识别客户端
一、前言
ZXing.Net的一个可移植软件包,是一个开源的、多格式的1D/2D条形码图像处理库,最初是用Java实现的。已经过大量优化和改进,它已经被手动移植。它与.Net 2.0、.Net 3.5、.Net 4.x、.Net 5.x、.Net 6.x、.Net 7.x、Windows RT类库和组件、UWP、.Net Standard 1.x和2.0x、.Net Core App 3.x、Silverlight 4、Silverlight 5、Windows Phone 7.x和Windows Phone 8.x以及Xamarin.Android兼容。
二、项目环境和搭建
项目框架:.NET Framework 4.6.1
项目依赖:ZXing.Net

项目结构和界面设计:

三、实现核心代码
ZXing帮助类
/// <summary>
/// ZXing.NET 二维码帮助类
/// </summary>
public class ZXingHelper
{
/// <summary>
/// 站点二维码的目录
/// </summary>
private static string QRCodeDirectory = "QRCode";
/// <summary>
/// 使用zxing动态库生成二维码
/// </summary>
/// <param name="conetnt">二维码内容</param>
/// <param name="errorMessage">异常信息</param>
/// <param name="logoPath">logo图片路径,默认为空。为空时生成的二维码不带logo</param>
/// <param name="height">二维码图片高度,默认240 单位 pixels</param>
/// <param name="width">二维码图片宽度,默认240 单位 pixels</param>
/// <param name="margin">二维码图片边距,默认为0</param>
/// <returns></returns>
public static Bitmap GenerateQRCode(string conetnt, out string errorMessage, string logoPath = "", int height = 240, int width = 240, int margin = 0)
{
errorMessage = string.Empty;
try
{
BarcodeWriter barCodeWriter = new BarcodeWriter();
barCodeWriter.Format = BarcodeFormat.QR_CODE;
barCodeWriter.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
barCodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
barCodeWriter.Options.Height = height;
barCodeWriter.Options.Width = width;
barCodeWriter.Options.Margin = margin;
BitMatrix bm = barCodeWriter.Encode(conetnt);
Bitmap qrCodeImage = barCodeWriter.Write(bm);
if (!string.IsNullOrEmpty(logoPath))
{
// 添加Logo
Bitmap logo = new Bitmap(logoPath);
int logoSize = (int)(qrCodeImage.Width * 0.2); // Logo大小为二维码大小的1/5
int logoX = (qrCodeImage.Width - logoSize) / 2;
int logoY = (qrCodeImage.Height - logoSize) / 2;
Graphics qrGraphics = Graphics.FromImage(qrCodeImage);
qrGraphics.DrawImage(logo, new Rectangle(logoX, logoY, logoSize, logoSize));
}
return qrCodeImage;
}
catch (Exception ex)
{
errorMessage = $"Exception raised when generating QRCode,, Exception;{ex}";
return null;
}
}
/// <summary>
/// 使用zxing动态库解析:二维码,条形码......
/// </summary>
/// <param name="image">二维码图像</param>
/// <returns></returns>
public static string ParseBarCode(Bitmap image)
{
BarcodeReader reader = new BarcodeReader();
Result result = reader.Decode(image);
return result.Text;
}
/// <summary>
/// 使用zxing动态库生成二维码
/// </summary>
/// <param name="conetnt">二维码内容</param>
/// <param name="logoPath">logo图片路径,默认为空。为空时生成的二维码不带logo</param>
/// <param name="height">二维码图片高度,默认240 单位 pixels</param>
/// <param name="width">二维码图片宽度,默认240 单位 pixels</param>
/// <param name="margin">二维码图片边距,默认为0</param>
/// <returns></returns>
public static void GenerateQRCode(string conetnt, string logoPath = "", int height = 240, int width = 240, int margin = 0)
{
try
{
BarcodeWriter barCodeWriter = new BarcodeWriter();
barCodeWriter.Format = BarcodeFormat.QR_CODE;
barCodeWriter.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
barCodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
barCodeWriter.Options.Height = height;
barCodeWriter.Options.Width = width;
barCodeWriter.Options.Margin = margin;
BitMatrix bm = barCodeWriter.Encode(conetnt);
Bitmap qrCodeImage = barCodeWriter.Write(bm);
if (!string.IsNullOrEmpty(logoPath))
{
// 添加Logo
Bitmap logo = new Bitmap(logoPath);
int logoSize = (int)(qrCodeImage.Width * 0.2); // Logo大小为二维码大小的1/5
int logoX = (qrCodeImage.Width - logoSize) / 2;
int logoY = (qrCodeImage.Height - logoSize) / 2;
Graphics qrGraphics = Graphics.FromImage(qrCodeImage);
qrGraphics.DrawImage(logo, new Rectangle(logoX, logoY, logoSize, logoSize));
}
string qrCodeFile = AppDomain.CurrentDomain.BaseDirectory + QRCodeDirectory + "/" + "qrcode.jpg";
if (File.Exists(qrCodeFile))
{
File.Delete(qrCodeFile);
}
qrCodeImage.Save(qrCodeFile, System.Drawing.Imaging.ImageFormat.Jpeg);//保存二维码图片
}
catch (Exception ex)
{
}
}
}
选择logo
/// <summary>
/// 选择logo
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_selectlogo_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);//初始路径为桌面
openFileDialog.Filter = "Logo图片|*.png;*.jpg;*.jpeg;*.ico";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
picLogo.Image = Image.FromFile(openFileDialog.FileName);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
生成二维码
/// <summary>
/// 生成二维码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_generate_Click(object sender, EventArgs e)
{
try
{
string errorMsg = "";
string content = rtbQRCodeContent.Text;
if (string.IsNullOrWhiteSpace(content))
{
MessageBox.Show("二维码内容不能为空!");
return;
}
picQRCode.Image = ZXingHelper.GenerateQRCode(content, out errorMsg);
if (!string.IsNullOrWhiteSpace(errorMsg))
{
MessageBox.Show(errorMsg);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
识别二维码
/// <summary>
/// 识别二维码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_identityQrCode_Click(object sender, EventArgs e)
{
try
{
if (picQRCode.Image == null)
{
MessageBox.Show("请先生成二维码!");
return;
}
Bitmap Imagemap = new Bitmap(picQRCode.Image);
string QRCodeResult = ZXingHelper.ParseBarCode(Imagemap);
rtbQRCodeResult.Text = QRCodeResult;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
保存二维码
/// <summary>
/// 保存二维码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_save_Click(object sender, EventArgs e)
{
try
{
if (picQRCode.Image == null)
{
MessageBox.Show("请先生成二维码!");
return;
}
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "保存图片|*.png;*.jpg;*.jpeg";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
picQRCode.Image.Save(saveFileDialog.FileName, ImageFormat.Png);
MessageBox.Show("保存成功!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
四、实现演示
五、源码工具获取
关注公众号,后台回复关键字:二维码工具
基于ZXing.NET实现的二维码生成和识别客户端的更多相关文章
- Python 实现二维码生成和识别
今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...
- Android 二维码 生成和识别(附Demo源码)
今天讲一下目前移动领域很常用的技术——二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS. Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技 ...
- Android 二维码 生成和识别(转)
原博客地址 :http://www.cnblogs.com/weixing/archive/2013/08/28/3287120.html 还有几个写的也可以参考一下:http://www.itnos ...
- 玩转Android之二维码生成与识别
二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...
- 【转】Android 二维码 生成和识别(附Demo源码)--不错
原文网址:http://www.cnblogs.com/mythou/p/3280023.html 今天讲一下目前移动领域很常用的技术——二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS. ...
- python qrcode二维码生成与识别
二维码 二维码生成 1.用法 https://github.com/lincolnloop/python-qrcode 2.使用 简单实用 import qrcode # 二维码内容 data = & ...
- iOS二维码生成与识别
在 IOS7 以前,在IOS中实现二维码和条形码扫描,有两大开源组件 ZBar 与 ZXing. 总结下各自的缺点: ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 & ...
- iOS二维码生成、识别、扫描等
二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...
- java利用Google Zxing实现 二维码生成与解析
1.引入zxing 2.使用下面两个类:QRCodeUtil.java和BufferedImageLuminanceSource.java 3.新建单元测试类 复制下面测试代码即可. 1.pom文件中 ...
- java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
随机推荐
- 好的,以下是我为您拟定的自然语言处理(NLP)领域的100篇热门博客文章标题,以逻辑清晰、结构紧凑、简单易懂的
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 1. 机器翻译 2. 文本分类 3. 情感分析 5. 优化与改进 6. 结论与展望 好的,以下是我为您拟定的 ...
- 我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater
我们现在使用SpringBoot 做Web 开发已经比之前SprngMvc 那一套强大很多了. 但是 用SpringBoot Web 做API 开发还是不够简洁有一些. 每次Web API常用功能都需 ...
- MAUI Blazor 加载本地图片的解决方案
前言 为了解决MAUI Blazor无法加载本地图片,https://github.com/dotnet/maui/issues/2907,所以写了这篇文章. 有token大佬珠玉在前,https:/ ...
- zabbix 添加 zabbix_agentd 服务
创建服务文件 # /usr/lib/systemd/system/zabbix-agent.service [Unit] Description=Zabbix Agent After=syslog.t ...
- 用Claude-2-100K复刻了胡锡进老师的写作风格
大家好,我是老章 最近玩心大发,用Claude-2-100K复刻了胡锡进老师的写作风格,然后用这个风格点评世间万物. 蛮有意思的,直接看效果吧: 怎么实现的呢?老章不喜欢废话,极简介绍一下步骤. 第一 ...
- 解密Prompt系列12. LLM Agent零微调范式 ReAct & Self Ask
前三章我们分别介绍了思维链的使用,原理和在小模型上的使用.这一章我们正式进入应用层面,聊聊如何把思维链和工具使用结合得到人工智能代理. 要回答我们为什么需要AI代理?代理可以解决哪些问题?可以有以下两 ...
- 关于python pycharm中输出的内容不全的解决办法
import pandas as pd #设置显示的最大列.宽等参数,消除打印不完全中间的省略号 pd.set_option("display.width",1000) #加了这一 ...
- 双URL编码绕过WAF
一般编码一次是%5c. 但攻击者怕这个会被认出来,所以用二次编码,把%本身编码成%25.再和后边拼成%255c. 如果URL解码器有缺陷,只不断重复"从前边开始解析"这个步骤,就会 ...
- proxysql修改默认系统配置
前言 proxysql在第一次启动后,配置就从sqlite db中加载了,而不是配置文件. 有时候我们需要修改proxysql的默认配置,其相关配置在main.global_variables表中,可 ...
- 【Nacos篇】Nacos基本操作及配置
官方文档:https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html 前置条件:SpringCloud脚手架 单机模 ...