首页 > 编程 > C# > 正文

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

2019-10-29 21:39:37
字体:
来源:转载
供稿:网友

由于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(http://zxingnet.codeplex.com/)、BarcodeLib等

但有些时候开源软件所实现的并不满足当下的需求,所以还要做一些其他尝试。效果如下图:

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

代码分享:

 

 
  1. /// <summary> 
  2. /// Code39一维码生成类 
  3. /// http://www.cnblogs.com/bluescreen/p/4689351.html 
  4. /// </summary> 
  5. public class CSharpCode39 
  6. #region 数据码 
  7. private byte[,] c39_bp = new byte[,] {  
  8. { 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 },  
  9. { 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 },  
  10. { 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 } 
  11. }; 
  12. //code39合法字符集 [0-9A-Z+-*/%. ] 共43个 
  13. private byte[] c39_cw = new byte[] {  
  14. 0x30, 0x31, 50, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 70,  
  15. 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 80, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,  
  16. 0x57, 0x58, 0x59, 90, 0x2d, 0x2e, 0x20, 0x24, 0x2f, 0x2b, 0x25 
  17. }; 
  18. private byte[,] c39_ex = new byte[,] {  
  19. { 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 },  
  20. { 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 },  
  21. { 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 },  
  22. { 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 },  
  23. { 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 },  
  24. { 0x76, 0x2b, 0x56 }, { 0x77, 0x2b, 0x57 }, { 120, 0x2b, 0x58 }, { 0x79, 0x2b, 0x59 }, { 0x7a, 0x2b, 90 } 
  25. }; 
  26. #endregion 
  27. #region 字段和属性 
  28. private bool _checksum; 
  29. private string _dataToEncode; 
  30. private bool _humanReadable; 
  31. private string _humanReadableFont; 
  32. private float _humanReadableSize; 
  33. private float _marginX; 
  34. private float _marginY; 
  35. private float _moduleHeight; 
  36. private float _moduleWidth; 
  37. private float _ratio; 
  38. private float _reduction; 
  39. private Color _codeBarColor = Color.Black; 
  40. private bool _isDisplayCheckCode; 
  41. private string _checkData; 
  42. private bool _isDisplayStartStopSign; 
  43. /// <summary> 
  44. /// 是否检查效验 
  45. /// </summary> 
  46. public bool Checksum 
  47. get 
  48. return _checksum; 
  49. set 
  50. _checksum = value; 
  51.  
  52. /// <summary> 
  53. /// 要进行编码的数据 
  54. /// </summary> 
  55. public string DataToEncode 
  56. get 
  57. return _dataToEncode; 
  58. set 
  59. _dataToEncode = value; 
  60.  
  61. /// <summary> 
  62. /// 是否显示文本内容 
  63. /// </summary> 
  64. public bool HumanReadable 
  65. get 
  66. return _humanReadable; 
  67. set 
  68. _humanReadable = value; 
  69. /// <summary> 
  70. /// 用于显示文本内容的字体 
  71. /// </summary> 
  72. public string HumanReadableFont 
  73. get 
  74. return _humanReadableFont; 
  75. set 
  76. _humanReadableFont = value; 
  77. /// <summary> 
  78. /// 用于显示文本内容文字的代大小  
  79. /// </summary> 
  80. public float HumanReadableSize 
  81. get 
  82. return _humanReadableSize; 
  83. set 
  84. _humanReadableSize = value; 
  85. /// <summary> 
  86. /// 水平方向边距 
  87. /// 水平方向建议尽量留白 
  88. /// 如果没有留白同时模块宽度较小可能会造成无法识别 
  89. /// </summary> 
  90. public float MarginX 
  91. get 
  92. return _marginX; 
  93. set 
  94. _marginX = value; 
  95. /// <summary> 
  96. /// 垂直方向边距 
  97. /// </summary> 
  98. public float MarginY 
  99. get 
  100. return _marginY; 
  101. set 
  102. _marginY = value; 
  103. /// <summary> 
  104. /// 模块高度(mm) 
  105. /// </summary> 
  106. public float ModuleHeight 
  107. get 
  108. return _moduleHeight; 
  109. set 
  110. _moduleHeight = value; 
  111. /// <summary> 
  112. /// 模块宽度(mm) 
  113. /// 模块宽度不应低于0.2646f 
  114. /// 模块宽度过低会造成数据丢失因而读不出数据或者会误读 
  115. /// </summary> 
  116. public float ModuleWidth 
  117. get 
  118. return _moduleWidth; 
  119. set 
  120. _moduleWidth = value; 
  121.  
  122. /// <summary> 
  123. /// 放大比率  
  124. /// </summary> 
  125. public float Ratio 
  126. get 
  127. return _ratio; 
  128. set 
  129. _ratio = value; 
  130. /// <summary> 
  131. /// 缩小 
  132. /// </summary> 
  133. public float Reduction 
  134. get 
  135. return _reduction; 
  136. set 
  137. _reduction = value; 
  138. /// <summary> 
  139. /// 设置条形码的颜色 
  140. /// </summary> 
  141. public Color CodeBarColor 
  142. get 
  143. return _codeBarColor; 
  144. set 
  145. _codeBarColor = value; 
  146. /// <summary> 
  147. /// 是否显示效验码 
  148. /// 此属性要在Checksum属性为true的情况下有用 
  149. /// </summary> 
  150. public bool IsDisplayCheckCode 
  151. get { return this._isDisplayCheckCode; } 
  152. set { this._isDisplayCheckCode = value; } 
  153. /// <summary> 
  154. /// 供人识别是否显示起止符 
  155. /// </summary> 
  156. public bool IsDisplayStartStopSign 
  157. get { return this._isDisplayStartStopSign; } 
  158. set { this._isDisplayStartStopSign = value; } 
  159. #endregion 
  160. /// <summary> 
  161. /// 默认构造函数 
  162. /// 初始化 
  163. /// </summary> 
  164. public CSharpCode39() 
  165. this.initData(); 
  166. public CSharpCode39(string dataToEncode) 
  167. this.initData(); 
  168. this._dataToEncode = dataToEncode; 
  169. /// <summary> 
  170. /// 默认构造函数 
  171. /// 初始化数据 
  172. /// </summary> 
  173. private void initData() 
  174. this._humanReadableFont = "Arial"
  175. this._humanReadableSize = 10f; 
  176. this._codeBarColor = Color.Black; 
  177. this._moduleHeight = 15f;//模块高度毫米 
  178. this._moduleWidth = 0.35f;//模块宽度毫米 
  179. this._ratio = 3f; 
  180. this._marginX =2; 
  181. this._marginY =2; 
  182. this._checksum = true
  183. this._isDisplayCheckCode = false
  184. this._isDisplayStartStopSign = false
  185. private char[] _bitpattern_c39(string rawdata, ref int finalLength) 
  186. //0x27 39  
  187. //0x50 80 
  188. if ((rawdata.Length == 0) || (rawdata.Length > 0x50 /*0x27*/)) 
  189. return null
  190. for (int i = 0; i < rawdata.Length; i++) 
  191. if ((rawdata[i] == '/0') || (rawdata[i] > '/x007f')) 
  192. return null
  193. byte[] data = processTilde(rawdata); 
  194. if (data.Length == 0) 
  195. return null
  196. byte[] buffer2 = this.processExtended(data); 
  197. if ((buffer2.Length == 0) || (buffer2.Length > /*40*/80)) 
  198. return null
  199. finalLength = this._checksum ? ((buffer2.Length + 2) + 1) : (buffer2.Length + 2); 
  200. return this.getPattern_c39(buffer2); 
  201.  
  202. /// <summary> 
  203. /// 计算效验值 
  204. /// </summary> 
  205. /// <param name="data"></param> 
  206. /// <param name="len"></param> 
  207. /// <returns></returns> 
  208. private byte _checksum_c39(byte[] data, int len) 
  209. //0x2b 43 
  210. //字符值的总和除以合法字符集的个数43 取余数 余数在合法字符数组中对应的数值就是效验值 
  211. int num2 = 0; 
  212. for (int i = 1; i < len; i++) 
  213. num2 += this.valueFromCharacter(data[i]); 
  214. return this.c39_cw[num2 % 0x2b]; 
  215. private char[] Code39_bitpattern(string dataToEncode) 
  216. int finalLength = 0; 
  217. return this._bitpattern_c39(dataToEncode, ref finalLength); 
  218. /// <summary> 
  219. /// 获得Code39条码图片 
  220. /// </summary> 
  221. /// <param name="resolution">DPI</param> 
  222. /// <returns></returns> 
  223. public Bitmap getBitmapImage(float resolution) 
  224. return Code39_createCode(resolution); 
  225. private Bitmap Code39_createCode(float resolution) 
  226. int num6; 
  227. int finalLength = 0; 
  228. char[] chArray = this._bitpattern_c39(DataToEncode, ref finalLength); 
  229. if (chArray == null
  230. return null
  231. float fontsize = this._humanReadable ? (0.3527778f * this._humanReadableSize) : 0f; 
  232. // float num3 = (7f * ModuleWidth) + ((3f * Ratio) * ModuleWidth); 
  233. float num3 = (7f * this._moduleWidth) + ((3f * this._ratio) * this._moduleWidth); 
  234. float width = (finalLength * num3) + (2f * this._marginX); 
  235. float height = (this._moduleHeight + (2f * this._marginY)) + fontsize; 
  236. width *= resolution / 25.4f; 
  237. height *= resolution / 25.4f; 
  238. Bitmap image = new Bitmap((int)width, (int)height, PixelFormat.Format32bppPArgb); 
  239. image.SetResolution(resolution, resolution); 
  240. //image.SetResolution(300, 300); 
  241. Graphics g = Graphics.FromImage(image); 
  242. g.Clear(Color.White); 
  243. g.PageUnit = GraphicsUnit.Millimeter; //以毫米为度量单位 
  244. g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, /*(int)width*/image.Width, /*(int)height*/image.Height)); 
  245. //new Pen(Color.Black, 2f); 
  246. //new SolidBrush(Color.White); 
  247. SolidBrush brush = new SolidBrush(Color.Black); 
  248. if (resolution < 300f) 
  249. //g.TextRenderingHint = TextRenderingHint.AntiAlias; 
  250. //g.SmoothingMode = SmoothingMode.AntiAlias; 
  251. g.CompositingQuality = CompositingQuality.HighQuality; 
  252. //g.SmoothingMode = SmoothingMode.HighQuality; 
  253. g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
  254. g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
  255. float num7 = 0f; 
  256. for (num6 = 0; num6 < chArray.Length; num6++) 
  257. if (chArray[num6] == '0'
  258. if ((num6 & 1) != 1) 
  259. RectangleF rect = new RectangleF(MarginX + num7, MarginY, ModuleWidth, ModuleHeight); 
  260. MakeBar(g, rect, Reduction); 
  261. num7 += 1f * ModuleWidth; 
  262. else 
  263. if ((num6 & 1) != 1) 
  264. RectangleF ef2 = new RectangleF(MarginX + num7, MarginY, Ratio * ModuleWidth, ModuleHeight); 
  265. MakeBar(g, ef2, Reduction); 
  266. num7 += Ratio * ModuleWidth; 
  267. #region 供人识别内容 
  268. if (this._humanReadable) 
  269. #region 保留 
  270. /*byte[] buffer2 = processTilde(this._dataToEncode); 
  271. int index = 0; 
  272. List<byte> arr = new List<byte>(); 
  273. for (num6 = 0; num6 < buffer2.Length; num6++) 
  274. { 
  275. //0x20 32 0x7e 126 
  276. if ((buffer2[num6] >= 0x20) && (buffer2[num6] <= 0x7e)) 
  277. { 
  278. arr.Add(buffer2[num6]); 
  279. } 
  280. } 
  281. byte[] bytes = new byte[arr.Count]; 
  282. for (int i = 0; i < arr.Count; i++) 
  283. { 
  284. bytes[i] = arr[i]; 
  285. } 
  286. index = arr.Count; 
  287. //string text = new ASCIIEncoding().GetString(bytes, 0, index); 
  288. */ 
  289. #endregion 
  290. string text = this._dataToEncode; 
  291. if (this._isDisplayCheckCode&&!string.IsNullOrEmpty(this._checkData)) { 
  292. text += this._checkData; 
  293. if (this._isDisplayStartStopSign) 
  294. text = "*" + text + "*"
  295. Font font = new Font(this._humanReadableFont, this._humanReadableSize); 
  296. //g.DrawString(text, font, brush, new PointF(MarginX, MarginY + ModuleHeight)); 
  297. //新增字符串格式 
  298. var drawFormat = new StringFormat { Alignment = StringAlignment.Center }; 
  299. float inpix = image.Width / resolution;//根据DPi求出 英寸数 
  300. float widthmm = inpix * 25.4f; //有每英寸像素求出毫米 
  301. //g.DrawString(text, font, Brushes.Black, width / 2, height - 14, drawFormat); 
  302. g.DrawString(text, font, /*Brushes.Black*/brush, new PointF(/*MarginX*/(int)(widthmm / 2), MarginY + ModuleHeight + 1), drawFormat); 
  303. #endregion 
  304.  
  305. return image; 
  306. /// <summary> 
  307. /// 进行图形填充 
  308. /// </summary> 
  309. /// <param name="g"></param> 
  310. /// <param name="rect"></param> 
  311. /// <param name="reduction"></param> 
  312. private void MakeBar(Graphics g, RectangleF rect, float reduction) 
  313. MakeBar(g, rect, reduction,this._codeBarColor); 
  314. /// <summary> 
  315. /// 进行图形填充 
  316. /// </summary> 
  317. /// <param name="g"></param> 
  318. /// <param name="rect"></param> 
  319. /// <param name="reduction"></param> 
  320. /// <param name="brushColor"></param> 
  321. private void MakeBar(Graphics g, RectangleF rect, float reduction, Color brushColor) 
  322. float num = rect.Width * (reduction / 200f); 
  323. float num2 = rect.Width - (rect.Width * (reduction / 200f)); 
  324. RectangleF ef = new RectangleF 
  325. X = rect.X + num, 
  326. Y = rect.Y, 
  327. Width = num2, 
  328. Height = rect.Height 
  329. }; 
  330. SolidBrush brush = new SolidBrush(brushColor); 
  331. g.FillRectangle(brush, ef); 
  332. private char[] getPattern_c39(byte[] data) 
  333. //0x2a 42为* 
  334. //int num = 0x27; 
  335. int num = 80; 
  336. byte[] buffer = new byte[num + 1]; 
  337. buffer[0] = 0x2a; 
  338. int index = 1; 
  339. for (int i = 0; i < data.Length; i++) 
  340. buffer[index] = data[i]; 
  341. index++; 
  342. if (Checksum) 
  343. buffer[index] = this._checksum_c39(buffer, index); 
  344. if (_isDisplayCheckCode) 
  345. this._checkData = ((char)buffer[index]).ToString(); 
  346. index++; 
  347. buffer[index] = 0x2a; 
  348. index++; 
  349. char[] chArray = new char[index * 10]; 
  350. int num5 = 0; 
  351. for (int j = 0; j < index; j++) 
  352. byte c = buffer[j]; 
  353. int num9 = this.indexFromCharacter(c); 
  354. for (int k = 0; k < 9; k++) 
  355. chArray[num5] = (char)this.c39_bp[num9, k + 1]; 
  356. num5++; 
  357. chArray[num5] = '0'
  358. num5++; 
  359. return chArray; 
  360. private int indexFromCharacter(byte c) 
  361. //0x2c==44 
  362. for (int i = 0; i < 0x2c; i++) 
  363. if (this.c39_bp[i, 0] == c) 
  364. return i; 
  365. return -1; 
  366.  
  367. private byte[] processExtended(byte[] data) 
  368. //0x25 38 
  369. //0x4F 79 0x4E 78 
  370. //int num = 0x4F; 
  371. int num = data.Length - 1; 
  372. byte[] sourceArray = new byte[num + 1]; 
  373. int index = 0; 
  374. for (int i = 0; i < data.Length; i++) 
  375. byte c = data[i]; 
  376. if (this.valueFromCharacter(c) != -1) 
  377. sourceArray[index] = c; 
  378. index++; 
  379. else 
  380. byte num5 = 0; 
  381. byte num6 = 0; 
  382. if (this.valuesFromExtended(c, ref num5, ref num6)) 
  383. sourceArray[index] = num5; 
  384. sourceArray[index + 1] = num6; 
  385. index += 2; 
  386. byte[] destinationArray = new byte[index]; 
  387. Array.Copy(sourceArray, destinationArray, index); 
  388. return destinationArray; 
  389. /// <summary> 
  390. /// 返回指定字符在code39合法字符数组中对应的索引 
  391. /// </summary> 
  392. /// <param name="c"></param> 
  393. /// <returns></returns> 
  394. private int valueFromCharacter(byte c) 
  395. //c39_cw为数组,保存的为合法的字符集信息[0-9A-Z+-*/%. ] 共43个 
  396. //如果存在这个字符就返回c39_cw对应的索引 
  397. for (int i = 0; i < /*0x2b*/this.c39_cw.Length; i++) 
  398. if (this.c39_cw[i] == c) 
  399. return i; 
  400. return -1; 
  401. /// <summary> 
  402. /// 判断字符集是否存在Extended 
  403. /// </summary> 
  404. /// <param name="c"></param> 
  405. /// <param name="v1"></param> 
  406. /// <param name="v2"></param> 
  407. /// <returns></returns> 
  408. private bool valuesFromExtended(byte c, ref byte v1, ref byte v2) 
  409. //0x55 85 
  410. for (int i = 0; i < 0x55; i++) 
  411. if (this.c39_ex[i, 0] == c) 
  412. v1 = this.c39_ex[i, 1]; 
  413. v2 = this.c39_ex[i, 2]; 
  414. return true
  415. return false
  416. private byte[] processTilde(string rawdata) 
  417. byte[] sourceArray = new byte[rawdata.Length]; 
  418. int index = 0; 
  419. for (int i = 0; i < rawdata.Length; i++) 
  420. if (rawdata[i] != '~'
  421. sourceArray[index] = (byte)rawdata[i]; 
  422. index++; 
  423. else if ((i + 3) < rawdata.Length) 
  424. string str = new string(new char[] { rawdata[i + 1], rawdata[i + 2], rawdata[i + 3] }); 
  425. int num3 = Convert.ToInt32(str, 10); 
  426. if ((num3 > 0) && (num3 <= 0xff)) 
  427. sourceArray[index] = (byte)num3; 
  428. index++; 
  429. if (num3 == 0x3e7) 
  430. sourceArray[index] = 0x86; 
  431. index++; 
  432. i += 3; 
  433. else 
  434. sourceArray[index] = (byte)rawdata[i]; 
  435. index++; 
  436. byte[] destinationArray = new byte[index]; 
  437. Array.Copy(sourceArray, destinationArray, index); 
  438. return destinationArray; 

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表