• C#生成条形码


    Code 39 码 / 三九码

    39码是西元1974年发展出来的条码系统,是一种可供使用者双向扫瞄的分散式条码,也就是说相临两资料码之间,必须包含一个不具任何意义的空白 (或细白,其逻辑值为0),且其具有支援文数字的能力,故应用较一般一维条码广泛,目前较主要利用於工业产品、商业资料及医院用的保健资料,它的最大优点 是码数没有强制的限定,可用大写英文字母码,且检查码可忽略不计。 标准的39码是由起始安全空间、起始码、资料码、可忽略不计的检查码、终止安全空间及终止码所构成(徐绍文,1985),以Z135+这个资料为例,其所编成的39码如图所示:

    图 39码的结构

    综合来说, 39码具有以下特性:

    条码的长度没有限制,可随着需求作弹性调整。但在规划长度的大小时,应考虑条码阅读机所能允许的范围,避免扫瞄时无法读取完整的资料。
    起始码和终止码必须固定为“ * ”字元。允许条码扫瞄器进行双向的扫瞄处理。由於39码具有自我检查能力,故检查码可有可无,不一定要设定。 条码占用的空间较大。

    可表示的资料包含有:0~9的数字,A~Z的英文字母,以及“+”、“-”、“*”、“/”、“%”、“$”、“.”等特殊符号,再加上空白字元“ ”,共计44组编码,并可组合出128个ASCII CODE的字元符号,如表所示。

    表 ASCII CODE字元符号与39码对照表

    39码编码方式

    叁九码的每一个字元编码方式,都是藉由九条不同排列的线条编码而得。可区分成如表之四种类型:

    表 39码的字元编码方式

    一) 英文字母部分

    26个英文字母所对应的39码逻辑值如表所示。

    表 39码编码对映表(英文字母部分)

    字元

    逻辑型态

    字元

    逻辑型态

    A

    110101001011

    N

    101011010011

    B

    101101001011

    O

    110101101001

    C

    110110100101

    P

    101101101001

    D

    101011001011

    Q

    101010110011

    E

    110101100101

    R

    110101011001

    F

    101101100101

    S

    101101011001

    G

    101010011011

    T

    101011011001

    H

    110101001101

    U

    110010101011

    I

    101101001101

    V

    100110101011

    J

    101011001101

    W

    110011010101

    K

    110101010011

    X

    100101101011

    L

    101101010011

    Y

    110010110101

    M

    110110101001

    Z

    100110110101

    (二) 数字与特殊符号部分

    39码也可表示数字0~9以及特殊符号,其对应的逻辑值如表所示。

    表 39码编码对映表(英文字母部分)

    字元

    逻辑型态

    字元

    逻辑型态

    0

    101001101101

    100101001001

    1

    110100101011

    100101011011

    2

    101100101011

    100101101101

    3

    110110010101

    100100101001

    4

    101001101011

    101001001001

    5

    110100110101

    100100100101

    6

    101100110101

    110010101101

    7

    101001011011

    空白

    100110101101

    8

    110100101101

     

     

    9

    101100101101

     


    39码检查码的计算
    39码的检查码必须搭配「检查码相对值对照表」,如表 5.4所示,将查出的相对值累加後再除以43,得到的馀数再查出相对的编码字元,即为检查码字元。

    例如要算出 *S123$5* 这笔资料的检查码,其计算过程如下:

    步骤1 参考检查码相对值对照表,找出编码字元相对值

    参考下表,得到各编码字元的相对值为:

    S 的相对值为28; 1 的相对值为1;

    2 的相对值为 2; 3 的相对值为3;

    $ 的相对值为39 ; 5 的相对值为5。

    步骤2 将各相对值累加除以43

    累加相对值=28+1+2+3+39+5=78

    78 ÷ 43=1….35

    步骤3 查出与馀数相对的编码字元

    馀数=35,

    查下表,得到相对值=35 之编码字元为 Z,

    故 检查码=Z,得

    含检查码在内的39码,为:*S123$5Z*

    表 39码的检查码查询表

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Drawing;
    using System.Collections;

    namespace Code39Bulider
    {
        public class Code39
        {
            private Hashtable m_Code39 = new Hashtable();

            private byte m_Magnify = 0;
            /// <summary>
            /// 放大倍数
            /// </summary>
            public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }

            private int m_Height = 40;
            /// <summary>
            /// 图形高
            /// </summary>
            public int Height { get { return m_Height; } set { m_Height = value; } }

            private Font m_ViewFont = null;
            /// <summary>
            /// 字体大小
            /// </summary>
            public Font ViewFont { get { return m_ViewFont; } set { m_ViewFont = value; } }



            public Code39()
            {

                m_Code39.Add("A", "1101010010110");
                m_Code39.Add("B", "1011010010110");
                m_Code39.Add("C", "1101101001010");
                m_Code39.Add("D", "1010110010110");
                m_Code39.Add("E", "1101011001010");
                m_Code39.Add("F", "1011011001010");
                m_Code39.Add("G", "1010100110110");
                m_Code39.Add("H", "1101010011010");
                m_Code39.Add("I", "1011010011010");
                m_Code39.Add("J", "1010110011010");
                m_Code39.Add("K", "1101010100110");
                m_Code39.Add("L", "1011010100110");
                m_Code39.Add("M", "1101101010010");
                m_Code39.Add("N", "1010110100110");
                m_Code39.Add("O", "1101011010010");
                m_Code39.Add("P", "1011011010010");
                m_Code39.Add("Q", "1010101100110");
                m_Code39.Add("R", "1101010110010");
                m_Code39.Add("S", "1011010110010");
                m_Code39.Add("T", "1010110110010");
                m_Code39.Add("U", "1100101010110");
                m_Code39.Add("V", "1001101010110");
                m_Code39.Add("W", "1100110101010");
                m_Code39.Add("X", "1001011010110");
                m_Code39.Add("Y", "1100101101010");
                m_Code39.Add("Z", "1001101101010");
                m_Code39.Add("0", "1010011011010");
                m_Code39.Add("1", "1101001010110");
                m_Code39.Add("2", "1011001010110");
                m_Code39.Add("3", "1101100101010");
                m_Code39.Add("4", "1010011010110");
                m_Code39.Add("5", "1101001101010");
                m_Code39.Add("6", "1011001101010");
                m_Code39.Add("7", "1010010110110");
                m_Code39.Add("8", "1101001011010");
                m_Code39.Add("9", "1011001011010");
                m_Code39.Add("+", "1001010010010");
                m_Code39.Add("-", "1001010110110");
                m_Code39.Add("*", "1001011011010");
                m_Code39.Add("/", "1001001010010");
                m_Code39.Add("%", "1010010010010");
                //m_Code39.Add("contentquot;, "1001001001010");
                m_Code39.Add(".", "1100101011010");
                m_Code39.Add(" ", "1001101011010");

            }

            public enum Code39Model
            {
                /// <summary>
                /// 基本类别 1234567890ABC
                /// </summary>
                Code39Normal,
                /// <summary>
                /// 全ASCII方式 +A+B 来表示小写
                /// </summary>
                Code39FullAscII
            }
            /// <summary>
            /// 获得条码图形
            /// </summary>
            /// <param name="p_Text">文字信息</param>
            /// <param name="p_Model">类别</param>
            /// <param name="p_StarChar">是否增加前后*号</param>
            /// <returns>图形</returns>
            public Bitmap GetCodeImage(string p_Text, Code39Model p_Model, bool p_StarChar)
            {
                string _ValueText = "";
                string _CodeText = "";
                char[] _ValueChar = null;
                switch (p_Model)
                {
                    case Code39Model.Code39Normal:
                        _ValueText = p_Text.ToUpper();
                        break;
                    default:
                        _ValueChar = p_Text.ToCharArray();
                        for (int i = 0; i != _ValueChar.Length; i++)
                        {
                            if ((int)_ValueChar[i] >= 97 && (int)_ValueChar[i] <= 122)
                            {
                                _ValueText += "+" + _ValueChar[i].ToString().ToUpper();

                            }
                            else
                            {
                                _ValueText += _ValueChar[i].ToString();
                            }
                        }
                        break;
                }

                _ValueChar = _ValueText.ToCharArray();

                if (p_StarChar == true) _CodeText += m_Code39["*"];

                for (int i = 0; i != _ValueChar.Length; i++)
                {
                    if (p_StarChar == true && _ValueChar[i] == '*') throw new Exception("带有起始符号不能出现*");

                    object _CharCode = m_Code39[_ValueChar[i].ToString()];
                    if (_CharCode == null) throw new Exception("不可用的字符" + _ValueChar[i].ToString());
                    _CodeText += _CharCode.ToString();
                }

                if (p_StarChar == true) _CodeText += m_Code39["*"];

                Bitmap _CodeBmp = GetImage(_CodeText);
                GetViewImage(_CodeBmp, p_Text);
                return _CodeBmp;
            }

            /// <summary>
            /// 绘制编码图形
            /// </summary>
            /// <param name="p_Text">编码</param>
            /// <returns>图形</returns>
            private Bitmap GetImage(string p_Text)
            {
                char[] _Value = p_Text.ToCharArray();

                //宽 == 需要绘制的数量*放大倍数 + 两个字的宽    
                Bitmap _CodeImage = new Bitmap(_Value.Length * ((int)m_Magnify + 1), (int)m_Height);
                Graphics _Garphics = Graphics.FromImage(_CodeImage);
                //从坐标0,0处画一个白色区域。
                _Garphics.FillRectangle(Brushes.White, new Rectangle(0, 0, _CodeImage.Width, _CodeImage.Height));

                int _LenEx = 0;
                for (int i = 0; i != _Value.Length; i++)
                {
                    int _DrawWidth = m_Magnify + 1;
                    if (_Value[i] == '1')
                    {
                        //在白色区域上画线条
                        _Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _DrawWidth, m_Height));

                    }
                    else
                    {
                        _Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _DrawWidth, m_Height));
                    }
                    _LenEx += _DrawWidth;
                }                  
       
                _Garphics.Dispose();
                return _CodeImage;
            }
            private void FillText(Bitmap _CodeImage)
            {
                Graphics _Garphics = Graphics.FromImage(_CodeImage);

            }
            /// <summary>
            /// 绘制文字
            /// </summary>
            /// <param name="p_CodeImage">图形</param>
            /// <param name="p_Text">文字</param>
            private void GetViewImage(Bitmap p_CodeImage, string p_Text)
            {
                if (m_ViewFont == null) return;
                Graphics _Graphics = Graphics.FromImage(p_CodeImage);
                SizeF _FontSize = _Graphics.MeasureString(p_Text, m_ViewFont);

                if (_FontSize.Width > p_CodeImage.Width || _FontSize.Height > p_CodeImage.Height - 20)
                {
                    _Graphics.Dispose();
                    return;
                }
                int _StarHeight = p_CodeImage.Height - (int)_FontSize.Height;

                _Graphics.FillRectangle(Brushes.White, new Rectangle(0, _StarHeight, p_CodeImage.Width, (int)_FontSize.Height));

                int _StarWidth = (p_CodeImage.Width - (int)_FontSize.Width) / 2;

                _Graphics.DrawString(p_Text, m_ViewFont, Brushes.Black, _StarWidth, _StarHeight);

                _Graphics.Dispose();

            }
        }
    }

  • 相关阅读:
    http请求
    mac chrome NET::ERR_CERT_INVALID
    百度小程序获取用户手机号
    js 异步总结
    百度小程序 es6 支持情况
    每日日报
    每日日报
    每日日报
    05程序员修炼之道:从小工到专家阅读笔记之二
    05程序员修炼之道:从小工到专家阅读笔记之一
  • 原文地址:https://www.cnblogs.com/lovejunxia/p/3361270.html
Copyright © 2020-2023  润新知