zoukankan      html  css  js  c++  java
  • [转].NET 绘制 EAN13 (商品条码)

    本文转自:http://blog.csdn.net/zgke/article/details/3496721

    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. }
  • 相关阅读:
    jQuery中时间戳和日期的相互转换
    jquery append 方法应用
    MySQL中实现连续日期内数据统计,缺省天数0补全
    jQuery通过ajax请求php遍历json数组到table中的代码
    sql相同表不同查询条件合并显示
    paginate()出来的数据怎样循环插入数据?
    使用paginate分页后数据处理
    ThinkPhp3.2.3 使用phpExcel导入数据
    判断时间戳是星期几
    英文加数字升序/降序
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2784306.html
Copyright © 2011-2022 走看看