You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms生成打印的条码无法被扫描器识别问题求助

解决C# WinForms生成条码无法被扫描的问题

我之前也踩过用字体生成条码的坑,扫描器识别不了大多是因为GDI+文本渲染的精度问题——专业条码软件(比如Bartender)会严格遵循条码的宽度比例规范,而普通字体绘制很容易因为抗锯齿、像素对齐等细节导致条码不符合标准。下面给你几个可行的解决方案:

方案一:改用专业条码生成库(最推荐)

别再用字体画条码了,直接用开源的ZXing.Net库,它能严格生成符合标准的条码,扫描器肯定能识别。步骤如下:

  1. 先通过NuGet安装ZXing.Net:Install-Package ZXing.Net
  2. 替换你原来的Bitmap生成代码,示例如下:
private void txtPprice_TextChanged(object sender, EventArgs e)
{
    string barcode = txtCode.Text;
    string price = txtPprice.Text;
    string pname = txtPname.Text;

    // 用ZXing生成Code39条码(自带校验逻辑,不需要手动加*)
    var writer = new BarcodeWriterPixelData
    {
        Format = BarcodeFormat.CODE_39,
        Options = new ZXing.Common.EncodingOptions
        {
            Height = 60, // 条码高度
            Width = barcode.Length * 20, // 宽度适配内容长度
            Margin = 10,
            PureBarcode = false // 是否显示条码下方的文本
        }
    };
    var pixelData = writer.Write(barcode);

    // 将像素数据转换为Bitmap
    using (var bitm = new Bitmap(pixelData.Width, pixelData.Height))
    {
        var bitmapData = bitm.LockBits(
            new Rectangle(0, 0, pixelData.Width, pixelData.Height),
            System.Drawing.Imaging.ImageLockMode.WriteOnly,
            PixelFormat.Format32bppRgb);
        System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
        bitm.UnlockBits(bitmapData);

        // 绘制额外的文本(品名、价格)
        using (Graphics graphic = Graphics.FromImage(bitm))
        {
            Font textFont = new Font("Arial Black", 8);
            SolidBrush blackBrush = new SolidBrush(Color.Black);
            // 绘制品名
            graphic.DrawString(pname, textFont, blackBrush, new PointF(10, 70));
            // 绘制价格
            graphic.DrawString($"{price} L.E.", textFont, blackBrush, new PointF(bitm.Width / 2, 70));
        }

        // 显示到PictureBox
        pictureBox1.Image = new Bitmap(bitm);
        pictureBox1.Size = bitm.Size;
    }
}

方案二:如果坚持用字体绘制,调整渲染参数

如果一定要用字体,必须强制关闭文本渲染的抗锯齿,确保条码的条/空宽度严格符合标准:

在你的Graphics初始化后添加这行代码:

graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;

同时注意:

  • 确保使用的条码字体是符合官方规范的版本(比如IDAutomationHC39M要确保是正版或正确授权的,有些免费字体可能存在比例错误)
  • 条码的实际打印尺寸不能太小,Code39的最小条宽建议不小于0.1mm,打印时选择300DPI以上的分辨率
  • 不要对生成的Bitmap进行缩放,避免拉伸变形

为什么Bartender可以识别?

专业条码软件会直接根据条码标准计算每个条和空的像素宽度,完全不依赖系统字体渲染,所以生成的条码精度极高,符合扫描器的识别要求。而用字体绘制本质是把条码当成文本渲染,很容易出现细微的比例偏差——这些偏差人眼看不到,但扫描器的解码算法会直接判定为无效条码。

内容的提问来源于stack exchange,提问作者Joey Arnanzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:28