.NET 绘制 EAN13 (商品条码)

来源:互联网 发布:积木式编程 编辑:程序博客网 时间:2024/04/23 18:07

 

EAN商品条码的类

 

这个使用的比较多

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

效果

 

使用方法

 

 

 

 

 

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

 

具体绘制类

 

  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. namespace MyImage.BandCode
  7. {
  8.     public class EAN13
  9.     {
  10.         private DataTable m_EAN13 = new DataTable();
  11.         public EAN13()
  12.         {
  13.             m_EAN13.Columns.Add("ID");
  14.             m_EAN13.Columns.Add("Type");
  15.             m_EAN13.Columns.Add("A");
  16.             m_EAN13.Columns.Add("B");
  17.             m_EAN13.Columns.Add("C");
  18.             m_EAN13.Rows.Add("0""AAAAAA""0001101""0100111""1110010");
  19.             m_EAN13.Rows.Add("1""AABABB""0011001""0110011""1100110");
  20.             m_EAN13.Rows.Add("2""AABBAB""0010011""0011011""1101100");
  21.             m_EAN13.Rows.Add("3""AABBBA""0111101""0100001""1000010");
  22.             m_EAN13.Rows.Add("4""ABAABB""0100011""0011101""1011100");
  23.             m_EAN13.Rows.Add("5""ABBAAB""0110001""0111001""1001110");
  24.             m_EAN13.Rows.Add("6""ABBBAA""0101111""0000101""1010000");
  25.             m_EAN13.Rows.Add("7""ABABAB""0111011""0010001""1000100");
  26.             m_EAN13.Rows.Add("8""ABABBA""0110111""0001001""1001000");
  27.             m_EAN13.Rows.Add("9""ABBABA""0001011""0010111""1110100");
  28.         }
  29.         private uint m_Height = 40;
  30.         /// <summary>
  31.         /// 绘制高
  32.         /// </summary>
  33.         public uint Heigth { get { return m_Height; } set { m_Height = value; } }
  34.         private byte m_FontSize = 0;
  35.         /// <summary>
  36.         /// 字体大小(宋体)
  37.         /// </summary>
  38.         public byte FontSize { get { return m_FontSize; } set { m_FontSize = value; } } 
  39.       
  40.         private byte m_Magnify = 0;
  41.         /// <summary>     
  42.         /// 放大系数    
  43.         /// </summary>
  44.         public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
  45.         public Bitmap GetCodeImage(string p_Text)
  46.         {
  47.             if (p_Text.Length != 13) throw new Exception("数字不是13位!");
  48.             string _CodeText = p_Text.Remove(0, 1);
  49.             string _CodeIndex = "101";
  50.             char[] _LeftType = GetValue(p_Text.Substring(0, 1), "Type").ToCharArray();
  51.             for (int i = 0; i != 6; i++)
  52.             {
  53.                 _CodeIndex += GetValue(_CodeText.Substring(0, 1), _LeftType[i].ToString());
  54.                 _CodeText = _CodeText.Remove(0, 1);
  55.             }
  56.             
  57.             _CodeIndex += "01010";
  58.             
  59.             for (int i = 0; i != 6; i++)
  60.             {
  61.                 _CodeIndex += GetValue(_CodeText.Substring(0, 1), "C");
  62.                 _CodeText = _CodeText.Remove(0, 1);
  63.             }          
  64.             _CodeIndex += "101";
  65.             return GetImage(_CodeIndex, p_Text);
  66.         }
  67.         /// <summary>
  68.         /// 获取目标对应的数据
  69.         /// </summary>
  70.         /// <param name="p_Code">编码</param>
  71.         /// <param name="p_Value">类型</param>        
  72.         /// <returns>编码</returns>
  73.         private string GetValue(string p_Value, string p_Type)
  74.         {
  75.             if (m_EAN13 == nullreturn "";
  76.             DataRow[] _Row = m_EAN13.Select("ID='" + p_Value + "'");
  77.             if (_Row.Length != 1) throw new Exception("错误的编码" + p_Value.ToString());
  78.             return _Row[0][p_Type].ToString();
  79.         }
  80.         /// <summary>
  81.         /// 绘制编码图形
  82.         /// </summary>
  83.         /// <param name="p_Text">编码</param>
  84.         /// <returns>图形</returns>
  85.         private Bitmap GetImage(string p_Text,string p_ViewText)
  86.         {
  87.             char[] _Value = p_Text.ToCharArray();
  88.             int _FontWidth = 0;
  89.             Font _MyFont = null;
  90.             if (m_FontSize != 0)
  91.             {
  92.                 #region 获取符合大小的字体
  93.                 _MyFont = new Font("宋体", m_FontSize);
  94.                 Bitmap _MyFontBmp = new Bitmap(m_FontSize, m_FontSize);
  95.                 Graphics _FontGraphics = Graphics.FromImage(_MyFontBmp);
  96.                 
  97.                 for (byte i = m_FontSize; i != 0; i--)
  98.                 {
  99.                     SizeF _DrawSize = _FontGraphics.MeasureString(p_ViewText.Substring(0, 1), _MyFont);
  100.                     if (_DrawSize.Height > m_FontSize)
  101.                     {
  102.                         _MyFont = new Font("宋体", i);
  103.                     }
  104.                     else
  105.                     {
  106.                         _FontWidth = (int)_DrawSize.Width;
  107.                         break;
  108.                     }
  109.                 }
  110.                 #endregion
  111.             }
  112.             if (ScanDrawText(_MyFont, p_Text, _FontWidth) == false)
  113.             {
  114.                 _FontWidth = 0;
  115.                 m_FontSize = 0;
  116.             }
  117.             //宽 == 需要绘制的数量*放大倍数 + 两个字的宽   
  118.             Bitmap _CodeImage = new Bitmap(_Value.Length * ((int)m_Magnify + 1) + (_FontWidth * 2), (int)m_Height);
  119.             Graphics _Garphics = Graphics.FromImage(_CodeImage);
  120.             _Garphics.FillRectangle(Brushes.White, new Rectangle(0, 0, _CodeImage.Width, _CodeImage.Height));                
  121.           
  122.             int _Height = 0;
  123.             int _LenEx = _FontWidth;
  124.             for (int i = 0; i != _Value.Length; i++)
  125.             {
  126.                 int _DrawWidth = m_Magnify + 1;
  127.                 if (i == 0 || i == 2 || i==46 || i==48 || i==92 || i==94)
  128.                 {
  129.                     _Height = (int)m_Height;                  
  130.                 }
  131.                 else
  132.                 {
  133.                     _Height = (int)m_Height - m_FontSize;
  134.                 }
  135.                 if (_Value[i] == '1')
  136.                 {
  137.                     _Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _DrawWidth, _Height));
  138.                   
  139.                 }
  140.                 else
  141.                 {
  142.                     _Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _DrawWidth, _Height));
  143.                 }
  144.                 _LenEx += _DrawWidth;              
  145.             }
  146.             //绘制文字
  147.             if (_FontWidth != 0 && m_FontSize != 0)
  148.             {
  149.                 int _StarX = 0;
  150.                 int _StarY=(int)m_Height - _MyFont.Height;
  151.                 _Garphics.DrawString(p_ViewText.Substring(0, 1), _MyFont, Brushes.Black, 0, _StarY);
  152.                 _StarX = _FontWidth + (3 * (m_Magnify + 1));
  153.                 _Garphics.DrawString(p_ViewText.Substring(1, 6), _MyFont, Brushes.Black, _StarX, _StarY);
  154.                 _StarX = _FontWidth + (50 * (m_Magnify + 1));
  155.                 _Garphics.DrawString(p_ViewText.Substring(7, 6), _MyFont, Brushes.Black, _StarX, _StarY);
  156.             }
  157.             _Garphics.Dispose();
  158.             return _CodeImage;
  159.         }
  160.         /// <summary>
  161.         /// 判断字体是否大与绘制图形
  162.         /// </summary>
  163.         /// <param name="_MyFont">字体</param>
  164.         /// <param name="p_Text">文字</param>
  165.         /// <param name="p_Width">字体的宽</param>
  166.         /// <returns>true可以绘制 False不可以绘制</returns>
  167.         private bool ScanDrawText(Font _MyFont,string p_Text,int p_Width)
  168.         {
  169.             if(_MyFont==null)return false;
  170.             int _Width = (p_Text.Length - 6 - 5) * ((int)m_Magnify + 1);
  171.             if ((p_Width*12) > _Width) return false;
  172.             return true;
  173.         }
  174.         /// <summary>
  175.         /// 获得条码的最后一位(验证位)
  176.         /// </summary>
  177.         /// <param name="ANumbers">条码</param>
  178.         /// <returns></returns>
  179.         public static char EAN13ISBN(string _Numb)
  180.         {
  181.             int _Sum = 0; 
  182.             int _i = 1;   //权值
  183.             foreach (char _Char in _Numb)
  184.             {
  185.                 if ("0123456789".IndexOf(_Char) < 0) continue// 非数字
  186.                 _Sum += (_Char - '0') * _i;
  187.                 _i = _i == 1 ? 3 : 1; 
  188.             }
  189.             return "01234567890"[10 - _Sum % 10];
  190.         }
  191.      
  192.     }
  193. }

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

原创粉丝点击