0

0

c# 如何生成二维码

煙雲

煙雲

发布时间:2026-01-20 05:35:33

|

685人浏览过

|

来源于php中文网

原创

zxing.net 是 c# 中最稳定、兼容性好、文档全的二维码生成方案,支持 .net framework 4.5+ 及 .net core 3.1+ 以上全平台,推荐通过 nuget 安装并配置 barcodewriter 与 qrcodeencodingoptions(含 utf-8、高容错、合理尺寸与边距),注意空输入校验、资源释放、ui 线程安全及文件保存健壮性。

c# 如何生成二维码

ZXing.NET 是目前 C# 中最稳定、兼容性最好、文档最全的二维码生成方案,推荐直接用它,别折腾老库(如 ThoughtWorks.QRCode)或已停更的封装。它支持 .NET Framework 4.5+、.NET Core 3.1+ 和 .NET 5/6/7/8,WinForms、WPF、ASP.NET Core 全能跑。


安装 ZXing.NET 并初始化写入器

不手动下载 DLL,也不拖引用——用 NuGet 命令一行搞定:

dotnet add package ZXing.Net

或在 Visual Studio 包管理器控制台运行:

Install-Package ZXing.Net

然后在代码中引入命名空间:

using ZXing;
using ZXing.Common;
using ZXing.QrCode;

关键点:

  • BarcodeWriter 是生成入口,必须指定 Format = BarcodeFormat.QR_CODE
  • 必须显式配置 QrCodeEncodingOptions,否则中文乱码、尺寸失控、容错低
  • 别漏掉 options.CharacterSet = "UTF-8",否则 TextBox 输入中文会变问号或报错

生成带中文内容的二维码(含防空校验)

常见错误:用户没输内容就点“生成”,writer.Write("") 直接抛 ArgumentNullException

正确做法是加一层判断,并设置默认占位符:

private Bitmap GenerateQrCode(string content)
{
    if (string.IsNullOrWhiteSpace(content))
        content = "QR_EMPTY";
<pre class='brush:php;toolbar:false;'>var writer = new BarcodeWriter
{
    Format = BarcodeFormat.QR_CODE,
    Options = new QrCodeEncodingOptions
    {
        DisableECI = true,
        CharacterSet = "UTF-8",
        Width = 300,
        Height = 300,
        Margin = 2,
        ErrorCorrection = ErrorCorrectionLevel.H // 高容错,推荐 M 或 H
    }
};
return writer.Write(content);

}

说明:

生成微信联系人二维码
生成微信联系人二维码

生成微信联系人二维码

下载
  • ErrorCorrectionLevel.H 比默认的 M 更抗划伤/污损,适合打印场景
  • Margin = 2 表示白边宽度(单位:模块数),太小(如 0)会导致扫码器无法识别
  • 尺寸 Width/Height 建议设为 200~400,再小易糊,再大无意义(手机摄像头解析力有限)

保存为 PNG 文件并防止文件冲突

直接 bitmap.Save("xxx.png") 很危险:并发请求、重复点击、路径不存在都会崩。

安全写法要包含三件事:目录创建 + 唯一文件名 + 异常后释放资源:

public string SaveQrCode(Bitmap bitmap, string folderPath, string fileName = null)
{
    var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, folderPath);
    Directory.CreateDirectory(dir);
<pre class='brush:php;toolbar:false;'>fileName ??= $"qrcode_{DateTime.Now:yyyyMMddHHmmssfff}.png";
var fullPath = Path.Combine(dir, fileName);

try
{
    bitmap.Save(fullPath, ImageFormat.Png);
    return fullPath;
}
catch (Exception ex)
{
    throw new InvalidOperationException($"保存二维码失败: {ex.Message}", ex);
}
finally
{
    bitmap?.Dispose(); // 必须释放,否则内存泄漏
}

}

注意:

  • 不要用 AppDomain.CurrentDomain.BaseDirectory 在 ASP.NET Core 中——改用 IWebHostEnvironment.WebRootPath
  • 文件名里加毫秒级时间戳(fff)可基本避免重名,无需 GUID
  • WinForms 中若直接赋给 PictureBox.Image,记得先 Dispose() 旧图,否则 GDI 句柄耗尽

WinForms 点击按钮生成并显示到 PictureBox

这是最典型场景,但新手常卡在两处:图片不显示、界面卡死(因没走 UI 线程)。

完整事件处理逻辑如下:

private void btnGenerate_Click(object sender, EventArgs e)
{
    var text = textBoxInput.Text.Trim();
    if (string.IsNullOrEmpty(text))
    {
        MessageBox.Show("请输入内容", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }
<pre class='brush:php;toolbar:false;'>try
{
    var qrBitmap = GenerateQrCode(text);
    // WinForms 必须在 UI 线程设置 Image
    pictureBox1.Invoke((MethodInvoker)delegate
    {
        pictureBox1.Image?.Dispose();
        pictureBox1.Image = qrBitmap;
    });
}
catch (Exception ex)
{
    MessageBox.Show($"生成失败:{ex.Message}");
}

}

关键提醒:

  • 永远不要在非 UI 线程直接操作控件(比如后台线程调 pictureBox1.Image = ...
  • pictureBox1.Image 赋值前不 Dispose() 旧图,多次点击后内存暴涨、程序变慢
  • 如果后续要打印,别用 PictureBox.Image 原图——它可能被缩放失真,应另存高清源图再送打印

生成二维码本身不难,难的是让每一处边界条件都稳住:空输入、中文、高并发、UI 线程、资源释放、跨平台路径。这些细节堆起来,才是生产可用的代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

887

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

461

2024.06.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

466

2023.12.18

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号