
【code128条形码组成】
除终止符(STOP)由13个模块组成外,其他字符均由11个模块组成
就是说,如果用‘1’表示黑线(实模块),用‘0’表示白线(空模块),那么每表示一个字符就需要11条线,也就是11个模块。
在条码字符中,每三个条和三个空组成一个字符,终止符有四个条和三个空组成。
就是说,这11条线的颜色,是依据一定的规则将其分布于三个黑线区和三个白线区,当然是黑白相间的。就像这样:
11100110100,11011011000。具体的编码要参照码表,查找对应的字符或编码。
【code128码表】其中b=>black代表黑线,s=>space代表白线
ID | Code128A | Code128B | Code128C | BandCode | 编码值 |
0 | SP | SP | 0 | 212222 | bbsbbssbbss |
1 | ! | ! | 1 | 222122 | bbssbbsbbss |
2 | " | " | 2 | 222221 | bbssbbssbbs |
3 | # | # | 3 | 121223 | bssbssbbsss |
4 | $ | $ | 4 | 121322 | bssbsssbbss |
5 | % | % | 5 | 131222 | bsssbssbbss |
6 | & | & | 6 | 122213 | bssbbssbsss |
7 | ' | ' | 7 | 122312 | bssbbsssbss |
8 | ( | ( | 8 | 132212 | bsssbbssbss |
9 | ) | ) | 9 | 221213 | bbssbssbsss |
10 | * | * | 10 | 221312 | bbssbsssbss |
11 | + | + | 11 | 231212 | bbsssbssbss |
12 | , | , | 12 | 112232 | bsbbssbbbss |
13 | - | - | 13 | 122132 | bssbbsbbbss |
14 | . | . | 14 | 122231 | bssbbssbbbs |
15 | / | / | 15 | 113222 | bsbbbssbbss |
16 | 0 | 0 | 16 | 123122 | bssbbbsbbss |
17 | 1 | 1 | 17 | 123221 | bssbbbssbbs |
18 | 2 | 2 | 18 | 223211 | bbssbbbssbs |
19 | 3 | 3 | 19 | 221132 | bbssbsbbbss |
20 | 4 | 4 | 20 | 221231 | bbssbssbbbs |
21 | 5 | 5 | 21 | 213212 | bbsbbbssbss |
22 | 6 | 6 | 22 | 223112 | bbssbbbsbss |
23 | 7 | 7 | 23 | 312131 | bbbsbbsbbbs |
24 | 8 | 8 | 24 | 311222 | bbbsbssbbss |
25 | 9 | 9 | 25 | 321122 | bbbssbsbbss |
26 | : | : | 26 | 321221 | bbbssbssbbs |
27 | ; | ; | 27 | 312212 | bbbsbbssbss |
28 | < | < | 28 | 322112 | bbbssbbsbss |
29 | = | = | 29 | 322211 | bbbssbbssbs |
30 | > | > | 30 | 212123 | bbsbbsbbsss |
31 | ? | ? | 31 | 212321 | bbsbbsssbbs |
32 | @ | @ | 32 | 232121 | bbsssbbsbbs |
33 | A | A | 33 | 111323 | bsbsssbbsss |
34 | B | B | 34 | 131123 | bsssbsbbsss |
35 | C | C | 35 | 131321 | bsssbsssbbs |
36 | D | D | 36 | 112313 | bsbbsssbsss |
37 | E | E | 37 | 132113 | bsssbbsbsss |
38 | F | F | 38 | 132311 | bsssbbsssbs |
39 | G | G | 39 | 211313 | bbsbsssbsss |
40 | H | H | 40 | 231113 | bbsssbsbsss |
41 | I | I | 41 | 231311 | bbsssbsssbs |
42 | J | J | 42 | 112133 | bsbbsbbbsss |
43 | K | K | 43 | 112331 | bsbbsssbbbs |
44 | L | L | 44 | 132131 | bsssbbsbbbs |
45 | M | M | 45 | 113123 | bsbbbsbbsss |
46 | N | N | 46 | 113321 | bsbbbsssbbs |
47 | O | O | 47 | 133121 | bsssbbbsbbs |
48 | P | P | 48 | 313121 | bbbsbbbsbbs |
49 | Q | Q | 49 | 211331 | bbsbsssbbbs |
50 | R | R | 50 | 231131 | bbsssbsbbbs |
51 | S | S | 51 | 213113 | bbsbbbsbsss |
52 | T | T | 52 | 213311 | bbsbbbsssbs |
53 | U | U | 53 | 213131 | bbsbbbsbbbs |
54 | V | V | 54 | 311123 | bbbsbsbbsss |
55 | W | W | 55 | 311321 | bbbsbsssbbs |
56 | X | X | 56 | 331121 | bbbsssbsbbs |
57 | Y | Y | 57 | 312113 | bbbsbbsbsss |
58 | Z | Z | 58 | 312311 | bbbsbbsssbs |
59 | [ | [ | 59 | 332111 | bbbsssbbsbs |
60 | \ | \ | 60 | 314111 | bbbsbbbbsbs |
61 | ] | ] | 61 | 221411 | bbssbssssbs |
62 | ^ | ^ | 62 | 431111 | bbbbsssbsbs |
63 | _ | _ | 63 | 111224 | bsbssbbssss |
64 | NUL | ` | 64 | 111422 | bsbssssbbss |
65 | SOH | a | 65 | 121124 | bssbsbbssss |
66 | STX | b | 66 | 121421 | bssbssssbbs |
67 | ETX | c | 67 | 141122 | bssssbsbbss |
68 | EOT | d | 68 | 141221 | bssssbssbbs |
69 | ENQ | e | 69 | 112214 | bsbbssbssss |
70 | ACK | f | 70 | 112412 | bsbbssssbss |
71 | BEL | g | 71 | 122114 | bssbbsbssss |
72 | BS | h | 72 | 122411 | bssbbssssbs |
73 | HT | i | 73 | 142112 | bssssbbsbss |
74 | LF | j | 74 | 142211 | bssssbbssbs |
75 | VT | k | 75 | 241211 | bbssssbssbs |
76 | FF | I | 76 | 221114 | bbssbsbssss |
77 | CR | m | 77 | 413111 | bbbbsbbbsbs |
78 | SO | n | 78 | 241112 | bbssssbsbss |
79 | SI | o | 79 | 134111 | bsssbbbbsbs |
80 | DLE | p | 80 | 111242 | bsbssbbbbss |
81 | DC1 | q | 81 | 121142 | bssbsbbbbss |
82 | DC2 | r | 82 | 121241 | bssbssbbbbs |
83 | DC3 | s | 83 | 114212 | bsbbbbssbss |
84 | DC4 | t | 84 | 124112 | bssbbbbsbss |
85 | NAK | u | 85 | 124211 | bssbbbbssbs |
86 | SYN | v | 86 | 411212 | bbbbsbssbss |
87 | ETB | w | 87 | 421112 | bbbbssbsbss |
88 | CAN | x | 88 | 421211 | bbbbssbssbs |
89 | EM | y | 89 | 212141 | bbsbbsbbbbs |
90 | SUB | z | 90 | 214121 | bbsbbbbsbbs |
91 | ESC | { | 91 | 412121 | bbbbsbbsbbs |
92 | FS | | | 92 | 111143 | bsbsbbbbsss |
93 | GS | } | 93 | 111341 | bsbsssbbbbs |
94 | RS | ~ | 94 | 131141 | bsssbsbbbbs |
95 | US | DEL | 95 | 114113 | bsbbbbsbsss |
96 | FNC3 | FNC3 | 96 | 114311 | bsbbbbsssbs |
97 | FNC2 | FNC2 | 97 | 411113 | bbbbsbsbsss |
98 | SHIFT | SHIFT | 98 | 411311 | bbbbsbsssbs |
99 | CODEC | CODEC | 99 | 113141 | bsbbbsbbbbs |
100 | CODEB | FNC4 | CODEB | 114131 | bsbbbbsbbbs |
101 | FNC4 | CODEA | CODEA | 311141 | bbbsbsbbbbs |
102 | FNC1 | FNC1 | FNC1 | 411131 | bbbbsbsbbbs |
103 | StartA | StartA | StartA | 211412 | bbsbssssbss |
104 | StartB | StartB | StartB | 211214 | bbsbssbssss |
105 | StartC | StartC | StartC | 211232 | bbsbssbbbss |
106 | Stop | Stop | Stop | 2331112 | bbsssbbbsbsbb |
【Code128各编码方式的编码范围】
1、Code128A:标准数字和字母,控制符,特殊字符;
2、Code128B:标准数字和字母,小写字母,特殊字符;
3、Code128C/EAN128:[00]-[99]的数字对集合,共100个,即只能表示偶数位长度的数字。
【Code128编码规则】:开始位 + [FNC1(为EAN128码时加)] + 数据位 + 检验位 + 结束位
【Code128检验位计算】:(开始位对应的ID值 + 每位数据在整个数据中的位置×每位数据对应的ID值)% 103
编码类型 | 开始位 | FNC1 |
Code128A | StartA | 无 |
Code128B | StartB | 无 |
Code128C | StartC | 无 |
Ean128 | StartC | FNC1 |
【C#代码】
using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using System.Drawing; namespace XXXX.Common
{
/// <summary>
/// 生成Code128A,Code128B,Code128C,EAN128条码
/// </summary>
public class BarCode
{
/// <summary>
/// 生成条形码
/// </summary>
/// <param name="barNumber">条形码,位数必须为2的倍数</param>
public void CreateBarCode(string barNumber)
{
if (barNumber.Length % == ) barNumber = "" + barNumber;
Code128 code = new Code128();
//code.ValueFont = new Font("Arial", 9); //显示条码文字字体
code.Height = ;
Bitmap image = code.GetCodeImage(barNumber, Common.BarCode.Code128.Encode.Code128C);
image.Save(System.Web.HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
}
public class Code128
{
private DataTable m_Code128 = new DataTable();
private uint m_Height = ;
/// <summary>
/// 高度
/// </summary>
public uint Height { get { return m_Height; } set { m_Height = value; } }
private Font m_ValueFont = null;
/// <summary>
/// 是否显示可见号码 如果为NULL不显示号码
/// </summary>
public Font ValueFont { get { return m_ValueFont; } set { m_ValueFont = value; } }
private byte m_Magnify = ;
/// <summary>
/// 放大倍数
/// </summary>
public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
/// <summary>
/// 条码类别
/// </summary>
public enum Encode
{
Code128A,
Code128B,
Code128C,
EAN128
}
/// <summary>
/// 数据表
/// </summary>
public Code128()
{
m_Code128.Columns.Add("ID");
m_Code128.Columns.Add("Code128A");
m_Code128.Columns.Add("Code128B");
m_Code128.Columns.Add("Code128C");
m_Code128.Columns.Add("BandCode");
m_Code128.CaseSensitive = true;
#region 数据表
m_Code128.Rows.Add("", " ", " ", "", "");
m_Code128.Rows.Add("", "!", "!", "", "");
m_Code128.Rows.Add("", "\"", "\"", "", "");
m_Code128.Rows.Add("", "#", "#", "", "");
m_Code128.Rows.Add("", "$", "$", "", "");
m_Code128.Rows.Add("", "%", "%", "", "");
m_Code128.Rows.Add("", "&", "&", "", "");
m_Code128.Rows.Add("", "'", "'", "", "");
m_Code128.Rows.Add("", "(", "(", "", "");
m_Code128.Rows.Add("", ")", ")", "", "");
m_Code128.Rows.Add("", "*", "*", "", "");
m_Code128.Rows.Add("", "+", "+", "", "");
m_Code128.Rows.Add("", ",", ",", "", "");
m_Code128.Rows.Add("", "-", "-", "", "");
m_Code128.Rows.Add("", ".", ".", "", "");
m_Code128.Rows.Add("", "/", "/", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", "", "", "", "");
m_Code128.Rows.Add("", ":", ":", "", "");
m_Code128.Rows.Add("", ";", ";", "", "");
m_Code128.Rows.Add("", "<", "<", "", "");
m_Code128.Rows.Add("", "=", "=", "", "");
m_Code128.Rows.Add("", ">", ">", "", "");
m_Code128.Rows.Add("", "?", "?", "", "");
m_Code128.Rows.Add("", "@", "@", "", "");
m_Code128.Rows.Add("", "A", "A", "", "");
m_Code128.Rows.Add("", "B", "B", "", "");
m_Code128.Rows.Add("", "C", "C", "", "");
m_Code128.Rows.Add("", "D", "D", "", "");
m_Code128.Rows.Add("", "E", "E", "", "");
m_Code128.Rows.Add("", "F", "F", "", "");
m_Code128.Rows.Add("", "G", "G", "", "");
m_Code128.Rows.Add("", "H", "H", "", "");
m_Code128.Rows.Add("", "I", "I", "", "");
m_Code128.Rows.Add("", "J", "J", "", "");
m_Code128.Rows.Add("", "K", "K", "", "");
m_Code128.Rows.Add("", "L", "L", "", "");
m_Code128.Rows.Add("", "M", "M", "", "");
m_Code128.Rows.Add("", "N", "N", "", "");
m_Code128.Rows.Add("", "O", "O", "", "");
m_Code128.Rows.Add("", "P", "P", "", "");
m_Code128.Rows.Add("", "Q", "Q", "", "");
m_Code128.Rows.Add("", "R", "R", "", "");
m_Code128.Rows.Add("", "S", "S", "", "");
m_Code128.Rows.Add("", "T", "T", "", "");
m_Code128.Rows.Add("", "U", "U", "", "");
m_Code128.Rows.Add("", "V", "V", "", "");
m_Code128.Rows.Add("", "W", "W", "", "");
m_Code128.Rows.Add("", "X", "X", "", "");
m_Code128.Rows.Add("", "Y", "Y", "", "");
m_Code128.Rows.Add("", "Z", "Z", "", "");
m_Code128.Rows.Add("", "[", "[", "", "");
m_Code128.Rows.Add("", "\\", "\\", "", "");
m_Code128.Rows.Add("", "]", "]", "", "");
m_Code128.Rows.Add("", "^", "^", "", "");
m_Code128.Rows.Add("", "_", "_", "", "");
m_Code128.Rows.Add("", "NUL", "`", "", "");
m_Code128.Rows.Add("", "SOH", "a", "", "");
m_Code128.Rows.Add("", "STX", "b", "", "");
m_Code128.Rows.Add("", "ETX", "c", "", "");
m_Code128.Rows.Add("", "EOT", "d", "", "");
m_Code128.Rows.Add("", "ENQ", "e", "", "");
m_Code128.Rows.Add("", "ACK", "f", "", "");
m_Code128.Rows.Add("", "BEL", "g", "", "");
m_Code128.Rows.Add("", "BS", "h", "", "");
m_Code128.Rows.Add("", "HT", "i", "", "");
m_Code128.Rows.Add("", "LF", "j", "", "");
m_Code128.Rows.Add("", "VT", "k", "", "");
m_Code128.Rows.Add("", "FF", "I", "", "");
m_Code128.Rows.Add("", "CR", "m", "", "");
m_Code128.Rows.Add("", "SO", "n", "", "");
m_Code128.Rows.Add("", "SI", "o", "", "");
m_Code128.Rows.Add("", "DLE", "p", "", "");
m_Code128.Rows.Add("", "DC1", "q", "", "");
m_Code128.Rows.Add("", "DC2", "r", "", "");
m_Code128.Rows.Add("", "DC3", "s", "", "");
m_Code128.Rows.Add("", "DC4", "t", "", "");
m_Code128.Rows.Add("", "NAK", "u", "", "");
m_Code128.Rows.Add("", "SYN", "v", "", "");
m_Code128.Rows.Add("", "ETB", "w", "", "");
m_Code128.Rows.Add("", "CAN", "x", "", "");
m_Code128.Rows.Add("", "EM", "y", "", "");
m_Code128.Rows.Add("", "SUB", "z", "", "");
m_Code128.Rows.Add("", "ESC", "{", "", "");
m_Code128.Rows.Add("", "FS", "|", "", "");
m_Code128.Rows.Add("", "GS", "}", "", "");
m_Code128.Rows.Add("", "RS", "~", "", "");
m_Code128.Rows.Add("", "US", "DEL", "", "");
m_Code128.Rows.Add("", "FNC3", "FNC3", "", "");
m_Code128.Rows.Add("", "FNC2", "FNC2", "", "");
m_Code128.Rows.Add("", "SHIFT", "SHIFT", "", "");
m_Code128.Rows.Add("", "CODEC", "CODEC", "", "");
m_Code128.Rows.Add("", "CODEB", "FNC4", "CODEB", "");
m_Code128.Rows.Add("", "FNC4", "CODEA", "CODEA", "");
m_Code128.Rows.Add("", "FNC1", "FNC1", "FNC1", "");
m_Code128.Rows.Add("", "StartA", "StartA", "StartA", "");
m_Code128.Rows.Add("", "StartB", "StartB", "StartB", "");
m_Code128.Rows.Add("", "StartC", "StartC", "StartC", "");
m_Code128.Rows.Add("", "Stop", "Stop", "Stop", "");
#endregion
}
/// <summary>
/// 获取128图形
/// </summary>
/// <param name="p_Text">文字</param>
/// <param name="p_Code">编码</param>
/// <returns>图形</returns>
public Bitmap GetCodeImage(string p_Text, Encode p_Code)
{
string _ViewText = p_Text;
string _Text = "";
IList<int> _TextNumb = new List<int>();
int _Examine = ; //首位
switch (p_Code)
{
case Encode.Code128C:
_Examine = ;
if (!((p_Text.Length & ) == )) throw new Exception("128C长度必须是偶数");
while (p_Text.Length != )
{
int _Temp = ;
try
{
int _CodeNumb128 = Int32.Parse(p_Text.Substring(, ));
}
catch
{
throw new Exception("128C必须是数字!");
}
_Text += GetValue(p_Code, p_Text.Substring(, ), ref _Temp);
_TextNumb.Add(_Temp);
p_Text = p_Text.Remove(, );
}
break;
case Encode.EAN128:
_Examine = ;
if (!((p_Text.Length & ) == )) throw new Exception("EAN128长度必须是偶数");
_TextNumb.Add();
_Text += "";
while (p_Text.Length != )
{
int _Temp = ;
try
{
int _CodeNumb128 = Int32.Parse(p_Text.Substring(, ));
}
catch
{
throw new Exception("128C必须是数字!");
}
_Text += GetValue(Encode.Code128C, p_Text.Substring(, ), ref _Temp);
_TextNumb.Add(_Temp);
p_Text = p_Text.Remove(, );
}
break;
default:
if (p_Code == Encode.Code128A)
{
_Examine = ;
}
else
{
_Examine = ;
}
while (p_Text.Length != )
{
int _Temp = ;
string _ValueCode = GetValue(p_Code, p_Text.Substring(, ), ref _Temp);
if (_ValueCode.Length == ) throw new Exception("无效的字符集!" + p_Text.Substring(, ).ToString());
_Text += _ValueCode;
_TextNumb.Add(_Temp);
p_Text = p_Text.Remove(, );
}
break;
}
if (_TextNumb.Count == ) throw new Exception("错误的编码,无数据");
_Text = _Text.Insert(, GetValue(_Examine)); //获取开始位
for (int i = ; i != _TextNumb.Count; i++)
{
_Examine += _TextNumb[i] * (i + );
}
_Examine = _Examine % ; //获得严效位
_Text += GetValue(_Examine); //获取严效位
_Text += ""; //结束位
Bitmap _CodeImage = GetImage(_Text);
GetViewText(_CodeImage, _ViewText);
return _CodeImage;
} /// <summary>
/// 获取目标对应的数据
/// </summary>
/// <param name="p_Code">编码</param>
/// <param name="p_Value">数值 A b 30</param>
/// <param name="p_SetID">返回编号</param>
/// <returns>编码</returns>
private string GetValue(Encode p_Code, string p_Value, ref int p_SetID)
{
if (m_Code128 == null) return "";
DataRow[] _Row = m_Code128.Select(p_Code.ToString() + "='" + p_Value + "'");
if (_Row.Length != ) throw new Exception("错误的编码" + p_Value.ToString());
p_SetID = Int32.Parse(_Row[]["ID"].ToString());
return _Row[]["BandCode"].ToString();
}
/// <summary>
/// 根据编号获得条纹
/// </summary>
/// <param name="p_CodeId"></param>
/// <returns></returns>
private string GetValue(int p_CodeId)
{
DataRow[] _Row = m_Code128.Select("ID='" + p_CodeId.ToString() + "'");
if (_Row.Length != ) throw new Exception("验效位的编码错误" + p_CodeId.ToString());
return _Row[]["BandCode"].ToString();
}
/// <summary>
/// 获得条码图形
/// </summary>
/// <param name="p_Text">文字</param>
/// <returns>图形</returns>
private Bitmap GetImage(string p_Text)
{
char[] _Value = p_Text.ToCharArray();
int _Width = ;
for (int i = ; i != _Value.Length; i++)
{
_Width += Int32.Parse(_Value[i].ToString()) * (m_Magnify + );
}
Bitmap _CodeImage = new Bitmap(_Width, (int)m_Height);
Graphics _Garphics = Graphics.FromImage(_CodeImage);
//Pen _Pen;
int _LenEx = ;
for (int i = ; i != _Value.Length; i++)
{
int _ValueNumb = Int32.Parse(_Value[i].ToString()) * (m_Magnify + ); //获取宽和放大系数
if (!((i & ) == ))
{
//_Pen = new Pen(Brushes.White, _ValueNumb);
_Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, , _ValueNumb, (int)m_Height));
}
else
{
//_Pen = new Pen(Brushes.Black, _ValueNumb);
_Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, , _ValueNumb, (int)m_Height));
}
//_Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx, m_Height));
_LenEx += _ValueNumb;
}
_Garphics.Dispose();
return _CodeImage;
}
/// <summary>
/// 显示可见条码文字 如果小于40 不显示文字
/// </summary>
/// <param name="p_Bitmap">图形</param>
private void GetViewText(Bitmap p_Bitmap, string p_ViewText)
{
if (m_ValueFont == null) return;
Graphics _Graphics = Graphics.FromImage(p_Bitmap);
SizeF _DrawSize = _Graphics.MeasureString(p_ViewText, m_ValueFont);
if (_DrawSize.Height > p_Bitmap.Height - || _DrawSize.Width > p_Bitmap.Width)
{
_Graphics.Dispose();
return;
}
int _StarY = p_Bitmap.Height - (int)_DrawSize.Height;
_Graphics.FillRectangle(Brushes.White, new Rectangle(, _StarY, p_Bitmap.Width, (int)_DrawSize.Height));
_Graphics.DrawString(p_ViewText, m_ValueFont, Brushes.Black, , _StarY);
}
}
}
}
code128
[代码转自]http://blog.csdn.net/anchenyanyue/article/details/7666284
现实中很多现有的代码库有code128码,但是没有ean128码,所以根据算法我们也可以很容易添加ean128.
一下是在barcodelib添加ean128的代码,这边只有code128部分,就当作是扩展吧 【BarcodeLibExtend下载】