最稳路径是用 ZXing.Net 的 BarcodeWriter 写入 Bitmap 后保存为 PNG,需设 Format 和 UTF-8 EncodingOptions(中文必用 QR_CODE),确保纯白背景、条宽≥2px、用 PNG 无损导出,并在 ASP.NET Core 中用 MemoryStream + FileStreamResult 正确返回流。

用 BarcodeWriter 生成 PNG 条形码最稳
直接用 BarcodeWriter(来自 ZXing.Net)写入 Bitmap 再保存为 PNG,是 C# 里最不容易出错的路径。它不依赖 GDI+ 渲染上下文,也不挑 .NET 版本,.NET 5+ 和 .NET Framework 4.7.2+ 都能跑。
常见错误是误用 MultiFormatWriter 直接吐字节数组——它只返回原始位图数据(无文件头),直接写盘会打不开;还有人用 WinForms.Bitmap 在无界面服务中创建,结果抛 System.ArgumentException: Parameter is not valid。
- 必须安装
ZXing.NetNuGet 包(注意不是ZXing,那个是 Java 移植版,C# 用它容易编码错乱) -
BarcodeWriter的Format属性要设成BarcodeFormat.CODE_128或BarcodeFormat.QR_CODE,别漏设 - 输出尺寸靠
Options.Width/Options.Height控制,不是靠缩放Bitmap,否则边缘发虚
中文内容生成条形码报 NotFoundException 怎么办
这不是识别问题,是生成时编码没对上。默认 CODE_128 不支持中文,强行传进去会静默截断或乱码,后续扫码自然失败。
真正能带中文的常用格式只有 QR_CODE,且必须显式指定字符集:
- 用
EncodingOptions设置CharacterSet = "UTF-8" - 别信“自动识别”——
QR_CODE默认用 ISO-8859-1,中文直接变 - 如果非要用线性码(如
CODE_128),只能先 Base64 编码原文再生成,扫码端再解,但体积增大 30% 以上
示例关键行:
var writer = new BarcodeWriter { Format = BarcodeFormat.QR_CODE, Options = new EncodingOptions { CharacterSet = "UTF-8", Width = 300, Height = 300 } };
生成的条形码扫不出来?检查这三处硬伤
90% 的“扫不出”和算法无关,是图像质量掉坑里了。
- 背景不是纯白:哪怕带一像素灰边(#FEFEFE),某些扫码引擎就拒识;务必用
Color.White填充画布 - 条宽小于 2 像素:
Width=100+Content="123"可能导致单条只有 1px,放大看是虚线;建议最小设Width=200 - 导出用
Image.Save(..., ImageFormat.Jpeg):JPEG 有压缩噪点,条与空边界模糊;死守Png
在 ASP.NET Core API 里生成并返回条形码流
别碰 HttpResponse.OutputStream,也别建临时文件——用 MemoryStream + FileResult 最干净。
容易踩的坑是忘了设 ContentType,浏览器当文本打开就全乱了;还有人用 ToArray() 提前释放流,返回空图。
- 用
new MemoryStream()接住Bitmap.Save(),别用 using 包裹流 - 返回类型选
FileStreamResult,ContentType必须是"image/png" - 别调
stream.Position = 0后又忘了重置——FileStreamResult会自己 seek,手动反而报ObjectDisposedException
这事的关键不在生成逻辑,而在流生命周期管得够不够细。稍微松一点,前端拿到的就是 0 字节。











