分享C#生成 Code39(extend)条形码 code128条形码 代码实例

作者:袖梨 2022-06-25

C#生成Code39(extend)条形码实例

Code39是条形码的一种。由于编制简单、能够对任意长度的数据进行编码、支持设备广泛等特性而被广泛采用。

能够对任意长度的数据进行编码。其局限在于印刷品的长度和条码阅读器的识别范围。
支持设备广泛。目前几乎所有的条形码阅读设备都能阅读Code39码,打印机也是同样情况。
编制简单。简单的开发技术就能快速生成相应的编码图像。
一般Code39码由5条线和分开它们的4条缝隙共9个元素构成。线和缝隙有宽窄之分,而且无论线还是缝隙仅有3个比其他的元素要宽一定比例。39码因此得名

Code39条形码规则
  1、 每五条线表示一个字符;
  2、 粗线表示1,细线表示0;
  3、 线条间的间隙宽的表示1,窄的表示0;
  4、 五条线加上它们之间的四条间隙就是九位二进制编码,而且这九位中必定有三位是1,所以称为39码;
  5、 条形码的首尾各一个 * 标识开始和结束。

Code 39只接受如下43个有效输入字符:
  1、26个大写字母(A - Z),
  2、十个数字(0 - 9),
  3、连接号(-),句号(.),空格,美圆符号($),斜扛(/),加号(+)以及百分号(%)。
4、其余的输入将被忽略。
  5、code39通常情况下不需要校验码。但是对於精确度要求高的应用,需要在code39条形码後面增加一个校验码。

条形码的生成网上也有很多库文件,做的特别好的都是商业授权。一维码二维码在.net开源项目中的生成读取比较知名的有:Zxing.net(http://zxingnet.*c*odep*lex.com/)、BarcodeLib等
但有些时候开源软件所实现的并不满足当下的需求,所以还要做一些其他尝试。效果如下图:

代码分享:

/// 
/// Code39一维码生成类
/// 
public class CSharpCode39
{
    #region 数据码
    private byte[,] c39_bp = new byte[,] { 
        { 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x32, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x33, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x34, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x35, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x36, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x37, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x38, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x39, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x41, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x42, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x43, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x44, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31 }, { 0x45, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, { 70, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, 
        { 0x47, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31 }, { 0x48, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x49, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x4a, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30 }, { 0x4b, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4c, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x4e, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31 }, { 0x4f, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 80, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 0x51, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31 }, { 0x52, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x54, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30 }, { 0x55, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x56, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, 
        { 0x57, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x58, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x59, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 90, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x2d, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x2e, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x20, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x2a, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x24, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x2f, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x2b, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30 }, { 0x25, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30 }
     };
    //code39合法字符集 [0-9A-Z+-*/%. ] 共43个
    private byte[] c39_cw = new byte[] { 
        0x30, 0x31, 50, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 70, 
        0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 80, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 
        0x57, 0x58, 0x59, 90, 0x2d, 0x2e, 0x20, 0x24, 0x2f, 0x2b, 0x25
     };
    private byte[,] c39_ex = new byte[,] { 
        { 1, 0x24, 0x41 }, { 2, 0x24, 0x42 }, { 3, 0x24, 0x43 }, { 4, 0x24, 0x44 }, { 5, 0x24, 0x45 }, { 6, 0x24, 70 }, { 7, 0x24, 0x47 }, { 8, 0x24, 0x48 }, { 9, 0x24, 0x49 }, { 10, 0x24, 0x4a }, { 11, 0x24, 0x4b }, { 12, 0x24, 0x4c }, { 13, 0x24, 0x4d }, { 14, 0x24, 0x4e }, { 15, 0x24, 0x4f }, { 0x10, 0x24, 80 }, 
        { 0x11, 0x24, 0x51 }, { 0x12, 0x24, 0x52 }, { 0x13, 0x24, 0x53 }, { 20, 0x24, 0x54 }, { 0x15, 0x24, 0x55 }, { 0x16, 0x24, 0x56 }, { 0x17, 0x24, 0x57 }, { 0x18, 0x24, 0x58 }, { 0x19, 0x24, 0x59 }, { 0x1a, 0x24, 90 }, { 0x1b, 0x25, 0x41 }, { 0x1c, 0x25, 0x42 }, { 0x1d, 0x25, 0x43 }, { 30, 0x25, 0x44 }, { 0x1f, 0x25, 0x45 }, { 0x3b, 0x25, 70 }, 
        { 60, 0x25, 0x47 }, { 0x3d, 0x25, 0x48 }, { 0x3e, 0x25, 0x49 }, { 0x3f, 0x25, 0x4a }, { 0x5b, 0x25, 0x4b }, { 0x5c, 0x25, 0x4c }, { 0x5d, 0x25, 0x4d }, { 0x5e, 0x25, 0x4e }, { 0x5f, 0x25, 0x4f }, { 0x7b, 0x25, 80 }, { 0x7c, 0x25, 0x51 }, { 0x7d, 0x25, 0x52 }, { 0x7e, 0x25, 0x53 }, { 0x7f, 0x25, 0x54 }, { 0, 0x25, 0x55 }, { 0x40, 0x25, 0x56 }, 
        { 0x60, 0x25, 0x57 }, { 0x21, 0x2f, 0x41 }, { 0x22, 0x2f, 0x42 }, { 0x23, 0x2f, 0x43 }, { 0x26, 0x2f, 70 }, { 0x27, 0x2f, 0x47 }, { 40, 0x2f, 0x48 }, { 0x29, 0x2f, 0x49 }, { 0x2a, 0x2f, 0x4a }, { 0x2c, 0x2f, 0x4c }, { 0x3a, 0x2f, 90 }, { 0x61, 0x2b, 0x41 }, { 0x62, 0x2b, 0x42 }, { 0x63, 0x2b, 0x43 }, { 100, 0x2b, 0x44 }, { 0x65, 0x2b, 0x45 }, 
        { 0x66, 0x2b, 70 }, { 0x67, 0x2b, 0x47 }, { 0x68, 0x2b, 0x48 }, { 0x69, 0x2b, 0x49 }, { 0x6a, 0x2b, 0x4a }, { 0x6b, 0x2b, 0x4b }, { 0x6c, 0x2b, 0x4c }, { 0x6d, 0x2b, 0x4d }, { 110, 0x2b, 0x4e }, { 0x6f, 0x2b, 0x4f }, { 0x70, 0x2b, 80 }, { 0x71, 0x2b, 0x51 }, { 0x72, 0x2b, 0x52 }, { 0x73, 0x2b, 0x53 }, { 0x74, 0x2b, 0x54 }, { 0x75, 0x2b, 0x55 }, 
        { 0x76, 0x2b, 0x56 }, { 0x77, 0x2b, 0x57 }, { 120, 0x2b, 0x58 }, { 0x79, 0x2b, 0x59 }, { 0x7a, 0x2b, 90 }
     };
    #endregion
    #region 字段和属性
    private bool _checksum;
    private string _dataToEncode;
    private bool _humanReadable;
    private string _humanReadableFont;
    private float _humanReadableSize;
    private float _marginX;
    private float _marginY;
    private float _moduleHeight;
    private float _moduleWidth;
    private float _ratio;
    private float _reduction;
    private Color _codeBarColor = Color.Black;
    private bool _isDisplayCheckCode;
    private string _checkData;
    private bool _isDisplayStartStopSign;
    /// 
    /// 是否检查效验
    /// 
    public bool Checksum
    {
        get
        {
            return _checksum;
        }
        set
        {
            _checksum = value;
        }
    }
    /// 
    /// 要进行编码的数据
    /// 
    public string DataToEncode
    {
        get
        {
            return _dataToEncode;
        }
        set
        {
            _dataToEncode = value;
        }
    }
    /// 
    /// 是否显示文本内容
    /// 
    public bool HumanReadable
    {
        get
        {
            return _humanReadable;
        }
        set
        {
            _humanReadable = value;
        }
    }
    /// 
    /// 用于显示文本内容的字体
    /// 
    public string HumanReadableFont
    {
        get
        {
            return _humanReadableFont;
        }
        set
        {
            _humanReadableFont = value;
        }
    }
    /// 
    /// 用于显示文本内容文字的代大小 
    /// 
    public float HumanReadableSize
    {
        get
        {
            return _humanReadableSize;
        }
        set
        {
            _humanReadableSize = value;
        }
    }
    /// 
    /// 水平方向边距
    /// 水平方向建议尽量留白
    /// 如果没有留白同时模块宽度较小可能会造成无法识别
    /// 
    public float MarginX
    {
        get
        {
            return _marginX;
        }
        set
        {
            _marginX = value;
        }
    }
    /// 
    /// 垂直方向边距
    /// 
    public float MarginY
    {
        get
        {
            return _marginY;
        }
        set
        {
            _marginY = value;
        }
    }
    /// 
    /// 模块高度(mm)
    /// 
    public float ModuleHeight
    {
        get
        {
            return _moduleHeight;
        }
        set
        {
            _moduleHeight = value;
        }
    }
    /// 
    /// 模块宽度(mm)
    /// 模块宽度不应低于0.2646f
    /// 模块宽度过低会造成数据丢失因而读不出数据或者会误读
    /// 
    public float ModuleWidth
    {
        get
        {
            return _moduleWidth;
        }
        set
        {
            _moduleWidth = value;
        }
    }
    /// 
    /// 放大比率 
    /// 
    public float Ratio
    {
        get
        {
            return _ratio;
        }
        set
        {
            _ratio = value;
        }
    }
    /// 
    /// 缩小
    /// 
    public float Reduction
    {
        get
        {
            return _reduction;
        }
        set
        {
            _reduction = value;
        }
    }
    /// 
    /// 设置条形码的颜色
    /// 
    public Color CodeBarColor
    {
        get
        {
            return _codeBarColor;
        }
        set
        {
            _codeBarColor = value;
        }
    }
    /// 
    /// 是否显示效验码
    /// 此属性要在Checksum属性为true的情况下有用
    /// 
    public bool IsDisplayCheckCode
    {
        get { return this._isDisplayCheckCode; }
        set { this._isDisplayCheckCode = value; }
    }
    /// 
    /// 供人识别是否显示起止符
    /// 
    public bool IsDisplayStartStopSign
    {
        get { return this._isDisplayStartStopSign; }
        set { this._isDisplayStartStopSign = value; }
    }
    #endregion
    /// 
    /// 默认构造函数
    /// 初始化
    /// 
    public CSharpCode39()
    {
        this.initData();
        
    }
    public CSharpCode39(string dataToEncode)
    {
        this.initData();
        this._dataToEncode = dataToEncode;
    }
    /// 
    /// 默认构造函数
    /// 初始化数据
    /// 
    private void initData()
    {
        this._humanReadableFont = "Arial";
        this._humanReadableSize = 10f;
        this._codeBarColor = Color.Black;
        this._moduleHeight = 15f;//模块高度毫米
        this._moduleWidth = 0.35f;//模块宽度毫米
        this._ratio = 3f;
        this._marginX =2;
        this._marginY =2;
        this._checksum = true;
        this._isDisplayCheckCode = false;
        this._isDisplayStartStopSign = false;
    }
    private char[] _bitpattern_c39(string rawdata, ref int finalLength)
    {
        //0x27  39  
        //0x50  80
        if ((rawdata.Length == 0) || (rawdata.Length > 0x50 /*0x27*/))
        {
            return null;
        }
        for (int i = 0; i  'x007f'))
            {
                return null;
            }
        }
        byte[] data = processTilde(rawdata);
        if (data.Length == 0)
        {
            return null;
        }
        byte[] buffer2 = this.processExtended(data);
        if ((buffer2.Length == 0) || (buffer2.Length > /*40*/80))
        {
            return null;
        }
        finalLength = this._checksum ? ((buffer2.Length + 2) + 1) : (buffer2.Length + 2);
        return this.getPattern_c39(buffer2);
    }
    /// 
    /// 计算效验值
    /// 
    /// 
    /// 
    /// 
    private byte _checksum_c39(byte[] data, int len)
    {
        //0x2b 43
        //字符值的总和除以合法字符集的个数43 取余数   余数在合法字符数组中对应的数值就是效验值
        int num2 = 0;
        for (int i = 1; i 
    /// 获得Code39条码图片
    /// 
    /// DPI
    /// 
    public Bitmap getBitmapImage(float resolution)
    {
       return Code39_createCode(resolution);
    }
   
    private Bitmap Code39_createCode(float resolution)
    {
        int num6;
        int finalLength = 0;
        char[] chArray = this._bitpattern_c39(DataToEncode, ref finalLength);
        if (chArray == null)
        {
            return null;
        }
        float fontsize = this._humanReadable ? (0.3527778f * this._humanReadableSize) : 0f;
        // float num3 = (7f * ModuleWidth) + ((3f * Ratio) * ModuleWidth);
        float num3 = (7f * this._moduleWidth) + ((3f * this._ratio) * this._moduleWidth);
        float width = (finalLength * num3) + (2f * this._marginX);
        float height = (this._moduleHeight + (2f * this._marginY)) + fontsize;
        width *= resolution / 25.4f;
        height *= resolution / 25.4f;
        Bitmap image = new Bitmap((int)width, (int)height, PixelFormat.Format32bppPArgb);
        image.SetResolution(resolution, resolution);
        //image.SetResolution(300, 300);
        Graphics g = Graphics.FromImage(image);
        g.Clear(Color.White);
        g.PageUnit = GraphicsUnit.Millimeter; //以毫米为度量单位
        g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, /*(int)width*/image.Width, /*(int)height*/image.Height));
        //new Pen(Color.Black, 2f);
        //new SolidBrush(Color.White);
        SolidBrush brush = new SolidBrush(Color.Black);
        if (resolution  arr = new List();
            for (num6 = 0; num6 = 0x20) && (buffer2[num6] 
    /// 进行图形填充
    /// 
    /// 
    /// 
    /// 
    private void MakeBar(Graphics g, RectangleF rect, float reduction)
    {
        MakeBar(g, rect, reduction,this._codeBarColor);
    }
    /// 
    /// 进行图形填充
    /// 
    /// 
    /// 
    /// 
    /// 
    private void MakeBar(Graphics g, RectangleF rect, float reduction, Color brushColor)
    {
        float num = rect.Width * (reduction / 200f);
        float num2 = rect.Width - (rect.Width * (reduction / 200f));
        RectangleF ef = new RectangleF
        {
            X = rect.X + num,
            Y = rect.Y,
            Width = num2,
            Height = rect.Height
        };
        SolidBrush brush = new SolidBrush(brushColor);
        g.FillRectangle(brush, ef);
    }
    private char[] getPattern_c39(byte[] data)
    {   //0x2a  42为*
        //int num = 0x27;
        int num = 80;
        byte[] buffer = new byte[num + 1];
        buffer[0] = 0x2a;
        int index = 1;
        for (int i = 0; i 
    /// 返回指定字符在code39合法字符数组中对应的索引
    /// 
    /// 
    /// 
    private int valueFromCharacter(byte c)
    {
        //c39_cw为数组,保存的为合法的字符集信息[0-9A-Z+-*/%. ] 共43个
        //如果存在这个字符就返回c39_cw对应的索引
        for (int i = 0; i 
    /// 判断字符集是否存在Extended
    /// 
    /// 
    /// 
    /// 
    /// 
    private bool valuesFromExtended(byte c, ref byte v1, ref byte v2)
    {
        //0x55  85
        for (int i = 0; i  0) && (num3 




这个方法是根据DPI以及数据模块的高宽来确定条码的实际高宽。模块的宽度以毫米(mm)来算。类中的getBitmapImage方法的一个参数getBitmapImage为DPI。安卓用户安装平时常用的扫码软件即可做识别测试。就识别率来说还是可以的,扫描枪绝对是可以扫的出的。同时使用过MessagingToolkit.Barcode进行解码测试,万张无一误读。


C#生成code128条形码实例


CODE128条形码是广泛应用在企业内部管理、生产流程、物流控制系统方面的条码码制,由于其优良的特性在管理信息系统的设计中被广泛使用,CODE128码是应用最广泛的条码码制之一。

CODE128条形码是1981年引入的一种高密度条码,CODE128 码可表示从 ASCII 0 到ASCII 127 共128个字符,故称128码。其中包含了数字、字母和符号字符。


using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
 
namespace Code
{
    class BarCode
    {
        public class Code128
        {
            private DataTable m_Code128 = new DataTable();
            private uint m_Height = 40;
            /// 
            /// 高度
            /// 
            public uint Height { get { return m_Height; } set { m_Height = value; } }
            private Font m_ValueFont = null;
            /// 
            /// 是否显示可见号码  如果为NULL不显示号码
            /// 
            public Font ValueFont { get { return m_ValueFont; } set { m_ValueFont = value; } }
            private byte m_Magnify = 0;
            /// 
            /// 放大倍数
            /// 
            public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
            /// 
            /// 条码类别
            /// 
            public enum Encode
            {
                Code128A,
                Code128B,
                Code128C,
                EAN128
            }
            public Code128()
  &nbsp

相关文章

精彩推荐