-博客很久没有更新了,最近在做仓储系统的东西,所以用到了一维码。在参考了其他人的一些解决方案后加上自己的改良,便有了下面的方法。经过扫描机测试完全可用,跟大家分享一下。
条形码在生活中的应用非常广泛,具体的条形码知识大家自行百度,了解条形码知识对理解下面的代码是必要的。如果只是应用的话,直接拿去就可以用了。废话不多说,上代码
1 public Bitmap GetCode39(string sourceCode) 2 { 3 int leftMargin = 5; 4 int topMargin = 0; 5 int thickLength = 2; 6 int narrowLength = 1; 7 int barCodeHeight = 35; 8 int intSourceLength = sourceCode.Length; 9 string strEncode = "010010100"; //添加起始码“*”. 10 var font = new System.Drawing.Font("Segoe UI", 5); 11 12 string AlphaBet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"; 13 14 string[] Code39 = 15 { 16 /* 0 */ "000110100", 17 /* 1 */ "100100001", 18 /* 2 */ "001100001", 19 /* 3 */ "101100000", 20 /* 4 */ "000110001", 21 /* 5 */ "100110000", 22 /* 6 */ "001110000", 23 /* 7 */ "000100101", 24 /* 8 */ "100100100", 25 /* 9 */ "001100100", 26 /* A */ "100001001", 27 /* B */ "001001001", 28 /* C */ "101001000", 29 /* D */ "000011001", 30 /* E */ "100011000", 31 /* F */ "001011000", 32 /* G */ "000001101", 33 /* H */ "100001100", 34 /* I */ "001001100", 35 /* J */ "000011100", 36 /* K */ "100000011", 37 /* L */ "001000011", 38 /* M */ "101000010", 39 /* N */ "000010011", 40 /* O */ "100010010", 41 /* P */ "001010010", 42 /* Q */ "000000111", 43 /* R */ "100000110", 44 /* S */ "001000110", 45 /* T */ "000010110", 46 /* U */ "110000001", 47 /* V */ "011000001", 48 /* W */ "111000000", 49 /* X */ "010010001", 50 /* Y */ "110010000", 51 /* Z */ "011010000", 52 /* - */ "010000101", 53 /* . */ "110000100", 54 /*' '*/ "011000100", 55 /* $ */ "010101000", 56 /* / */ "010100010", 57 /* + */ "010001010", 58 /* % */ "000101010", 59 /* * */ "010010100" 60 }; 61 sourceCode = sourceCode.ToUpper(); 62 63 Bitmap objBitmap = new Bitmap( 64 ((thickLength * 3 + narrowLength * 7) * (intSourceLength + 2)) + (leftMargin * 2), 65 barCodeHeight + (topMargin * 2)); 66 Graphics objGraphics = Graphics.FromImage(objBitmap); 67 68 objGraphics.FillRectangle(Brushes.White, 0, 0, objBitmap.Width, objBitmap.Height); 69 70 for (int i = 0; i < intSourceLength; i++) 71 { 72 //非法字符校验 73 if (AlphaBet.IndexOf(sourceCode[i]) == -1 || sourceCode[i] == '*') 74 { 75 objGraphics.DrawString("Invalid Bar Code", 76 SystemFonts.DefaultFont, Brushes.Red, leftMargin, topMargin); 77 return objBitmap; 78 } 79 //编码 80 strEncode = string.Format("{0}0{1}", strEncode, 81 Code39[AlphaBet.IndexOf(sourceCode[i])]); 82 } 83 84 strEncode = string.Format("{0}0010010100", strEncode); //添加结束码“*” 85 86 int intEncodeLength = strEncode.Length; 87 int intBarWidth; 88 89 for (int i = 0; i < intEncodeLength; i++) //绘制 Code39 barcode 90 { 91 intBarWidth = strEncode[i] == '1' ? thickLength : narrowLength; 92 objGraphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, 93 leftMargin, topMargin, intBarWidth, barCodeHeight); 94 leftMargin += intBarWidth; 95 } 96 97 //绘制 明码 98 SizeF sizeF = objGraphics.MeasureString(sourceCode, font); 99 float x=(objBitmap.Width - sizeF.Width) / 2; 100 float y = objBitmap.Height - sizeF.Height; 101 objGraphics.FillRectangle(Brushes.White, x, y, sizeF.Width, sizeF.Height); 102 objGraphics.DrawString(sourceCode, font, Brushes.Black, x, y); 103 104 return objBitmap; 105 }
新建一个Winform程序拖一个PictureBox控件,然后把方法返回的图片绑到PictureBox上,就可以看到结果了。
这里明码是www.cnblogs.com
以上代码需要引用 System.Drawing 命名空间。
顺带提一句,还有一种最简单的办法就是下载条形码字体,然后输出的时候设定字体为条形码字体,显示的就是条形码了。不过你不能要求每个客户机都装这种字体。这个是个明显的缺陷,所以不推荐使用这种方法。
感谢楼下DataCool的封装,经他封装后的代码在这里:https://files.cnblogs.com/datacool/Code39BarCode.zip
大家可以试着添加其他类型的条码然后跟我们分享,最终可能会变成一个组件,这是后话。