.NET绘制条码Code128A,Code128B,Code128C,EAN128

.NET条码识别和解码控件Barcode Reader SDK Barcode Reader SDK for .NET是一款功能强大的条码识别控件,为开发人员添加条码识别和解码功能到.NET应用程序中,该控件可从图像以及扫描文档等识别、读取和解码几乎所有当前流行的1维条码,兼容Visual Studio 2005、2008、2010,同时支持WinForm和WebForm。 具体功能: 识别条码时为每个检测到的条码返回字符串和二进制值可辨别检测到条 阅读详情
 

发一个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    放大倍数    

使用

  1.  BandCode.Code128 _Code =  new  BandCode.Code128();
  2.             _Code.ValueFont =  new  Font( "宋体" , 10);
  3.          
  4.             pictureBox1.Image=_Code.GetCodeImage( "20081011001010020001" , BandCode.Code128.Encode.Code128C);
  5.             pictureBox1.Image.Save(@ "C:/B.BMP" );

完整的类

  1. using  System;
  2. using  System.Data;
  3. using  System.Collections.Generic;
  4. using  System.Text;
  5. using  System.Drawing;
  6. namespace  CopyDirectoryInfo
  7. {
  8.      /// <summary>
  9.      /// Code128A,Code128B,Code128C,EAN128条码
  10.      /// zgke@sina.com
  11.      /// qq:116149
  12.      /// </summary>
  13.      public   class  BandCode
  14.     {
  15.          public   class  Code128
  16.         {
  17.              private  DataTable m_Code128 = new  DataTable();
  18.              private   uint  m_Height = 40;
  19.              /// <summary>
  20.              /// 高度
  21.              /// </summary>
  22.              public   uint  Height {  get  {  return  m_Height; }  set  { m_Height = value; } }
  23.              private  Font m_ValueFont =  null ;
  24.              /// <summary>
  25.              /// 是否显示可见号码  如果为NULL不显示号码
  26.              /// </summary>
  27.              public  Font ValueFont {  get  {  return  m_ValueFont; }  set  { m_ValueFont = value; } }
  28.              private   byte  m_Magnify = 0;
  29.              /// <summary>
  30.              /// 放大倍数
  31.              /// </summary>
  32.              public   byte  Magnify {  get  {  return  m_Magnify; }  set  { m_Magnify = value; } }
  33.              /// <summary>
  34.              /// 条码类别
  35.              /// </summary>
  36.              public   enum  Encode
  37.             {
  38.                 Code128A,
  39.                 Code128B,
  40.                 Code128C,
  41.                 EAN128
  42.             }
  43.              public  Code128()
  44.             {
  45.                 m_Code128.Columns.Add( "ID" );
  46.                 m_Code128.Columns.Add( "Code128A" );
  47.                 m_Code128.Columns.Add( "Code128B" );
  48.                 m_Code128.Columns.Add( "Code128C" );
  49.                 m_Code128.Columns.Add( "BandCode" );
  50.                 m_Code128.CaseSensitive =  true ;
  51.                 #region 数据表
  52.                 m_Code128.Rows.Add( "0" ,  " " ,  " " ,  "00" ,  "212222" );
  53.                 m_Code128.Rows.Add( "1" ,  "!" ,  "!" ,  "01" ,  "222122" );
  54.                 m_Code128.Rows.Add( "2" ,  "/"" ,  "/"" ,  "02" ,  "222221" );
  55.                 m_Code128.Rows.Add( "3" ,  "#" ,  "#" ,  "03" ,  "121223" );
  56.                 m_Code128.Rows.Add( "4" ,  "$" ,  "$" ,  "04" ,  "121322" );
  57.                 m_Code128.Rows.Add( "5" ,  "%" ,  "%" ,  "05" ,  "131222" );
  58.                 m_Code128.Rows.Add( "6" ,  "&" ,  "&" ,  "06" ,  "122213" );
  59.                 m_Code128.Rows.Add( "7" ,  "'" ,  "'" ,  "07" ,  "122312" );
  60.                 m_Code128.Rows.Add( "8" ,  "(" ,  "(" ,  "08" ,  "132212" );
  61.                 m_Code128.Rows.Add( "9" ,  ")" ,  ")" ,  "09" ,  "221213" );
  62.                 m_Code128.Rows.Add( "10" ,  "*" ,  "*" ,  "10" ,  "221312" );
  63.                 m_Code128.Rows.Add( "11" ,  "+" ,  "+" ,  "11" ,  "231212" );
  64.                 m_Code128.Rows.Add( "12" ,  "," ,  "," ,  "12" ,  "112232" );
  65.                 m_Code128.Rows.Add( "13" ,  "-" ,  "-" ,  "13" ,  "122132" );
  66.                 m_Code128.Rows.Add( "14" ,  "." ,  "." ,  "14" ,  "122231" );
  67.                 m_Code128.Rows.Add( "15" ,  "/" ,  "/" ,  "15" ,  "113222" );
  68.                 m_Code128.Rows.Add( "16" ,  "0" ,  "0" ,  "16" ,  "123122" );
  69.                 m_Code128.Rows.Add( "17" ,  "1" ,  "1" ,  "17" ,  "123221" );
  70.                 m_Code128.Rows.Add( "18" ,  "2" ,  "2" ,  "18" ,  "223211" );
  71.                 m_Code128.Rows.Add( "19" ,  "3" ,  "3" ,  "19" ,  "221132" );
  72.                 m_Code128.Rows.Add( "20" ,  "4" ,  "4" ,  "20" ,  "221231" );
  73.                 m_Code128.Rows.Add( "21" ,  "5" ,  "5" ,  "21" ,  "213212" );
  74.                 m_Code128.Rows.Add( "22" ,  "6" ,  "6" ,  "22" ,  "223112" );
  75.                 m_Code128.Rows.Add( "23" ,  "7" ,  "7" ,  "23" ,  "312131" );
  76.                 m_Code128.Rows.Add( "24" ,  "8" ,  "8" ,  "24" ,  "311222" );
  77.                 m_Code128.Rows.Add( "25" ,  "9" ,  "9" ,  "25" ,  "321122" );
  78.                 m_Code128.Rows.Add( "26" ,  ":" ,  ":" ,  "26" ,  "321221" );
  79.                 m_Code128.Rows.Add( "27" ,  ";" ,  ";" ,  "27" ,  "312212" );
  80.                 m_Code128.Rows.Add( "28" ,  "<" ,  "<" ,  "28" ,  "322112" );
  81.                 m_Code128.Rows.Add( "29" ,  "=" ,  "=" ,  "29" ,  "322211" );
  82.                 m_Code128.Rows.Add( "30" ,  ">" ,  ">" ,  "30" ,  "212123" );
  83.                 m_Code128.Rows.Add( "31" ,  "?" ,  "?" ,  "31" ,  "212321" );
  84.                 m_Code128.Rows.Add( "32" ,  "@" ,  "@" ,  "32" ,  "232121" );
  85.                 m_Code128.Rows.Add( "33" ,  "A" ,  "A" ,  "33" ,  "111323" );
  86.                 m_Code128.Rows.Add( "34" ,  "B" ,  "B" ,  "34" ,  "131123" );
  87.                 m_Code128.Rows.Add( "35" ,  "C" ,  "C" ,  "35" ,  "131321" );
  88.                 m_Code128.Rows.Add( "36" ,  "D" ,  "D" ,  "36" ,  "112313" );
  89.                 m_Code128.Rows.Add( "37" ,  "E" ,  "E" ,  "37" ,  "132113" );
  90.                 m_Code128.Rows.Add( "38" ,  "F" ,  "F" ,  "38" ,  "132311" );
  91.                 m_Code128.Rows.Add( "39" ,  "G" ,  "G" ,  "39" ,  "211313" );
  92.                 m_Code128.Rows.Add( "40" ,  "H" ,  "H" ,  "40" ,  "231113" );
  93.                 m_Code128.Rows.Add( "41" ,  "I" ,  "I" ,  "41" ,  "231311" );
  94.                 m_Code128.Rows.Add( "42" ,  "J" ,  "J" ,  "42" ,  "112133" );
  95.                 m_Code128.Rows.Add( "43" ,  "K" ,  "K" ,  "43" ,  "112331" );
  96.                 m_Code128.Rows.Add( "44" ,  "L" ,  "L" ,  "44" ,  "132131" );
  97.                 m_Code128.Rows.Add( "45" ,  "M" ,  "M" ,  "45" ,  "113123" );
  98.                 m_Code128.Rows.Add( "46" ,  "N" ,  "N" ,  "46" ,  "113321" );
  99.                 m_Code128.Rows.Add( "47" ,  "O" ,  "O" ,  "47" ,  "133121" );
  100.                 m_Code128.Rows.Add( "48" ,  "P" ,  "P" ,  "48" ,  "313121" );
  101.                 m_Code128.Rows.Add( "49" ,  "Q" ,  "Q" ,  "49" ,  "211331" );
  102.                 m_Code128.Rows.Add( "50" ,  "R" ,  "R" ,  "50" ,  "231131" );
  103.                 m_Code128.Rows.Add( "51" ,  "S" ,  "S" ,  "51" ,  "213113" );
  104.                 m_Code128.Rows.Add( "52" ,  "T" ,  "T" ,  "52" ,  "213311" );
  105.                 m_Code128.Rows.Add( "53" ,  "U" ,  "U" ,  "53" ,  "213131" );
  106.                 m_Code128.Rows.Add( "54" ,  "V" ,  "V" ,  "54" ,  "311123" );
  107.                 m_Code128.Rows.Add( "55" ,  "W" ,  "W" ,  "55" ,  "311321" );
  108.                 m_Code128.Rows.Add( "56" ,  "X" ,  "X" ,  "56" ,  "331121" );
  109.                 m_Code128.Rows.Add( "57" ,  "Y" ,  "Y" ,  "57" ,  "312113" );
  110.                 m_Code128.Rows.Add( "58" ,  "Z" ,  "Z" ,  "58" ,  "312311" );
  111.                 m_Code128.Rows.Add( "59" ,  "[" ,  "[" ,  "59" ,  "332111" );
  112.                 m_Code128.Rows.Add( "60" ,  "//", " // ", " 60 ", " 314111");
  113.                 m_Code128.Rows.Add( "61" ,  "]" ,  "]" ,  "61" ,  "221411" );
  114.                 m_Code128.Rows.Add( "62" ,  "^" ,  "^" ,  "62" ,  "431111" );
  115.                 m_Code128.Rows.Add( "63" ,  "_" ,  "_" ,  "63" ,  "111224" );
  116.                 m_Code128.Rows.Add( "64" ,  "NUL" ,  "`" ,  "64" ,  "111422" );
  117.                 m_Code128.Rows.Add( "65" ,  "SOH" ,  "a" ,  "65" ,  "121124" );
  118.                 m_Code128.Rows.Add( "66" ,  "STX" ,  "b" ,  "66" ,  "121421" );
  119.                 m_Code128.Rows.Add( "67" ,  "ETX" ,  "c" ,  "67" ,  "141122" );
  120.                 m_Code128.Rows.Add( "68" ,  "EOT" ,  "d" ,  "68" ,  "141221" );
  121.                 m_Code128.Rows.Add( "69" ,  "ENQ" ,  "e" ,  "69" ,  "112214" );
  122.                 m_Code128.Rows.Add( "70" ,  "ACK" ,  "f" ,  "70" ,  "112412" );
  123.                 m_Code128.Rows.Add( "71" ,  "BEL" ,  "g" ,  "71" ,  "122114" );
  124.                 m_Code128.Rows.Add( "72" ,  "BS" ,  "h" ,  "72" ,  "122411" );
  125.                 m_Code128.Rows.Add( "73" ,  "HT" ,  "i" ,  "73" ,  "142112" );
  126.                 m_Code128.Rows.Add( "74" ,  "LF" ,  "j" ,  "74" ,  "142211" );
  127.                 m_Code128.Rows.Add( "75" ,  "VT" ,  "k" ,  "75" ,  "241211" );
  128.                 m_Code128.Rows.Add( "76" ,  "FF" ,  "I" ,  "76" ,  "221114" );
  129.                 m_Code128.Rows.Add( "77" ,  "CR" ,  "m" ,  "77" ,  "413111" );
  130.                 m_Code128.Rows.Add( "78" ,  "SO" ,  "n" ,  "78" ,  "241112" );
  131.                 m_Code128.Rows.Add( "79" ,  "SI" ,  "o" ,  "79" ,  "134111" );
  132.                 m_Code128.Rows.Add( "80" ,  "DLE" ,  "p" ,  "80" ,  "111242" );
  133.                 m_Code128.Rows.Add( "81" ,  "DC1" ,  "q" ,  "81" ,  "121142" );
  134.                 m_Code128.Rows.Add( "82" ,  "DC2" ,  "r" ,  "82" ,  "121241" );
  135.                 m_Code128.Rows.Add( "83" ,  "DC3" ,  "s" ,  "83" ,  "114212" );
  136.                 m_Code128.Rows.Add( "84" ,  "DC4" ,  "t" ,  "84" ,  "124112" );
  137.                 m_Code128.Rows.Add( "85" ,  "NAK" ,  "u" ,  "85" ,  "124211" );
  138.                 m_Code128.Rows.Add( "86" ,  "SYN" ,  "v" ,  "86" ,  "411212" );
  139.                 m_Code128.Rows.Add( "87" ,  "ETB" ,  "w" ,  "87" ,  "421112" );
  140.                 m_Code128.Rows.Add( "88" ,  "CAN" ,  "x" ,  "88" ,  "421211" );
  141.                 m_Code128.Rows.Add( "89" ,  "EM" ,  "y" ,  "89" ,  "212141" );
  142.                 m_Code128.Rows.Add( "90" ,  "SUB" ,  "z" ,  "90" ,  "214121" );
  143.                 m_Code128.Rows.Add( "91" ,  "ESC" ,  "{" ,  "91" ,  "412121" );
  144.                 m_Code128.Rows.Add( "92" ,  "FS" ,  "|" ,  "92" ,  "111143" );
  145.                 m_Code128.Rows.Add( "93" ,  "GS" ,  "}" ,  "93" ,  "111341" );
  146.                 m_Code128.Rows.Add( "94" ,  "RS" ,  "~" ,  "94" ,  "131141" );
  147.                 m_Code128.Rows.Add( "95" ,  "US" ,  "DEL" ,  "95" ,  "114113" );
  148.                 m_Code128.Rows.Add( "96" ,  "FNC3" ,  "FNC3" ,  "96" ,  "114311" );
  149.                 m_Code128.Rows.Add( "97" ,  "FNC2" ,  "FNC2" ,  "97" ,  "411113" );
  150.                 m_Code128.Rows.Add( "98" ,  "SHIFT" ,  "SHIFT" ,  "98" ,  "411311" );
  151.                 m_Code128.Rows.Add( "99" ,  "CODEC" ,  "CODEC" ,  "99" ,  "113141" );
  152.                 m_Code128.Rows.Add( "100" ,  "CODEB" ,  "FNC4" ,  "CODEB" ,  "114131" );
  153.                 m_Code128.Rows.Add( "101" ,  "FNC4" ,  "CODEA" ,  "CODEA" ,  "311141" );
  154.                 m_Code128.Rows.Add( "102" ,  "FNC1" ,  "FNC1" ,  "FNC1" ,  "411131" );
  155.                 m_Code128.Rows.Add( "103" ,  "StartA" ,  "StartA" ,  "StartA" ,  "211412" );
  156.                 m_Code128.Rows.Add( "104" ,  "StartB" ,  "StartB" ,  "StartB" ,  "211214" );
  157.                 m_Code128.Rows.Add( "105" ,  "StartC" ,  "StartC" ,  "StartC" ,  "211232" );
  158.                 m_Code128.Rows.Add( "106" ,  "Stop" ,  "Stop" ,  "Stop" ,  "2331112" );
  159.                 #endregion
  160.             }
  161.              /// <summary>
  162.              /// 获取128图形
  163.              /// </summary>
  164.              /// <param name="p_Text">文字</param>
  165.              /// <param name="p_Code">编码</param>      
  166.              /// <returns>图形</returns>
  167.              public  Bitmap GetCodeImage( string  p_Text,Encode p_Code)
  168.             {
  169.                  string  _ViewText = p_Text;
  170.                  string  _Text =  "" ;
  171.                 IList< int > _TextNumb= new  List< int >();
  172.                  int  _Examine = 0;   //首位
  173.                  switch  (p_Code)
  174.                 {
  175.                      case  Encode.Code128C:
  176.                         _Examine = 105;
  177.                          if  (!((p_Text.Length & 1) == 0))  throw   new  Exception( "128C长度必须是偶数" );
  178.                          while  (p_Text.Length != 0)
  179.                         {    int  _Temp = 0;
  180.                              try
  181.                             {
  182.                                  int  _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
  183.                             }
  184.                              catch
  185.                             {
  186.                                  throw   new  Exception( "128C必须是数字!" );    
  187.                             }
  188.                             _Text += GetValue(p_Code, p_Text.Substring(0, 2),  ref  _Temp);
  189.                             _TextNumb.Add(_Temp);
  190.                             p_Text = p_Text.Remove(0, 2);
  191.                         }                 
  192.                          break ;   
  193.                      case  Encode.EAN128:
  194.                         _Examine = 105;
  195.                          if  (!((p_Text.Length & 1) == 0))  throw   new  Exception( "EAN128长度必须是偶数" );                
  196.                         _TextNumb.Add(102);
  197.                         _Text +=  "411131" ;
  198.                          while  (p_Text.Length != 0)
  199.                         {
  200.                              int  _Temp = 0;
  201.                              try
  202.                             {
  203.                                  int  _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
  204.                             }
  205.                              catch
  206.                             {
  207.                                  throw   new  Exception( "128C必须是数字!" );    
  208.                             }
  209.                             _Text += GetValue(Encode.Code128C, p_Text.Substring(0, 2),  ref  _Temp);
  210.                             _TextNumb.Add(_Temp);
  211.                             p_Text = p_Text.Remove(0, 2);
  212.                         }
  213.                          break ;
  214.                      default :
  215.                          if  (p_Code == Encode.Code128A)
  216.                         {
  217.                             _Examine = 103;
  218.                         }
  219.                          else
  220.                         {
  221.                             _Examine = 104;
  222.                         }
  223.                         
  224.                          while  (p_Text.Length!=0)
  225.                         {
  226.                              int  _Temp=0;
  227.                              string  _ValueCode = GetValue(p_Code, p_Text.Substring(0, 1),  ref  _Temp);
  228.                              if  (_ValueCode.Length == 0)  throw   new  Exception( "无效的字符集!"  + p_Text.Substring(0, 1).ToString());
  229.                             _Text += _ValueCode;
  230.                             _TextNumb.Add(_Temp);
  231.                             p_Text = p_Text.Remove(0, 1);
  232.                         }                       
  233.                          break ;
  234.                 }
  235.                  if  (_TextNumb.Count == 0)  throw   new  Exception( "错误的编码,无数据" );
  236.                _Text= _Text.Insert(0, GetValue(_Examine));  //获取开始位
  237.                                 
  238.                  for  ( int  i = 0; i != _TextNumb.Count; i++)
  239.                 {
  240.                     _Examine += _TextNumb[i] * (i + 1);
  241.                 }
  242.                 _Examine = _Examine % 103;            //获得严效位
  243.                 _Text+= GetValue(_Examine);   //获取严效位
  244.                 _Text +=  "2331112" ;  //结束位
  245.                 Bitmap _CodeImage = GetImage(_Text);
  246.                 GetViewText(_CodeImage, _ViewText);
  247.                  return  _CodeImage; 
  248.             }
  249.              /// <summary>
  250.              /// 获取目标对应的数据
  251.              /// </summary>
  252.              /// <param name="p_Code">编码</param>
  253.              /// <param name="p_Value">数值 A b  30</param>
  254.              /// <param name="p_SetID">返回编号</param>
  255.              /// <returns>编码</returns>
  256.              private   string  GetValue(Encode p_Code,  string  p_Value, ref   int  p_SetID)
  257.             {
  258.                  if  (m_Code128 ==  null )  return   "" ;
  259.                 DataRow[] _Row = m_Code128.Select(p_Code.ToString()+ "='"  + p_Value +  "'" );
  260.                  if  (_Row.Length != 1)  throw   new  Exception( "错误的编码"  + p_Value.ToString());
  261.                 p_SetID = Int32.Parse(_Row[0][ "ID" ].ToString());
  262.                  return  _Row[0][ "BandCode" ].ToString();               
  263.             }
  264.              /// <summary>
  265.              /// 根据编号获得条纹
  266.              /// </summary>
  267.              /// <param name="p_CodeId"></param>
  268.              /// <returns></returns>
  269.              private   string  GetValue( int  p_CodeId)
  270.             {
  271.                 DataRow[] _Row = m_Code128.Select( "ID='"  + p_CodeId.ToString() +  "'" );
  272.                  if  (_Row.Length != 1)  throw   new  Exception( "验效位的编码错误"  + p_CodeId.ToString());               
  273.                  return  _Row[0][ "BandCode" ].ToString();        
  274.             }
  275.              /// <summary>
  276.              /// 获得条码图形
  277.              /// </summary>
  278.              /// <param name="p_Text">文字</param>
  279.              /// <returns>图形</returns>
  280.              private  Bitmap GetImage( string  p_Text)
  281.             {
  282.                  char [] _Value = p_Text.ToCharArray();
  283.                  int  _Width=0;
  284.                  for  ( int  i = 0; i != _Value.Length; i++)
  285.                 {
  286.                     _Width += Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);
  287.                 }
  288.                 Bitmap _CodeImage =  new  Bitmap(_Width,( int ) m_Height);
  289.                 Graphics _Garphics= Graphics.FromImage(_CodeImage);           
  290.                  //Pen _Pen;
  291.                  int  _LenEx = 0;
  292.                  for  ( int  i = 0; i != _Value.Length; i++)
  293.                 {
  294.                      int  _ValueNumb = Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);   //获取宽和放大系数
  295.                      if  (!((i & 1) == 0))
  296.                     {
  297.                          //_Pen = new Pen(Brushes.White, _ValueNumb);
  298.                         _Garphics.FillRectangle(Brushes.White,  new  Rectangle(_LenEx, 0, _ValueNumb,( int ) m_Height));
  299.                     }
  300.                      else
  301.                     {
  302.                          //_Pen = new Pen(Brushes.Black, _ValueNumb);
  303.                         _Garphics.FillRectangle(Brushes.Black,  new  Rectangle(_LenEx, 0, _ValueNumb,( int ) m_Height));
  304.                     }
  305.                      //_Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx, m_Height));
  306.                     _LenEx += _ValueNumb;
  307.                 }
  308.                 _Garphics.Dispose();
  309.                  return  _CodeImage;
  310.             }
  311.              /// <summary>
  312.              /// 显示可见条码文字 如果小于40 不显示文字
  313.              /// </summary>
  314.              /// <param name="p_Bitmap">图形</param>           
  315.              private   void  GetViewText(Bitmap p_Bitmap, string  p_ViewText)
  316.             {
  317.                  if  (m_ValueFont ==  null )  return ;
  318.                
  319.                 Graphics _Graphics = Graphics.FromImage(p_Bitmap);                
  320.                 SizeF _DrawSize =_Graphics.MeasureString(p_ViewText,m_ValueFont);
  321.                  if  (_DrawSize.Height > p_Bitmap.Height-10 || _DrawSize.Width > p_Bitmap.Width)
  322.                 {
  323.                     _Graphics.Dispose();
  324.                      return ;
  325.                 }          
  326.     
  327.                  int  _StarY= p_Bitmap.Height-( int )_DrawSize.Height;
  328.                 _Graphics.FillRectangle(Brushes.White,  new  Rectangle(0, _StarY, p_Bitmap.Width, ( int )_DrawSize.Height));
  329.                 _Graphics.DrawString(p_ViewText, m_ValueFont, Brushes.Black, 0, _StarY);
  330.             }
  331.            
  332.              //12345678
  333.              //(105 + (1 * 12 + 2 * 34 + 3 * 56 + 4 *78)) % 103 = 47
  334.              //结果为starc +12 +34 +56 +78 +47 +end
  335.         }
  336.     }
  337. }
http://blog.youkuaiyun.com/zgke/archive/2008/12/10/3488866.aspx
BarCodeWiz条码控件实战演示项目 ActiveX控件是微软在1990年代中期提出的一套基于组件对象模型(Component Object Model, COM)的软件架构,旨在为Windows平台提供可复用、跨语言调用的可视化和非可视化控件。其核心设计理念在于将功能模块封装成独立二进制单元(通常是DLL或OCX文件),供不同开发环境如VB6、C++、ASP等直接引用并实例化使用。从技术本质上看,ActiveX控件继承自OLE(Object Linking and Embedding)技术,但进一步扩展了网络部署能力与事件驱动机制。 阅读详情

相关推荐

.net使用Code128标准生成条形码

.net使用Code128标准生成条形码(一维码),直接生成图片格式,Qrcode.cs文件中,有直接调用的方法

批量生成Code128- C条码

  Code128码是一种高密度的一维条码,可以表示全部128个ASCII码字符(数字、字母的大、小写、符号和控制符),所以称128码。而Code128 A码,Code128 B码,Code128 C码都是Code128码的子集,Code128 C码仅可以表示100个“两位”数字编码(00-99),比如:123456、90870965。下面我们就看看如何批量生成Code128- C条码。   首先打开条码标签软件,新建一个空白标签,点击软件上方的“设置数据源”按钮,选择保存有条码数据的Excel表格导入到

sqxskj的博客 1751

FastReport.Net v2017.1.16(绿色、无水印)

FastReport是一款让开发者快速开发报表的工具,可以结合.net 去开发,也可以单独的使用,功能还算不错。这个是绿色版,可以正常使用,打印无水印。

vb.net 打印条形码code39、code128A、code128C、code128Auto(picturebox和打印机)封装类

调用该类的方法后,会返回形如bsbssbsssbbbssbbssbbss这样的字符串。然后您可以根据这串字符,指定位置和打印介质来打印到picturebox或者打印机。上面举的例子是使用code128auto来打印到图像框和打印机。类的工作是计算出哪个位置打线条,哪个位置不打。code128auto打印出来的条码即短,又不受条码位数限制。而code128C只能打印偶数位的条码。auto即,如果是奇数,那么前偶数个用128C打,最后一位,先改变编码再打印。具体规则,网上有,我就不搬了。.........

superfans98的专栏 2980

FrNet_2017.1.16 和谐版无水印

FrNet_2017.1.16 和谐版无水印 彻底破解,导出都没有demo字样了,是最新版。仅限学习研究使用,请买支持正版。

西门子PLC1200与CB1241模块的Modbus RTU从站配置全流程(附串口调试技巧)

本文详细介绍了西门子S7-1200 PLC与CB1241通信模块实现Modbus RTU从站配置的全流程,包括硬件接线规范、TIA Portal工程组态、通信指令编程及串口调试技巧。通过实战案例和常见错误处理方案,帮助工程师快速搭建稳定的工业通信系统,提升自动化设备的互联互通能力。

weixin_29165725的博客 327

C#Code128条形码生成

Code128码简介 Code128码于1981年推出,是一种长度可变、连续性的字母数字条码。与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大。 Code128特性: 1、具有A、B、C三种不同的编码类型,可提供标准ASCII中128个字元的编码使用; 2、允许双向扫描; 3、可自行决定是否加上检验位; 4、条码长度可调,但包括开始位...

qq_43857510的博客 2454

QT触摸屏开发:如何通过重写事件处理实现精准按键长按检测

本文针对QT触摸屏开发中按键长按检测不精准的常见问题,深入剖析了传统信号机制失效的原因,并提供了通过重写事件处理函数(event)的解决方案。文章详细介绍了创建自定义TouchButton类、直接处理QTouchEvent以实现可靠长按检测的完整步骤与代码示例,并分享了进阶优化与避坑指南,帮助开发者实现跨平台一致的精准交互。

weixin_29207149的博客 95

C#.NET生成条形码(Code39和Code128)

项目开发中经常会用到生成条形码功能,根据某些唯一性内容生成条形码后用扫描枪扫码,可快速地识别信息。本文介绍常用的两种条形码Code39和Code128,适合生成自定义内容的条形码。 Code39条形码介绍: 一)Code39条形码特点 1、能够对任意长度的数据进行编码。其局限在于印刷品的长度和条码阅读器的识别范围。 2、支持设备广泛。目前几乎所有的条形码阅读设备都能阅读Code39码,打印机也是同样情况。 3、编制简单。简单的开发技术就能快速生成相应的编码图像。 4、一般Code39码由5条

wnety的专栏 1万+

IPsec (主模式,野蛮模式)

IPsec vpn的主模式和野蛮模式

七汣的博客 3415

RS485设备联网避坑指南:塔石串口服务器在MODBUS平台中的3个关键配置项

本文针对塔石串口服务器在MODBUS物联网平台接入中的常见问题,详细解析了三个关键配置项:工作模式选择、远程端口与保活机制、寄存器映射与轮询策略。通过对比错误与正确配置案例,帮助工程师避开配置陷阱,实现RS-485设备的稳定、高效联网,提升批量部署的成功率与系统可靠性。

weixin_29281941的博客 407

barcodelib支持的25种条码格式完全指南:从UPC到Code 128

barcodelib是一个强大的C#条码图像生成库,支持从UPC到Code 128的25种主流条码格式。无论您是零售业开发者、物流系统工程师还是库存管理软件创建者,这个免费开源的库都能为您提供简单快速的条码生成解决方案。本指南将详细介绍每种条码格式的特点、应用场景和使用方法,帮助您快速掌握这个完整的条码生成工具。 ## 📊 条码格式分类概览 barcodelib支持的25种条码格式可以分为五

gitblog_00707的博客 492

DeepQA: A Unified Transcriptome-Based Aging Clock Using Deep Neural Networks

摘要: 本研究针对转录组衰老时钟存在的关键局限——仅在健康样本训练导致对患病个体预测偏差的问题,提出DeepQA,一种基于专家混合架构与新型Hinge-MAE损失函数的深度学习模型。通过同时利用健康与患病个体的异质数据训练,DeepQA显著提升预测精度:在健康个体上MAE比现有方法低1.5年,且是首个能正确处理五类疾病条件的模型。其创新性体现在: 方法学突破:Hinge-MAE损失函数消除健康/患病样本的训练偏差,专家混合架构高效整合多队列数据; 流程革新:摒弃传统基因预筛选步骤,通过显著图分析直接识别衰老

qq_44050612的博客 125

.NET Neodynamic条码识别控件Barcode Reader SDK

Barcode Reader SDK for .NET是一款功能强大的条码识别控件,为开发人员添加条码识别和解码功能到.NET应用程序中,该控件可从图像以及扫描文档等识别、读取和解码几乎所有当前流行的1维条码,兼容Visual Studio 2005、2008、2010,同时支持WinForm和WebForm。 具体功能: 识别条码时为每个检测到的条码返回字符串和二进制值可辨别检测到条

飞到控件中 1280

Unity 热更新技术 |(六)xLua框架学习最新系列完整教程

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来先从XLua学习使用 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

【以太网硬件十九】SGMII到底能不能直接出光模块?

详细解释为什么SGMII可以直接出光模块及其使用限制

highman110的博客 1万+

ASP.net(c#)生成条形码

using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using

3080

机床上位机实战:CNC设备数据采集+工艺参数存储全流程(附C#代码+SQL设计)

如果能正常输出转速和状态,说明通信通了——这步是基础,没通的话别往下走,先查CNC的IP对不对、Modbus功能有没有开、地址是不是错了(我当初卡了2小时,发现是Fanuc的Modbus从站地址设成了2,不是默认1)。这篇文章就把整个开发过程拆透:从CNC通信协议选型,到数据采集代码落地,再到工艺参数的数据库设计,连中间踩过的“Fanuc系统寄存器地址对应错”“断连后数据补传”这些坑都给大家说清楚,新手跟着做也能跑通。工艺参数要跟“工单”和“设备”绑定,不然查的时候不知道是哪个工单、哪台设备的参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 792

Barcode Reader SDK for .NET条码识别控件使用介绍及下载

Barcode Reader SDK for .NET是一款功能强大的条码识别控件,为开发人员添加条码识别和解码功能到.NET应用程序中,该控件可从图像以及扫描文档等识别、读取和解码几乎所有当前流行的1维条码,兼容Visual Studio 2005、2008、2010,同时支持WinForm和WebForm。 具体功能: 识别条码时为每个检测到的条码返回字符串和二进制值可辨别检测到条

方案专家 1995

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

(zxing.net)一维码Code 128的简介、实现与解码

一、简介 一维码Code 128:1981年推出,是一种长度可变、连续性的字母数字条码。与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大。 Code 128特性: 具有A、B、C三种不同的编码类型,可提供标准ASCII中128个字元的编码使用; 允许双向扫描; 可自行决定是否加上检验位; 条码长度可调,但包括开始位和结...

weixin_30289831的博客 1080

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【亲测免费】探索ZXing-C++:高效且跨平台的条码处理库

ZXing-C++("zebra crossing")是一款开源的多格式线性/矩阵条码图像处理库,采用C++实现。它最初从Java版ZXing库移植而来,但经过进一步开发,在运行时和检测性能方面有了许多改进,能够读写多种格式的条码。 ## 🚀 ZXing-C++的核心优势 ZXing-C++作为一款专业的条码处理库,具有多项显著优势: - **纯C++实现**:采用C++17/C++20标

gitblog_00438的博客 791

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ZXing:一个扫描条码的基础库

ZXing是一个由Google开源的基础条码扫描库,支持识别多种一维和二维码格式(如UPC、QR Code等)。该库以Java编写,已被移植到多种语言平台。其优点在于解决了条码识别的底层技术难题,开发者只需调用简单接口即可实现功能。虽然项目目前处于维护模式,但其核心算法仍被广泛应用,并有活跃的社区移植版本(如C++、Python等)。适合需要快速集成条码识别功能的各种应用场景,如零售、物流等系统。凭借33,996 GitHub Star和十多年技术沉淀,ZXing仍是条码识别领域的可靠选择。

dongtingdev437的博客 218

Code 128 Barcode Font Advantage Package条形码控件字体包

Code 128 Barcode Font Advantage Package条码控件字体包包含了6种不同格式的18种不同的字体样式,可以在Windows, Macintosh, UNIX等多种操作系统下使用。同时您还可以获得相应的字体工具、宏和字体源码编辑工具,更好的方便您在您的应用程序中使用字体样式。具体功能:Code 128 Font Advantage Package...

weixin_34262482的博客 1061

Code128 Fontware条形码控件

Code128 Fontware使你的Windows/Linux/UNIX/Mac 下的应用程序创建Code128条码变得极其容易,并且提供了TrueType,PostScript Type 1, PostScript Type 3、OpenType 字体,插件支持Code128(A,B,C)和UCC/EAN 128,可以整合控件到Crystal Reports, Word, Excel, A

1112
上一篇: C#绘制条码CODE39和CODE39全码模式
下一篇: .NET 绘制 EAN13 (商品条码)
heyangbin
博客等级 码龄19年 57粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值