ZXing.Net生成二维码必须显式设置EncodingOptions的Width、Height和CharacterSet="UTF-8",否则返回空图或中文乱码;需引用ZXing.Bitmap包并用BarcodeWriter.Write()直接获取Bitmap,避免类型错误。

用 ZXing.Net 生成二维码图片必须加 Bitmap 转换步骤
ZXing.Net 的 BarcodeWriter 默认不直接返回 Bitmap,它输出的是 BitmapLuminanceSource 兼容的像素数组或 WriteableBitmap(WPF)——但 WinForms 或通用控制台项目里,你得手动转成 Bitmap 才能保存或显示。漏掉这步会卡在“生成了但看不到图”。
实操建议:
-
BarcodeWriter的Write()方法返回的是Bitmap(需设置Options = new EncodingOptions { Width = 300, Height = 300 }),但前提是你要引用ZXing.QrCode和ZXing.Bitmap子包(不是只装ZXing.Net主包) - 如果用的是 .NET 6+ 且项目 SDK 风格为
<Project Sdk="Microsoft.NET.Sdk">,记得在.csproj中显式添加<PackageReference Include="ZXing.Net" Version="1.0.0" />—— 旧版 NuGet 可能拉到不带 Bitmap 支持的精简版 - 常见错误:调用
writer.Write("hello")后直接.Save("qrcode.png")报错Method not found: 'System.Drawing.Bitmap...,本质是类型不匹配,此时应确认是否用了ZXing.Bitmap扩展方法.ToBitmap()
识别二维码时 Bitmap 必须是 24/32 位真彩色,灰度图会失败
很多人用 Bitmap.FromFile() 加载截图或微信导出的二维码,结果 BarcodeReader.Decode() 返回 null。不是算法问题,而是图像格式踩坑:ZXing 的默认 RGBLuminanceSource 只接受 24bpp 或 32bpp 的 Bitmap,而某些截图工具、手机相册导出的 PNG 是 8bpp 索引色或带 Alpha 通道但未正确处理的 32bpp。
实操建议:
- 加载后强制转换:用
new Bitmap(original, original.Size)创建新位图,再Graphics.DrawImage()绘制过去,可确保位深度归一 - 更稳妥的做法是用
ZXing.Bitmap.Extensions.ToBitmap()(来自ZXing.Bitmap包)替代原生Bitmap构造,它内部做了格式标准化 - 调试时加一行
Console.WriteLine($"BPP: {bitmap.PixelFormat}");,看到Format8bppIndexed就得重绘
BarcodeReader.Options.TryHarder = true 不是万能的,要配合旋转和多尺度扫描
倾斜、模糊、低对比度的二维码常 decode 失败,光设 TryHarder = true 没用。ZXing 默认只按原始方向扫一次,而真实场景中二维码可能被旋转 15°、缩放 70%、边缘有阴影。
实操建议:
- 对输入
Bitmap预处理:用RotateFlipType.Rotate90FlipNone试 0°/90°/180°/270° 四个方向(别全角度遍历,性能爆炸) - 缩放多尺度:把图片等比缩放到 0.8x、1.0x、1.2x 三档再分别 decode,比单次
TryHarder更有效 -
Options.PureBarcode = false必须设为false(默认值),否则它会跳过非纯白底黑码的图,比如带 logo 的二维码就直接放弃
中文内容生成二维码必须指定 EncodingOptions.CharacterSet = "UTF-8"
不设字符集时,ZXing 默认用 ISO-8859-1 编码,中文会变成乱码或扫码失败。这不是“生成了但扫不出”,而是生成的二维码本身编码错了。
实操建议:
-
EncodingOptions必须显式构造并赋值:new EncodingOptions { CharacterSet = "UTF-8", Width = 300, Height = 300 } - 不要依赖
new QrCodeEncodingOptions()—— 这个类在旧版 ZXing 中不存在,新版已统一为EncodingOptions - 如果扫码 App 显示方块或问号,优先检查这个字段,而不是怀疑手机或光线
最易被忽略的一点:ZXing.Net 在 .NET Core/.NET 5+ 上默认不支持 System.Drawing,若项目没启用 System.Drawing.Common(Windows 平台默认可用,Linux/macOS 需额外安装 libgdiplus),Bitmap 相关操作会在运行时报 PlatformNotSupportedException。这时候不是代码写错了,是环境缺依赖。


















