barcodelib生成条形码失败主因有三:输入非法(如中文、长度不符)、尺寸过小致位图创建失败、误用其不支持的二维码。需严格校验编码规则、设合理宽高、手动填白底、用png保存,并避免内存泄漏与版本冲突。
barcodelib 生成条形码图片失败,常见报错是 system.argumentexception: parameter is not valid.
这基本是传了非法字符、空字符串,或尺寸参数太小导致位图创建失败。barcodelib 对输入字符很敏感:比如 code128 不支持中文,ean13 必须是 12 位数字(自动补校验位),少一位或多一位都直接抛这个异常。
实操建议:
- 先用
BarcodeLib.BarcodeEncoding.Code128时,确保输入只含数字、大写字母、符号(如"0123456789ABC"),禁用空格、中文、小写字母 -
EAN13/UPCA类编码必须严格校验长度:new Barcode().Encode(BarcodeEncoding.EAN13, "123456789012")—— 这里是 12 位,库会自动算第 13 位校验码;输 13 位反而报错 - 避免用
width=1或height=1,最小推荐设为width=200、height=80,否则Bitmap构造器因像素面积为 0 而崩
保存为 PNG 时出现透明背景变黑,或文字模糊
BarcodeLib 默认输出的是 32 位 ARGB 位图,但没显式设置背景色,Bitmap.Save() 写 PNG 时 Alpha 通道可能被某些查看器误读,看起来像黑底;文字模糊则多因缩放渲染导致,不是抗锯齿开关问题。
实操建议:
- 生成后手动填充白底:
using (var bmp = barcode.Encode(...)) { using (var g = Graphics.FromImage(bmp)) { g.Clear(Color.White); } } - 保存前关闭插值模式:
g.InterpolationMode = InterpolationMode.NearestNeighbor;,防止拉伸失真 - 别用
bmp.Save("x.jpg")——JPEG 不支持透明,且有损压缩会让条纹粘连;坚持用.png
在 ASP.NET Core Web API 中返回条形码图片,内存泄漏风险高
每次请求都 new Barcode() + new Bitmap() + Save() 到 MemoryStream,但没及时 dispose Bitmap 和 Graphics,GC 来不及回收 GDI 句柄,跑几小时就 OutOfMemoryException。
实操建议:
- 所有
Bitmap、Graphics必须用using包裹,哪怕只用一行 - 别把
Barcode实例缓存成静态单例——它不是线程安全的;每次请求 new 一个干净实例更稳 - 返回
FileStreamResult前,确保MemoryStreamposition 回到 0,否则前端收到空图
BarcodeLib 不支持 QR Code,别硬套 Code128 参数去试
很多人搜“C# 条形码”顺手装了 BarcodeLib,结果发现扫不出二维码,再查文档才看到它压根不支持 QRCode、DataMatrix 等二维码。这不是配置问题,是库能力边界。
实操建议:
- 确认需求:一维码(
Code39、EAN13)用 BarcodeLib 没问题;要二维码,换QRCoder或ZXing.Net - 别试图用
BarcodeEncoding.Custom模拟 QR —— 没定义行为,运行时可能静默失败 - 如果项目已混用多个条码库,注意
System.Drawing.Common版本冲突,.NET 6+ 需显式加<packagereference include="System.Drawing.Common" version="6.0.0"></packagereference>
事情说清了就结束。最常被忽略的是:EAN13 输入长度校验、PNG 白底填充、以及 BarcodeLib 根本不碰二维码这件事。











