欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#生成Code39条形码而非条形码字体的方法

程序员文章站 2023-11-16 23:29:34
由于code39编译简单、能够对任意长度的数据进行编码、支持设备比较广泛所以被广泛的采用,下面通过文字说明和代码分析给大家介绍下c#生成code39条形码而非条形码字体的方...

由于code39编译简单、能够对任意长度的数据进行编码、支持设备比较广泛所以被广泛的采用,下面通过文字说明和代码分析给大家介绍下c#生成code39条形码而非条形码字体的方法。

能够对任意长度的数据进行编码。其局限在于印刷品的长度和条码阅读器的识别范围。
支持设备广泛。目前几乎所有的条形码阅读设备都能阅读code39码,打印机也是同样情况。
编制简单。简单的开发技术就能快速生成相应的编码图像。
一般code39码由5条线和分开它们的4条缝隙共9个元素构成。线和缝隙有宽窄之分,而且无论线还是缝隙仅有3个比其他的元素要宽一定比例。39码因此得名
code39条形码规则

  1、 每五条线表示一个字符;
  2、 粗线表示1,细线表示0;
  3、 线条间的间隙宽的表示1,窄的表示0;
  4、 五条线加上它们之间的四条间隙就是九位二进制编码,而且这九位中必定有三位是1,所以称为39码;
  5、 条形码的首尾各一个 * 标识开始和结束。
code 39只接受如下43个有效输入字符:
  1、26个大写字母(a - z),
  2、十个数字(0 - 9),
  3、连接号(-),句号(.),空格,美圆符号($),斜扛(/),加号(+)以及百分号(%)。
     4、其余的输入将被忽略。
  5、code39通常情况下不需要校验码。但是对於精确度要求高的应用,需要在code39条形码後面增加一个校验码。
条形码的生成网上也有很多库文件,做的特别好的都是商业授权。一维码二维码在.net开源项目中的生成读取比较知名的有:zxing.net()、barcodelib等
但有些时候开源软件所实现的并不满足当下的需求,所以还要做一些其他尝试。效果如下图:

C#生成Code39条形码而非条形码字体的方法


 代码分享:

/// <summary>
 /// code39一维码生成类
 /// http://www.cnblogs.com/bluescreen/p/4689351.html
 /// </summary>
 public class csharpcode39
 {
  #region 数据码
  private byte[,] c39_bp = new byte[,] { 
   { 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x32, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x33, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x34, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x35, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x36, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x37, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x38, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x39, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x41, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x42, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x43, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x44, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31 }, { 0x45, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, { 70, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, 
   { 0x47, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31 }, { 0x48, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x49, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x4a, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30 }, { 0x4b, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4c, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x4e, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31 }, { 0x4f, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 80, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 0x51, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31 }, { 0x52, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x54, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30 }, { 0x55, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x56, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, 
   { 0x57, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x58, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x59, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 90, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x2d, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x2e, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x20, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x2a, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x24, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x2f, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x2b, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30 }, { 0x25, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30 }
   };
  //code39合法字符集 [0-9a-z+-*/%. ] 共43个
  private byte[] c39_cw = new byte[] { 
   0x30, 0x31, 50, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 70, 
   0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 80, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 
   0x57, 0x58, 0x59, 90, 0x2d, 0x2e, 0x20, 0x24, 0x2f, 0x2b, 0x25
   };
  private byte[,] c39_ex = new byte[,] { 
   { 1, 0x24, 0x41 }, { 2, 0x24, 0x42 }, { 3, 0x24, 0x43 }, { 4, 0x24, 0x44 }, { 5, 0x24, 0x45 }, { 6, 0x24, 70 }, { 7, 0x24, 0x47 }, { 8, 0x24, 0x48 }, { 9, 0x24, 0x49 }, { 10, 0x24, 0x4a }, { 11, 0x24, 0x4b }, { 12, 0x24, 0x4c }, { 13, 0x24, 0x4d }, { 14, 0x24, 0x4e }, { 15, 0x24, 0x4f }, { 0x10, 0x24, 80 }, 
   { 0x11, 0x24, 0x51 }, { 0x12, 0x24, 0x52 }, { 0x13, 0x24, 0x53 }, { 20, 0x24, 0x54 }, { 0x15, 0x24, 0x55 }, { 0x16, 0x24, 0x56 }, { 0x17, 0x24, 0x57 }, { 0x18, 0x24, 0x58 }, { 0x19, 0x24, 0x59 }, { 0x1a, 0x24, 90 }, { 0x1b, 0x25, 0x41 }, { 0x1c, 0x25, 0x42 }, { 0x1d, 0x25, 0x43 }, { 30, 0x25, 0x44 }, { 0x1f, 0x25, 0x45 }, { 0x3b, 0x25, 70 }, 
   { 60, 0x25, 0x47 }, { 0x3d, 0x25, 0x48 }, { 0x3e, 0x25, 0x49 }, { 0x3f, 0x25, 0x4a }, { 0x5b, 0x25, 0x4b }, { 0x5c, 0x25, 0x4c }, { 0x5d, 0x25, 0x4d }, { 0x5e, 0x25, 0x4e }, { 0x5f, 0x25, 0x4f }, { 0x7b, 0x25, 80 }, { 0x7c, 0x25, 0x51 }, { 0x7d, 0x25, 0x52 }, { 0x7e, 0x25, 0x53 }, { 0x7f, 0x25, 0x54 }, { 0, 0x25, 0x55 }, { 0x40, 0x25, 0x56 }, 
   { 0x60, 0x25, 0x57 }, { 0x21, 0x2f, 0x41 }, { 0x22, 0x2f, 0x42 }, { 0x23, 0x2f, 0x43 }, { 0x26, 0x2f, 70 }, { 0x27, 0x2f, 0x47 }, { 40, 0x2f, 0x48 }, { 0x29, 0x2f, 0x49 }, { 0x2a, 0x2f, 0x4a }, { 0x2c, 0x2f, 0x4c }, { 0x3a, 0x2f, 90 }, { 0x61, 0x2b, 0x41 }, { 0x62, 0x2b, 0x42 }, { 0x63, 0x2b, 0x43 }, { 100, 0x2b, 0x44 }, { 0x65, 0x2b, 0x45 }, 
   { 0x66, 0x2b, 70 }, { 0x67, 0x2b, 0x47 }, { 0x68, 0x2b, 0x48 }, { 0x69, 0x2b, 0x49 }, { 0x6a, 0x2b, 0x4a }, { 0x6b, 0x2b, 0x4b }, { 0x6c, 0x2b, 0x4c }, { 0x6d, 0x2b, 0x4d }, { 110, 0x2b, 0x4e }, { 0x6f, 0x2b, 0x4f }, { 0x70, 0x2b, 80 }, { 0x71, 0x2b, 0x51 }, { 0x72, 0x2b, 0x52 }, { 0x73, 0x2b, 0x53 }, { 0x74, 0x2b, 0x54 }, { 0x75, 0x2b, 0x55 }, 
   { 0x76, 0x2b, 0x56 }, { 0x77, 0x2b, 0x57 }, { 120, 0x2b, 0x58 }, { 0x79, 0x2b, 0x59 }, { 0x7a, 0x2b, 90 }
   };
  #endregion
  #region 字段和属性
  private bool _checksum;
  private string _datatoencode;
  private bool _humanreadable;
  private string _humanreadablefont;
  private float _humanreadablesize;
  private float _marginx;
  private float _marginy;
  private float _moduleheight;
  private float _modulewidth;
  private float _ratio;
  private float _reduction;
  private color _codebarcolor = color.black;
  private bool _isdisplaycheckcode;
  private string _checkdata;
  private bool _isdisplaystartstopsign;
  /// <summary>
  /// 是否检查效验
  /// </summary>
  public bool checksum
  {
   get
   {
    return _checksum;
   }
   set
   {
    _checksum = value;
   }
  }

  /// <summary>
  /// 要进行编码的数据
  /// </summary>
  public string datatoencode
  {
   get
   {
    return _datatoencode;
   }
   set
   {
    _datatoencode = value;
   }
  }

  /// <summary>
  /// 是否显示文本内容
  /// </summary>
  public bool humanreadable
  {
   get
   {
    return _humanreadable;
   }
   set
   {
    _humanreadable = value;
   }
  }
  /// <summary>
  /// 用于显示文本内容的字体
  /// </summary>
  public string humanreadablefont
  {
   get
   {
    return _humanreadablefont;
   }
   set
   {
    _humanreadablefont = value;
   }
  }
  /// <summary>
  /// 用于显示文本内容文字的代大小 
  /// </summary>
  public float humanreadablesize
  {
   get
   {
    return _humanreadablesize;
   }
   set
   {
    _humanreadablesize = value;
   }
  }
  /// <summary>
  /// 水平方向边距
  /// 水平方向建议尽量留白
  /// 如果没有留白同时模块宽度较小可能会造成无法识别
  /// </summary>
  public float marginx
  {
   get
   {
    return _marginx;
   }
   set
   {
    _marginx = value;
   }
  }
  /// <summary>
  /// 垂直方向边距
  /// </summary>
  public float marginy
  {
   get
   {
    return _marginy;
   }
   set
   {
    _marginy = value;
   }
  }
  /// <summary>
  /// 模块高度(mm)
  /// </summary>
  public float moduleheight
  {
   get
   {
    return _moduleheight;
   }
   set
   {
    _moduleheight = value;
   }
  }
  /// <summary>
  /// 模块宽度(mm)
  /// 模块宽度不应低于0.2646f
  /// 模块宽度过低会造成数据丢失因而读不出数据或者会误读
  /// </summary>
  public float modulewidth
  {
   get
   {
    return _modulewidth;
   }
   set
   {
    _modulewidth = value;
   }
  }

  /// <summary>
  /// 放大比率 
  /// </summary>
  public float ratio
  {
   get
   {
    return _ratio;
   }
   set
   {
    _ratio = value;
   }
  }
  /// <summary>
  /// 缩小
  /// </summary>
  public float reduction
  {
   get
   {
    return _reduction;
   }
   set
   {
    _reduction = value;
   }
  }
  /// <summary>
  /// 设置条形码的颜色
  /// </summary>
  public color codebarcolor
  {
   get
   {
    return _codebarcolor;
   }
   set
   {
    _codebarcolor = value;
   }
  }
  /// <summary>
  /// 是否显示效验码
  /// 此属性要在checksum属性为true的情况下有用
  /// </summary>
  public bool isdisplaycheckcode
  {
   get { return this._isdisplaycheckcode; }
   set { this._isdisplaycheckcode = value; }
  }
  /// <summary>
  /// 供人识别是否显示起止符
  /// </summary>
  public bool isdisplaystartstopsign
  {
   get { return this._isdisplaystartstopsign; }
   set { this._isdisplaystartstopsign = value; }
  }
  #endregion
  /// <summary>
  /// 默认构造函数
  /// 初始化
  /// </summary>
  public csharpcode39()
  {
   this.initdata();
  }
  public csharpcode39(string datatoencode)
  {
   this.initdata();
   this._datatoencode = datatoencode;
  }
  /// <summary>
  /// 默认构造函数
  /// 初始化数据
  /// </summary>
  private void initdata()
  {
   this._humanreadablefont = "arial";
   this._humanreadablesize = 10f;
   this._codebarcolor = color.black;
   this._moduleheight = 15f;//模块高度毫米
   this._modulewidth = 0.35f;//模块宽度毫米
   this._ratio = 3f;
   this._marginx =2;
   this._marginy =2;
   this._checksum = true;
   this._isdisplaycheckcode = false;
   this._isdisplaystartstopsign = false;
  }
  private char[] _bitpattern_c39(string rawdata, ref int finallength)
  {
   //0x27 39 
   //0x50 80
   if ((rawdata.length == 0) || (rawdata.length > 0x50 /*0x27*/))
   {
    return null;
   }
   for (int i = 0; i < rawdata.length; i++)
   {
    if ((rawdata[i] == '\0') || (rawdata[i] > '\x007f'))
    {
     return null;
    }
   }
   byte[] data = processtilde(rawdata);
   if (data.length == 0)
   {
    return null;
   }
   byte[] buffer2 = this.processextended(data);
   if ((buffer2.length == 0) || (buffer2.length > /*40*/80))
   {
    return null;
   }
   finallength = this._checksum ? ((buffer2.length + 2) + 1) : (buffer2.length + 2);
   return this.getpattern_c39(buffer2);
  }

  /// <summary>
  /// 计算效验值
  /// </summary>
  /// <param name="data"></param>
  /// <param name="len"></param>
  /// <returns></returns>
  private byte _checksum_c39(byte[] data, int len)
  {
   //0x2b 43
   //字符值的总和除以合法字符集的个数43 取余数 余数在合法字符数组中对应的数值就是效验值
   int num2 = 0;
   for (int i = 1; i < len; i++)
   {
    num2 += this.valuefromcharacter(data[i]);
   }
   return this.c39_cw[num2 % 0x2b];
  }
  private char[] code39_bitpattern(string datatoencode)
  {
   int finallength = 0;
   return this._bitpattern_c39(datatoencode, ref finallength);
  }
  /// <summary>
  /// 获得code39条码图片
  /// </summary>
  /// <param name="resolution">dpi</param>
  /// <returns></returns>
  public bitmap getbitmapimage(float resolution)
  {
   return code39_createcode(resolution);
  }
  private bitmap code39_createcode(float resolution)
  {
   int num6;
   int finallength = 0;
   char[] charray = this._bitpattern_c39(datatoencode, ref finallength);
   if (charray == null)
   {
    return null;
   }
   float fontsize = this._humanreadable ? (0.3527778f * this._humanreadablesize) : 0f;
   // float num3 = (7f * modulewidth) + ((3f * ratio) * modulewidth);
   float num3 = (7f * this._modulewidth) + ((3f * this._ratio) * this._modulewidth);
   float width = (finallength * num3) + (2f * this._marginx);
   float height = (this._moduleheight + (2f * this._marginy)) + fontsize;
   width *= resolution / 25.4f;
   height *= resolution / 25.4f;
   bitmap image = new bitmap((int)width, (int)height, pixelformat.format32bpppargb);
   image.setresolution(resolution, resolution);
   //image.setresolution(300, 300);
   graphics g = graphics.fromimage(image);
   g.clear(color.white);
   g.pageunit = graphicsunit.millimeter; //以毫米为度量单位
   g.fillrectangle(new solidbrush(color.white), new rectangle(0, 0, /*(int)width*/image.width, /*(int)height*/image.height));
   //new pen(color.black, 2f);
   //new solidbrush(color.white);
   solidbrush brush = new solidbrush(color.black);
   if (resolution < 300f)
   {
    //g.textrenderinghint = textrenderinghint.antialias;
    //g.smoothingmode = smoothingmode.antialias;
    g.compositingquality = compositingquality.highquality;
    //g.smoothingmode = smoothingmode.highquality;
    g.interpolationmode = interpolationmode.highqualitybicubic;
    g.textrenderinghint = textrenderinghint.antialiasgridfit;
   }
   float num7 = 0f;
   for (num6 = 0; num6 < charray.length; num6++)
   {
    if (charray[num6] == '0')
    {
     if ((num6 & 1) != 1)
     {
      rectanglef rect = new rectanglef(marginx + num7, marginy, modulewidth, moduleheight);
      makebar(g, rect, reduction);
     }
     num7 += 1f * modulewidth;
    }
    else
    {
     if ((num6 & 1) != 1)
     {
      rectanglef ef2 = new rectanglef(marginx + num7, marginy, ratio * modulewidth, moduleheight);
      makebar(g, ef2, reduction);
     }
     num7 += ratio * modulewidth;
    }
   }
   #region 供人识别内容
   if (this._humanreadable)
   {
    #region 保留
    /*byte[] buffer2 = processtilde(this._datatoencode);
    int index = 0;
    list<byte> arr = new list<byte>();
    for (num6 = 0; num6 < buffer2.length; num6++)
    {
     //0x20 32  0x7e 126
     if ((buffer2[num6] >= 0x20) && (buffer2[num6] <= 0x7e))
     {
      arr.add(buffer2[num6]);
     }
    }
    byte[] bytes = new byte[arr.count];
    for (int i = 0; i < arr.count; i++)
    {
     bytes[i] = arr[i];
    }
    index = arr.count;
    //string text = new asciiencoding().getstring(bytes, 0, index);
     */ 
    #endregion
    string text = this._datatoencode;
    if (this._isdisplaycheckcode&&!string.isnullorempty(this._checkdata)) {
     text += this._checkdata;
    }
    if (this._isdisplaystartstopsign)
    {
     text = "*" + text + "*";
    }
    font font = new font(this._humanreadablefont, this._humanreadablesize);
    //g.drawstring(text, font, brush, new pointf(marginx, marginy + moduleheight));
    //新增字符串格式
    var drawformat = new stringformat { alignment = stringalignment.center };
    float inpix = image.width / resolution;//根据dpi求出 英寸数
    float widthmm = inpix * 25.4f; //有每英寸像素求出毫米
    //g.drawstring(text, font, brushes.black, width / 2, height - 14, drawformat);
    g.drawstring(text, font, /*brushes.black*/brush, new pointf(/*marginx*/(int)(widthmm / 2), marginy + moduleheight + 1), drawformat);
   }
   #endregion

   return image;
  }
  /// <summary>
  /// 进行图形填充
  /// </summary>
  /// <param name="g"></param>
  /// <param name="rect"></param>
  /// <param name="reduction"></param>
  private void makebar(graphics g, rectanglef rect, float reduction)
  {
   makebar(g, rect, reduction,this._codebarcolor);
  }
  /// <summary>
  /// 进行图形填充
  /// </summary>
  /// <param name="g"></param>
  /// <param name="rect"></param>
  /// <param name="reduction"></param>
  /// <param name="brushcolor"></param>
  private void makebar(graphics g, rectanglef rect, float reduction, color brushcolor)
  {
   float num = rect.width * (reduction / 200f);
   float num2 = rect.width - (rect.width * (reduction / 200f));
   rectanglef ef = new rectanglef
   {
    x = rect.x + num,
    y = rect.y,
    width = num2,
    height = rect.height
   };
   solidbrush brush = new solidbrush(brushcolor);
   g.fillrectangle(brush, ef);
  }
  private char[] getpattern_c39(byte[] data)
  { //0x2a 42为*
   //int num = 0x27;
   int num = 80;
   byte[] buffer = new byte[num + 1];
   buffer[0] = 0x2a;
   int index = 1;
   for (int i = 0; i < data.length; i++)
   {
    buffer[index] = data[i];
    index++;
   }
   if (checksum)
   {
    buffer[index] = this._checksum_c39(buffer, index);
    if (_isdisplaycheckcode)
    {
     this._checkdata = ((char)buffer[index]).tostring();
    }
    index++;
   }
   buffer[index] = 0x2a;
   index++;
   char[] charray = new char[index * 10];
   int num5 = 0;
   for (int j = 0; j < index; j++)
   {
    byte c = buffer[j];
    int num9 = this.indexfromcharacter(c);
    for (int k = 0; k < 9; k++)
    {
     charray[num5] = (char)this.c39_bp[num9, k + 1];
     num5++;
    }
    charray[num5] = '0';
    num5++;
   }
   return charray;
  }
  private int indexfromcharacter(byte c)
  {
   //0x2c==44
   for (int i = 0; i < 0x2c; i++)
   {
    if (this.c39_bp[i, 0] == c)
    {
     return i;
    }
   }
   return -1;
  }

  private byte[] processextended(byte[] data)
  {
   //0x25 38
   //0x4f 79 0x4e 78
   //int num = 0x4f;
   int num = data.length - 1;
   byte[] sourcearray = new byte[num + 1];
   int index = 0;
   for (int i = 0; i < data.length; i++)
   {
    byte c = data[i];
    if (this.valuefromcharacter(c) != -1)
    {
     sourcearray[index] = c;
     index++;
    }
    else
    {
     byte num5 = 0;
     byte num6 = 0;
     if (this.valuesfromextended(c, ref num5, ref num6))
     {
      sourcearray[index] = num5;
      sourcearray[index + 1] = num6;
      index += 2;
     }
    }
   }
   byte[] destinationarray = new byte[index];
   array.copy(sourcearray, destinationarray, index);
   return destinationarray;
  }
  /// <summary>
  /// 返回指定字符在code39合法字符数组中对应的索引
  /// </summary>
  /// <param name="c"></param>
  /// <returns></returns>
  private int valuefromcharacter(byte c)
  {
   //c39_cw为数组,保存的为合法的字符集信息[0-9a-z+-*/%. ] 共43个
   //如果存在这个字符就返回c39_cw对应的索引
   for (int i = 0; i < /*0x2b*/this.c39_cw.length; i++)
   {
    if (this.c39_cw[i] == c)
    {
     return i;
    }
   }
   return -1;
  }
  /// <summary>
  /// 判断字符集是否存在extended
  /// </summary>
  /// <param name="c"></param>
  /// <param name="v1"></param>
  /// <param name="v2"></param>
  /// <returns></returns>
  private bool valuesfromextended(byte c, ref byte v1, ref byte v2)
  {
   //0x55 85
   for (int i = 0; i < 0x55; i++)
   {
    if (this.c39_ex[i, 0] == c)
    {
     v1 = this.c39_ex[i, 1];
     v2 = this.c39_ex[i, 2];
     return true;
    }
   }
   return false;
  }
  private byte[] processtilde(string rawdata)
  {
   byte[] sourcearray = new byte[rawdata.length];
   int index = 0;
   for (int i = 0; i < rawdata.length; i++)
   {
    if (rawdata[i] != '~')
    {
     sourcearray[index] = (byte)rawdata[i];
     index++;
    }
    else if ((i + 3) < rawdata.length)
    {
     string str = new string(new char[] { rawdata[i + 1], rawdata[i + 2], rawdata[i + 3] });
     int num3 = convert.toint32(str, 10);
     if ((num3 > 0) && (num3 <= 0xff))
     {
      sourcearray[index] = (byte)num3;
      index++;
     }
     if (num3 == 0x3e7)
     {
      sourcearray[index] = 0x86;
      index++;
     }
     i += 3;
    }
    else
    {
     sourcearray[index] = (byte)rawdata[i];
     index++;
    }
   }
   byte[] destinationarray = new byte[index];
   array.copy(sourcearray, destinationarray, index);
   return destinationarray;
  }
 }

 这个方法是根据dpi以及数据模块的高宽来确定条码的实际高宽。模块的宽度以毫米(mm)来算。类中的getbitmapimage方法的一个参数getbitmapimage为dpi。安卓用户安装平时常用的扫码软件即可做识别测试。就识别率来说还是可以的,扫描枪绝对是可以扫的出的。同时使用过messagingtoolkit.barcode进行解码测试,万张无一误读。

以上内容就是本文的全部内容,希望大家喜欢。