.NET 绘制 EAN13 (商品条码)

    技术2022-05-11  5

    <script type="text/javascript"> </script> <script class="blogstory"> </script>

    EAN商品条码的类

    这个使用的比较多

    其实 前面的编码是根据前面的6来判断的。是类型A还是类型B

    效果

    使用方法

    //获取验证位              char  _ISBN=MyImage.BandCode.EAN13.EAN13ISBN( "690102803695" );             MessageBox.Show(_ISBN.ToString());      MyImage.BandCode.EAN13 _EAN13Code =  new  MyImage.BandCode.EAN13();             _EAN13Code.Magnify = 1;             _EAN13Code.Heigth = 100;             _EAN13Code.FontSize = 16;             pictureBox1.Image=_EAN13Code.GetCodeImage( "6901028036955" );             pictureBox1.Image.Save(@ "C:/1.bmp" );

     

    具体绘制类

     

    using  System; using  System.Collections; using  System.ComponentModel; using  System.Drawing; using  System.Data; namespace  MyImage.BandCode {      public   class  EAN13     {          private  DataTable m_EAN13 =  new  DataTable();          public  EAN13()         {             m_EAN13.Columns.Add( "ID" );             m_EAN13.Columns.Add( "Type" );             m_EAN13.Columns.Add( "A" );             m_EAN13.Columns.Add( "B" );             m_EAN13.Columns.Add( "C" );             m_EAN13.Rows.Add( "0""AAAAAA""0001101""0100111""1110010" );             m_EAN13.Rows.Add( "1""AABABB""0011001""0110011""1100110" );             m_EAN13.Rows.Add( "2""AABBAB""0010011""0011011""1101100" );             m_EAN13.Rows.Add( "3""AABBBA""0111101""0100001""1000010" );             m_EAN13.Rows.Add( "4""ABAABB""0100011""0011101""1011100" );             m_EAN13.Rows.Add( "5""ABBAAB""0110001""0111001""1001110" );             m_EAN13.Rows.Add( "6""ABBBAA""0101111""0000101""1010000" );             m_EAN13.Rows.Add( "7""ABABAB""0111011""0010001""1000100" );             m_EAN13.Rows.Add( "8""ABABBA""0110111""0001001""1001000" );             m_EAN13.Rows.Add( "9""ABBABA""0001011""0010111""1110100" );         }          private   uint  m_Height = 40;          /// <summary>          /// 绘制高          /// </summary>          public   uint  Heigth {  get  {  return  m_Height; }  set  { m_Height = value; } }          private   byte  m_FontSize = 0;          /// <summary>          /// 字体大小(宋体)          /// </summary>          public   byte  FontSize {  get  {  return  m_FontSize; }  set  { m_FontSize = value; } }                  private   byte  m_Magnify = 0;          /// <summary>               /// 放大系数              /// </summary>          public   byte  Magnify {  get  {  return  m_Magnify; }  set  { m_Magnify = value; } }          public  Bitmap GetCodeImage( string  p_Text)         {              if  (p_Text.Length != 13)  throw   new  Exception( "数字不是13位!" );              string  _CodeText = p_Text.Remove(0, 1);              string  _CodeIndex =  "101" ;              char [] _LeftType = GetValue(p_Text.Substring(0, 1),  "Type" ).ToCharArray();              for  ( int  i = 0; i != 6; i++)             {                 _CodeIndex += GetValue(_CodeText.Substring(0, 1), _LeftType[i].ToString());                 _CodeText = _CodeText.Remove(0, 1);             }                          _CodeIndex +=  "01010" ;                           for  ( int  i = 0; i != 6; i++)             {                 _CodeIndex += GetValue(_CodeText.Substring(0, 1),  "C" );                 _CodeText = _CodeText.Remove(0, 1);             }                       _CodeIndex +=  "101" ;              return  GetImage(_CodeIndex, p_Text);         }          /// <summary>          /// 获取目标对应的数据          /// </summary>          /// <param name="p_Code">编码</param>          /// <param name="p_Value">类型</param>                  /// <returns>编码</returns>          private   string  GetValue( string  p_Value,  string  p_Type)         {              if  (m_EAN13 ==  nullreturn   "" ;             DataRow[] _Row = m_EAN13.Select( "ID='"  + p_Value +  "'" );              if  (_Row.Length != 1)  throw   new  Exception( "错误的编码"  + p_Value.ToString());              return  _Row[0][p_Type].ToString();         }          /// <summary>          /// 绘制编码图形          /// </summary>          /// <param name="p_Text">编码</param>          /// <returns>图形</returns>          private  Bitmap GetImage( string  p_Text, string  p_ViewText)         {              char [] _Value = p_Text.ToCharArray();              int  _FontWidth = 0;             Font _MyFont =  null ;              if  (m_FontSize != 0)             {                 #region 获取符合大小的字体                 _MyFont =  new  Font( "宋体" , m_FontSize);                 Bitmap _MyFontBmp =  new  Bitmap(m_FontSize, m_FontSize);                 Graphics _FontGraphics = Graphics.FromImage(_MyFontBmp);                                   for  ( byte  i = m_FontSize; i != 0; i--)                 {                     SizeF _DrawSize = _FontGraphics.MeasureString(p_ViewText.Substring(0, 1), _MyFont);                      if  (_DrawSize.Height > m_FontSize)                     {                         _MyFont =  new  Font( "宋体" , i);                     }                      else                     {                         _FontWidth = ( int )_DrawSize.Width;                          break ;                     }                 }                 #endregion             }              if  (ScanDrawText(_MyFont, p_Text, _FontWidth) ==  false )             {                 _FontWidth = 0;                 m_FontSize = 0;             }              //宽 == 需要绘制的数量*放大倍数 + 两个字的宽                Bitmap _CodeImage =  new  Bitmap(_Value.Length * (( int )m_Magnify + 1) + (_FontWidth * 2), ( int )m_Height);             Graphics _Garphics = Graphics.FromImage(_CodeImage);             _Garphics.FillRectangle(Brushes.White,  new  Rectangle(0, 0, _CodeImage.Width, _CodeImage.Height));                                         int  _Height = 0;              int  _LenEx = _FontWidth;              for  ( int  i = 0; i != _Value.Length; i++)             {                  int  _DrawWidth = m_Magnify + 1;                  if  (i == 0 || i == 2 || i==46 || i==48 || i==92 || i==94)                 {                     _Height = ( int )m_Height;                                   }                  else                 {                     _Height = ( int )m_Height - m_FontSize;                 }                  if  (_Value[i] ==  '1' )                 {                     _Garphics.FillRectangle(Brushes.Black,  new  Rectangle(_LenEx, 0, _DrawWidth, _Height));                                    }                  else                 {                     _Garphics.FillRectangle(Brushes.White,  new  Rectangle(_LenEx, 0, _DrawWidth, _Height));                 }                 _LenEx += _DrawWidth;                           }              //绘制文字              if  (_FontWidth != 0 && m_FontSize != 0)             {                  int  _StarX = 0;                  int  _StarY=( int )m_Height - _MyFont.Height;                 _Garphics.DrawString(p_ViewText.Substring(0, 1), _MyFont, Brushes.Black, 0, _StarY);                 _StarX = _FontWidth + (3 * (m_Magnify + 1));                 _Garphics.DrawString(p_ViewText.Substring(1, 6), _MyFont, Brushes.Black, _StarX, _StarY);                 _StarX = _FontWidth + (50 * (m_Magnify + 1));                 _Garphics.DrawString(p_ViewText.Substring(7, 6), _MyFont, Brushes.Black, _StarX, _StarY);             }             _Garphics.Dispose();              return  _CodeImage;         }          /// <summary>          /// 判断字体是否大与绘制图形          /// </summary>          /// <param name="_MyFont">字体</param>          /// <param name="p_Text">文字</param>          /// <param name="p_Width">字体的宽</param>          /// <returns>true可以绘制 False不可以绘制</returns>          private   bool  ScanDrawText(Font _MyFont, string  p_Text, int  p_Width)         {              if (_MyFont== null ) return   false ;              int  _Width = (p_Text.Length - 6 - 5) * (( int )m_Magnify + 1);              if  ((p_Width*12) > _Width)  return   false ;              return   true ;         }          /// <summary>          /// 获得条码的最后一位(验证位)          /// </summary>          /// <param name="ANumbers">条码</param>          /// <returns></returns>          public   static   char  EAN13ISBN( string  _Numb)         {              int  _Sum = 0;               int  _i = 1;    //权值              foreach  ( char  _Char  in  _Numb)             {                  if  ( "0123456789" .IndexOf(_Char) < 0)  continue// 非数字                 _Sum += (_Char -  '0' ) * _i;                 _i = _i == 1 ? 3 : 1;              }              return   "01234567890" [10 - _Sum % 10];         }           } }

    剩下CODE39了 这个过几天再做把。


    最新回复(0)