用ZXing.Net生成二维码需三步:设BarcodeFormat.QR_CODE、EncodingOptions中指定CharacterSet="UTF-8"、用BarcodeWriter.Write返回Bitmap后正确保存或传输;跨平台需引用System.Drawing.Common并确保原生图像库支持。
用 ZXing.Net 生成二维码图片,核心就三步
不是所有 nuget 包都能直接画图;zxing.net 本身不带图像输出能力,必须配合 bitmap 或其他图像类型手动渲染。很多人卡在“调了 encode 却没图”,其实是漏了这层转换。
- 安装
ZXing.Net:用NuGet安装ZXing.Net(注意不是旧版ZXing) - 选编码器:
BarcodeWriter是最简封装,内部自动选Bitmap输出,比手写MultiFormatWriter+BitMatrix更少出错 - 设置格式:
Format必须设为BarcodeFormat.QR_CODE,否则默认可能走条形码逻辑
BarcodeWriter.Write 返回的 Bitmap 怎么保存或显示
返回值是 Bitmap,但 .NET 6+ 的 System.Drawing 在 Linux/macOS 默认不可用,容易抛 System.TypeInitializationException 或提示 GDI+ 不可用。
- Windows 开发可直接调
bitmap.Save("qrcode.png", ImageFormat.Png) - 跨平台项目必须加
,且运行时需确保有原生图像库(如 Linux 装libgdiplus) - Web 场景别直接返回
Bitmap,用MemoryStream转成字节数组再写入响应流,避免资源泄漏
中文内容乱码?检查 EncodingOptions 的 CharacterSet
默认不设字符集,ZXing 会按 ISO-8859-1 编码,中文直接变问号或方块。这不是字体问题,是编码协议层错了。
- 必须显式设置
CharacterSet = "UTF-8" -
Width和Height建议设为 200–400 之间;太小导致纠错失败,太大无意义且文件体积激增 - 纠错等级用
ErrorCorrectionLevel.L(默认)够日常;要容污损才升到M或Q,但容量会下降
var writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new EncodingOptions
{
Width = 300,
Height = 300,
CharacterSet = "UTF-8",
ErrorCorrection = ErrorCorrectionLevel.M
}
};
var bitmap = writer.Write("你好,世界");
为什么生成的二维码扫不出来?重点查这三点
不是算法问题,绝大多数是输入、配置或环境链路断了。
- 原始字符串含不可见控制符(比如粘贴时带换行或 BOM),用
input.Trim()再编码 - 输出
Bitmap后没释放,下次写同一路径被锁住,报IOException—— 记得using (var bmp = writer.Write(...)) { ... } - Web API 中返回 PNG 但没设
Content-Type: image/png,浏览器当文本渲染,看起来像乱码
真正麻烦的是嵌入 logo 的场景:裁剪中心区域后重绘,必须保证留白足够、比例不压扁,否则扫码率断崖下跌。这种需求建议先用纯二维码验证流程,再叠加图形操作。











