发一个CODE128条码绘制类。只支持Code128A,Code128B,Code128C,EAN128。
128C和EAN128是双位的也就是本身码一次取两位。而且必须是数字。EAN128和128C不同在与 EAN128前比128C多了一个EAN位(102),多的这一位是参与验效的。
如 2008 128C验效 (105 + (1 * 20+ 2 *8 )) % 103
EAN验效 (105+(1*102+2*20+3*8))%103 这里的102是EAN的头位。
属性
Height 绘制图形的高度
ValueFont是否显示可见号码 如果为NULL不显示号码。如果字体绘制如果大于条码所用的大小,即使设置了FONT也不会显示。
Magnify放大倍数
使用
- BandCode.Code128_Code= new BandCode.Code128();
- _Code.ValueFont= new Font( "宋体" ,10);
- pictureBox1.Image=_Code.GetCodeImage( "20081011001010020001" ,BandCode.Code128.Encode.Code128C);
- pictureBox1.Image.Save(@ "C:/B.BMP" );
完整的类
- using System;
- using System.Data;
- using System.Collections.Generic;
- using System.Text;
- using System.Drawing;
- namespace CopyDirectoryInfo
- {
- ///<summary>
- ///Code128A,Code128B,Code128C,EAN128条码
- ///zgke@sina.com
- ///qq:116149
- ///</summary>
- public class BandCode
- {
- public class Code128
- {
- private DataTablem_Code128= new DataTable();
- private uint m_Height=40;
- ///<summary>
- ///高度
- ///</summary>
- public uint Height{ get { return m_Height;} set {m_Height=value;}}
- private Fontm_ValueFont= null ;
- ///<summary>
- ///是否显示可见号码如果为NULL不显示号码
- ///</summary>
- public FontValueFont{ get { return m_ValueFont;} set {m_ValueFont=value;}}
- private byte m_Magnify=0;
- ///<summary>
- ///放大倍数
- ///</summary>
- public byte Magnify{ get { return m_Magnify;} set {m_Magnify=value;}}
- ///<summary>
- ///条码类别
- ///</summary>
- public enum Encode
- {
- Code128A,
- Code128B,
- Code128C,
- EAN128
- }
- 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( "0" , "" , "" , "00" , "212222" );
- m_Code128.Rows.Add( "1" , "!" , "!" , "01" , "222122" );
- m_Code128.Rows.Add( "2" , "/"" , "/"" , "02" , "222221" );
- m_Code128.Rows.Add( "3" , "#" , "#" , "03" , "121223" );
- m_Code128.Rows.Add( "4" , "$" , "$" , "04" , "121322" );
- m_Code128.Rows.Add( "5" , "%" , "%" , "05" , "131222" );
- m_Code128.Rows.Add( "6" , "&" , "&" , "06" , "122213" );
- m_Code128.Rows.Add( "7" , "'" , "'" , "07" , "122312" );
- m_Code128.Rows.Add( "8" , "(" , "(" , "08" , "132212" );
- m_Code128.Rows.Add( "9" , ")" , ")" , "09" , "221213" );
- m_Code128.Rows.Add( "10" , "*" , "*" , "10" , "221312" );
- m_Code128.Rows.Add( "11" , "+" , "+" , "11" , "231212" );
- m_Code128.Rows.Add( "12" , "," , "," , "12" , "112232" );
- m_Code128.Rows.Add( "13" , "-" , "-" , "13" , "122132" );
- m_Code128.Rows.Add( "14" , "." , "." , "14" , "122231" );
- m_Code128.Rows.Add( "15" , "/" , "/" , "15" , "113222" );
- m_Code128.Rows.Add( "16" , "0" , "0" , "16" , "123122" );
- m_Code128.Rows.Add( "17" , "1" , "1" , "17" , "123221" );
- m_Code128.Rows.Add( "18" , "2" , "2" , "18" , "223211" );
- m_Code128.Rows.Add( "19" , "3" , "3" , "19" , "221132" );
- m_Code128.Rows.Add( "20" , "4" , "4" , "20" , "221231" );
- m_Code128.Rows.Add( "21" , "5" , "5" , "21" , "213212" );
- m_Code128.Rows.Add( "22" , "6" , "6" , "22" , "223112" );
- m_Code128.Rows.Add( "23" , "7" , "7" , "23" , "312131" );
- m_Code128.Rows.Add( "24" , "8" , "8" , "24" , "311222" );
- m_Code128.Rows.Add( "25" , "9" , "9" , "25" , "321122" );
- m_Code128.Rows.Add( "26" , ":" , ":" , "26" , "321221" );
- m_Code128.Rows.Add( "27" , ";" , ";" , "27" , "312212" );
- m_Code128.Rows.Add( "28" , "<" , "<" , "28" , "322112" );
- m_Code128.Rows.Add( "29" , "=" , "=" , "29" , "322211" );
- m_Code128.Rows.Add( "30" , ">" , ">" , "30" , "212123" );
- m_Code128.Rows.Add( "31" , "?" , "?" , "31" , "212321" );
- m_Code128.Rows.Add( "32" , "@" , "@" , "32" , "232121" );
- m_Code128.Rows.Add( "33" , "A" , "A" , "33" , "111323" );
- m_Code128.Rows.Add( "34" , "B" , "B" , "34" , "131123" );
- m_Code128.Rows.Add( "35" , "C" , "C" , "35" , "131321" );
- m_Code128.Rows.Add( "36" , "D" , "D" , "36" , "112313" );
- m_Code128.Rows.Add( "37" , "E" , "E" , "37" , "132113" );
- m_Code128.Rows.Add( "38" , "F" , "F" , "38" , "132311" );
- m_Code128.Rows.Add( "39" , "G" , "G" , "39" , "211313" );
- m_Code128.Rows.Add( "40" , "H" , "H" , "40" , "231113" );
- m_Code128.Rows.Add( "41" , "I" , "I" , "41" , "231311" );
- m_Code128.Rows.Add( "42" , "J" , "J" , "42" , "112133" );
- m_Code128.Rows.Add( "43" , "K" , "K" , "43" , "112331" );
- m_Code128.Rows.Add( "44" , "L" , "L" , "44" , "132131" );
- m_Code128.Rows.Add( "45" , "M" , "M" , "45" , "113123" );
- m_Code128.Rows.Add( "46" , "N" , "N" , "46" , "113321" );
- m_Code128.Rows.Add( "47" , "O" , "O" , "47" , "133121" );
- m_Code128.Rows.Add( "48" , "P" , "P" , "48" , "313121" );
- m_Code128.Rows.Add( "49" , "Q" , "Q" , "49" , "211331" );
- m_Code128.Rows.Add( "50" , "R" , "R" , "50" , "231131" );
- m_Code128.Rows.Add( "51" , "S" , "S" , "51" , "213113" );
- m_Code128.Rows.Add( "52" , "T" , "T" , "52" , "213311" );
- m_Code128.Rows.Add( "53" , "U" , "U" , "53" , "213131" );
- m_Code128.Rows.Add( "54" , "V" , "V" , "54" , "311123" );
- m_Code128.Rows.Add( "55" , "W" , "W" , "55" , "311321" );
- m_Code128.Rows.Add( "56" , "X" , "X" , "56" , "331121" );
- m_Code128.Rows.Add( "57" , "Y" , "Y" , "57" , "312113" );
- m_Code128.Rows.Add( "58" , "Z" , "Z" , "58" , "312311" );
- m_Code128.Rows.Add( "59" , "[" , "[" , "59" , "332111" );
- m_Code128.Rows.Add( "60" , "//"," // "," 60 "," 314111");
- m_Code128.Rows.Add( "61" , "]" , "]" , "61" , "221411" );
- m_Code128.Rows.Add( "62" , "^" , "^" , "62" , "431111" );
- m_Code128.Rows.Add( "63" , "_" , "_" , "63" , "111224" );
- m_Code128.Rows.Add( "64" , "NUL" , "`" , "64" , "111422" );
- m_Code128.Rows.Add( "65" , "SOH" , "a" , "65" , "121124" );
- m_Code128.Rows.Add( "66" , "STX" , "b" , "66" , "121421" );
- m_Code128.Rows.Add( "67" , "ETX" , "c" , "67" , "141122" );
- m_Code128.Rows.Add( "68" , "EOT" , "d" , "68" , "141221" );
- m_Code128.Rows.Add( "69" , "ENQ" , "e" , "69" , "112214" );
- m_Code128.Rows.Add( "70" , "ACK" , "f" , "70" , "112412" );
- m_Code128.Rows.Add( "71" , "BEL" , "g" , "71" , "122114" );
- m_Code128.Rows.Add( "72" , "BS" , "h" , "72" , "122411" );
- m_Code128.Rows.Add( "73" , "HT" , "i" , "73" , "142112" );
- m_Code128.Rows.Add( "74" , "LF" , "j" , "74" , "142211" );
- m_Code128.Rows.Add( "75" , "VT" , "k" , "75" , "241211" );
- m_Code128.Rows.Add( "76" , "FF" , "I" , "76" , "221114" );
- m_Code128.Rows.Add( "77" , "CR" , "m" , "77" , "413111" );
- m_Code128.Rows.Add( "78" , "SO" , "n" , "78" , "241112" );
- m_Code128.Rows.Add( "79" , "SI" , "o" , "79" , "134111" );
- m_Code128.Rows.Add( "80" , "DLE" , "p" , "80" , "111242" );
- m_Code128.Rows.Add( "81" , "DC1" , "q" , "81" , "121142" );
- m_Code128.Rows.Add( "82" , "DC2" , "r" , "82" , "121241" );
- m_Code128.Rows.Add( "83" , "DC3" , "s" , "83" , "114212" );
- m_Code128.Rows.Add( "84" , "DC4" , "t" , "84" , "124112" );
- m_Code128.Rows.Add( "85" , "NAK" , "u" , "85" , "124211" );
- m_Code128.Rows.Add( "86" , "SYN" , "v" , "86" , "411212" );
- m_Code128.Rows.Add( "87" , "ETB" , "w" , "87" , "421112" );
- m_Code128.Rows.Add( "88" , "CAN" , "x" , "88" , "421211" );
- m_Code128.Rows.Add( "89" , "EM" , "y" , "89" , "212141" );
- m_Code128.Rows.Add( "90" , "SUB" , "z" , "90" , "214121" );
- m_Code128.Rows.Add( "91" , "ESC" , "{" , "91" , "412121" );
- m_Code128.Rows.Add( "92" , "FS" , "|" , "92" , "111143" );
- m_Code128.Rows.Add( "93" , "GS" , "}" , "93" , "111341" );
- m_Code128.Rows.Add( "94" , "RS" , "~" , "94" , "131141" );
- m_Code128.Rows.Add( "95" , "US" , "DEL" , "95" , "114113" );
- m_Code128.Rows.Add( "96" , "FNC3" , "FNC3" , "96" , "114311" );
- m_Code128.Rows.Add( "97" , "FNC2" , "FNC2" , "97" , "411113" );
- m_Code128.Rows.Add( "98" , "SHIFT" , "SHIFT" , "98" , "411311" );
- m_Code128.Rows.Add( "99" , "CODEC" , "CODEC" , "99" , "113141" );
- m_Code128.Rows.Add( "100" , "CODEB" , "FNC4" , "CODEB" , "114131" );
- m_Code128.Rows.Add( "101" , "FNC4" , "CODEA" , "CODEA" , "311141" );
- m_Code128.Rows.Add( "102" , "FNC1" , "FNC1" , "FNC1" , "411131" );
- m_Code128.Rows.Add( "103" , "StartA" , "StartA" , "StartA" , "211412" );
- m_Code128.Rows.Add( "104" , "StartB" , "StartB" , "StartB" , "211214" );
- m_Code128.Rows.Add( "105" , "StartC" , "StartC" , "StartC" , "211232" );
- m_Code128.Rows.Add( "106" , "Stop" , "Stop" , "Stop" , "2331112" );
- #endregion
- }
- ///<summary>
- ///获取128图形
- ///</summary>
- ///<paramname="p_Text">文字</param>
- ///<paramname="p_Code">编码</param>
- ///<returns>图形</returns>
- public BitmapGetCodeImage( string p_Text,Encodep_Code)
- {
- string _ViewText=p_Text;
- string _Text= "" ;
- IList< int >_TextNumb= new List< int >();
- int _Examine=0; //首位
- switch (p_Code)
- {
- case Encode.Code128C:
- _Examine=105;
- if (!((p_Text.Length&1)==0)) throw new Exception( "128C长度必须是偶数" );
- while (p_Text.Length!=0)
- { int _Temp=0;
- try
- {
- int _CodeNumb128=Int32.Parse(p_Text.Substring(0,2));
- }
- catch
- {
- throw new Exception( "128C必须是数字!" );
- }
- _Text+=GetValue(p_Code,p_Text.Substring(0,2), ref _Temp);
- _TextNumb.Add(_Temp);
- p_Text=p_Text.Remove(0,2);
- }
- break ;
- case Encode.EAN128:
- _Examine=105;
- if (!((p_Text.Length&1)==0)) throw new Exception( "EAN128长度必须是偶数" );
- _TextNumb.Add(102);
- _Text+= "411131" ;
- while (p_Text.Length!=0)
- {
- int _Temp=0;
- try
- {
- int _CodeNumb128=Int32.Parse(p_Text.Substring(0,2));
- }
- catch
- {
- throw new Exception( "128C必须是数字!" );
- }
- _Text+=GetValue(Encode.Code128C,p_Text.Substring(0,2), ref _Temp);
- _TextNumb.Add(_Temp);
- p_Text=p_Text.Remove(0,2);
- }
- break ;
- default :
- if (p_Code==Encode.Code128A)
- {
- _Examine=103;
- }
- else
- {
- _Examine=104;
- }
- while (p_Text.Length!=0)
- {
- int _Temp=0;
- string _ValueCode=GetValue(p_Code,p_Text.Substring(0,1), ref _Temp);
- if (_ValueCode.Length==0) throw new Exception( "无效的字符集!" +p_Text.Substring(0,1).ToString());
- _Text+=_ValueCode;
- _TextNumb.Add(_Temp);
- p_Text=p_Text.Remove(0,1);
- }
- break ;
- }
- if (_TextNumb.Count==0) throw new Exception( "错误的编码,无数据" );
- _Text=_Text.Insert(0,GetValue(_Examine)); //获取开始位
- for ( int i=0;i!=_TextNumb.Count;i++)
- {
- _Examine+=_TextNumb[i]*(i+1);
- }
- _Examine=_Examine%103; //获得严效位
- _Text+=GetValue(_Examine); //获取严效位
- _Text+= "2331112" ; //结束位
- Bitmap_CodeImage=GetImage(_Text);
- GetViewText(_CodeImage,_ViewText);
- return _CodeImage;
- }
- ///<summary>
- ///获取目标对应的数据
- ///</summary>
- ///<paramname="p_Code">编码</param>
- ///<paramname="p_Value">数值Ab30</param>
- ///<paramname="p_SetID">返回编号</param>
- ///<returns>编码</returns>
- private string GetValue(Encodep_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!=1) throw new Exception( "错误的编码" +p_Value.ToString());
- p_SetID=Int32.Parse(_Row[0][ "ID" ].ToString());
- return _Row[0][ "BandCode" ].ToString();
- }
- ///<summary>
- ///根据编号获得条纹
- ///</summary>
- ///<paramname="p_CodeId"></param>
- ///<returns></returns>
- private string GetValue( int p_CodeId)
- {
- DataRow[]_Row=m_Code128.Select( "ID='" +p_CodeId.ToString()+ "'" );
- if (_Row.Length!=1) throw new Exception( "验效位的编码错误" +p_CodeId.ToString());
- return _Row[0][ "BandCode" ].ToString();
- }
- ///<summary>
- ///获得条码图形
- ///</summary>
- ///<paramname="p_Text">文字</param>
- ///<returns>图形</returns>
- private BitmapGetImage( string p_Text)
- {
- char []_Value=p_Text.ToCharArray();
- int _Width=0;
- for ( int i=0;i!=_Value.Length;i++)
- {
- _Width+=Int32.Parse(_Value[i].ToString())*(m_Magnify+1);
- }
- Bitmap_CodeImage= new Bitmap(_Width,( int )m_Height);
- Graphics_Garphics=Graphics.FromImage(_CodeImage);
- //Pen_Pen;
- int _LenEx=0;
- for ( int i=0;i!=_Value.Length;i++)
- {
- int _ValueNumb=Int32.Parse(_Value[i].ToString())*(m_Magnify+1); //获取宽和放大系数
- if (!((i&1)==0))
- {
- //_Pen=newPen(Brushes.White,_ValueNumb);
- _Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx,0,_ValueNumb,( int )m_Height));
- }
- else
- {
- //_Pen=newPen(Brushes.Black,_ValueNumb);
- _Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx,0,_ValueNumb,( int )m_Height));
- }
- //_Garphics.(_Pen,newPoint(_LenEx,0),newPoint(_LenEx,m_Height));
- _LenEx+=_ValueNumb;
- }
- _Garphics.Dispose();
- return _CodeImage;
- }
- ///<summary>
- ///显示可见条码文字如果小于40不显示文字
- ///</summary>
- ///<paramname="p_Bitmap">图形</param>
- private void GetViewText(Bitmapp_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-10||_DrawSize.Width>p_Bitmap.Width)
- {
- _Graphics.Dispose();
- return ;
- }
- int _StarY=p_Bitmap.Height-( int )_DrawSize.Height;
- _Graphics.FillRectangle(Brushes.White, new Rectangle(0,_StarY,p_Bitmap.Width,( int )_DrawSize.Height));
- _Graphics.DrawString(p_ViewText,m_ValueFont,Brushes.Black,0,_StarY);
- }
- //12345678
- //(105+(1*12+2*34+3*56+4*78))%103=47
- //结果为starc+12+34+56+78+47+end
- }
- }
- }