在C#开发中,二维码的生成与扫描是常见的功能需求,QRCoder作为纯C#实现的二维码库,无需依赖第三方原生组件,兼容.NET Framework和.NET Core/.NET 5+等多个运行时,是开发者实现相关功能的首选工具。本文将完整讲解从库引入到功能落地的全流程。

环境准备与库引入
首先需要在项目中引入QRCoder库,如果你使用的是Visual Studio,可以通过NuGet包管理器搜索QRCoder安装,也可以通过命令行执行以下命令:
// 使用NuGet命令行安装QRCoder Install-Package QRCoder
安装完成后,在需要使用的代码文件中引入对应命名空间即可:
using QRCoder; using System.Drawing; // 如果使用生成图片功能需要引入该命名空间
使用QRCoder生成二维码
QRCoder生成二维码的核心逻辑是创建QRCodeGenerator实例,设置二维码参数后生成数据,再通过QRCode类转换为图片。以下是基础生成示例:
public Bitmap GenerateQRCode(string content, int pixelsPerModule = 20)
{
// 创建二维码生成器实例
using (QRCodeGenerator generator = new QRCodeGenerator())
{
// 设置二维码参数:内容、纠错等级、编码模式等
QRCodeData qrData = generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.Q);
// 创建二维码实例,传入生成的数据
using (QRCode qrCode = new QRCode(qrData))
{
// 生成二维码图片,设置每个模块的像素大小,背景和前景色
Bitmap qrImage = qrCode.GetGraphic(pixelsPerModule, Color.Black, Color.White, true);
return qrImage;
}
}
}
上述代码中,ECCLevel.Q表示中等纠错等级,可根据需求调整为L(低)、M(中)、Q(中高)、H(高),纠错等级越高,二维码被遮挡后仍能识别的概率越大,但相同内容下二维码密度会更高。
生成带Logo的二维码
如果需要给二维码添加中心Logo,可以在生成基础二维码后,将Logo图片绘制到二维码中心位置:
public Bitmap GenerateQRCodeWithLogo(string content, Image logo, int pixelsPerModule = 20)
{
using (QRCodeGenerator generator = new QRCodeGenerator())
{
QRCodeData qrData = generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.Q);
using (QRCode qrCode = new QRCode(qrData))
{
// 先生成基础二维码
Bitmap qrImage = qrCode.GetGraphic(pixelsPerModule, Color.Black, Color.White, true);
// 计算Logo绘制位置,放在中心,大小为二维码的1/5
int logoWidth = qrImage.Width / 5;
int logoHeight = qrImage.Height / 5;
int logoX = (qrImage.Width - logoWidth) / 2;
int logoY = (qrImage.Height - logoHeight) / 2;
// 绘制Logo,注意Logo不要太大避免遮挡二维码关键区域
using (Graphics g = Graphics.FromImage(qrImage))
{
g.DrawImage(logo, new Rectangle(logoX, logoY, logoWidth, logoHeight));
}
return qrImage;
}
}
}
C#实现二维码扫描功能
QRCoder本身仅支持二维码生成,扫描功能需要结合其他组件实现,常见的方案是配合ZXing.Net库完成二维码识别。首先同样通过NuGet安装ZXing.Net:
Install-Package ZXing.Net
安装完成后,实现二维码扫描的核心代码如下:
using ZXing;
public string ScanQRCode(Image qrImage)
{
// 创建条形码读取器实例,支持二维码格式
using (BarcodeReader reader = new BarcodeReader())
{
// 设置读取格式,只识别二维码
reader.Options.PossibleFormats = new List<BarcodeFormat> { BarcodeFormat.QR_CODE };
// 尝试解码图片中的二维码
Result result = reader.Decode((Bitmap)qrImage);
if (result != null)
{
return result.Text; // 返回二维码存储的内容
}
return string.Empty; // 未识别到返回空字符串
}
}
如果是桌面应用需要调用摄像头扫描,可以结合AForge.Video库获取摄像头帧,再将每一帧图片传入上述扫描方法,识别到结果后停止捕获即可。
常见问题与注意事项
- 生成二维码时如果内容包含中文,需要确保编码正确,QRCoder默认使用UTF-8编码,大部分场景无需额外处理,若遇到乱码可手动指定编码为UTF-8。
- 二维码扫描时如果图片模糊、光线过暗,识别成功率会下降,可在预处理阶段对图片进行灰度化、二值化等操作提升识别率。
- 生成带Logo的二维码时,Logo面积建议不超过二维码总面积的30%,否则容易导致二维码无法正常识别。
- 如果是Web项目生成二维码,可以将生成的Bitmap转换为Base64字符串返回给前端展示,无需保存本地文件。
总结
通过QRCoder和ZXing.Net的组合,C#开发者可以快速实现完整的二维码生成与扫描功能,两个库都是纯托管代码实现,无需依赖系统原生组件,跨平台兼容性良好。实际开发中可根据业务需求调整二维码的样式、纠错等级,以及扫描的预处理逻辑,满足不同场景的使用要求。