C# 生成二维码方法 C#如何创建QR Code图片

来源:这里教程网 时间:2026-02-21 17:41:02 作者:

QRCoder
库最直接,NuGet 安装后三行代码就能出图

不用自己实现 Reed-Solomon 编码或掩码逻辑,

QRCoder
是目前 C# 生态中最轻量、维护活跃、且输出稳定的开源库。它不依赖 System.Drawing(避免 Linux 上的 GDI+ 问题),默认输出
Bitmap
或可选
SVG
/
PNG
字节数组。

安装命令:

dotnet add package QRCoder

基础用法示例:

var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.Q);
var qrCode = new PngByteQRCode(qrData);
byte[] pngBytes = qrCode.GetGraphic(20); // 每模块20像素,输出PNG字节数组
GetGraphic(20)
的参数是「每个二维码模块(module)对应的像素数」,不是总宽高;设太小会糊,设太大可能溢出内存(尤其含中文时)
中文内容需确保编码为 UTF-8 ——
CreateQrCode
默认处理,但若传入 byte[] 要自己保证
若目标是 Web API 返回图片,直接用
File(pngBytes, "image/png")
即可,无需额外保存文件

想自定义颜色、加 logo 或调整容错等级?用
QRCodeGenerator.Options

默认白底黑码太单调,但

QRCoder
原生不支持着色或嵌入 logo;得靠后续图像处理。不过容错等级、编码模式、最小版本等关键参数必须在生成前指定。

例如提高容错并强制 UTF-8 编码:

var options = new QRCodeGenerator.Options
{
    ECCLevel = QRCodeGenerator.ECCLevel.H, // 最高容错(30% 损毁仍可读)
    EncodingHint = QRCodeGenerator.EncodingHint.UTF8,
    Version = 1 // 强制最小版本(仅当内容极短时有用)
};
var qrData = qrGenerator.CreateQrCode("你好", options);
ECCLevel.L
(7%)适合静态张贴;
H
适合手机扫码场景,但二维码会变大
Version
手动设太小会导致
ArgumentException: Data too long
,让库自动选择更安全
要加 logo?得用
System.Drawing
SixLabors.ImageSharp
把生成的
Bitmap
再加工 —— 注意别盖住定位图案(三个角上的「回」字)

部署到 Linux 容器时报
System.Drawing.Common
错误?换
ImageSharp
渲染路径

QRCoder
BitmapByteQRCode
类内部用了
System.Drawing
,.NET 6+ 在非 Windows 上默认禁用该组件,会抛
PlatformNotSupportedException

解法:跳过 Bitmap,改用纯内存 PNG 渲染器:

var qrCode = new PngByteQRCode(qrData); // ✅ 不依赖 System.Drawing
byte[] pngBytes = qrCode.GetGraphic(15);
只要不用
BitmapQRCode
BitmapByteQRCode
,就完全规避 GDI+ 问题
如果非要用
ImageSharp
自定义样式(比如圆角模块、渐变色),先用
PngByteQRCode
拿到原始 PNG 字节,再用
Image.Load()
解析加工
别在 ASP.NET Core 中调用
Graphics.FromImage
—— 即使加了
System.Drawing.Common
包,容器里也大概率崩溃

生成速度慢或内存暴涨?检查内容长度和模块尺寸

二维码体积与数据长度、ECC 等级、模块尺寸呈指数关系。一个 500 字符的 JSON 字符串 +

ECCLevel.H
+
GetGraphic(50)
可能生成 10MB+ 的 PNG。

普通 URL 建议模块尺寸 ≤ 25;含中文或 Base64 数据时,优先降
ECCLevel
M
Q
qrData.ModuleMatrix
可提前拿到二维 bool 数组,自己估算渲染后大小(宽高 = 矩阵边长 × 模块尺寸)
高频调用场景(如订单页批量生成),把
QRCodeGenerator
实例复用,不要每次 new

真正卡住的地方往往不是“怎么画”,而是没意识到二维码本质是「数据密度 × 渲染精度」的乘积——控制好这两头,比换库更管用。

相关推荐