条形码在生活中的应用非常广泛,具体的条形码知识大家自行百度,了解条形码知识对理解下面的代码是必要的。如果只是应用的话,直接拿去就可以用了。废话不多说,上代码
public Bitmap GetCode39(string sourceCode) { int leftMargin = 5; int topMargin = 0; int thickLength = 2; int narrowLength = 1; int barCodeHeight = 35; int intSourceLength = sourceCode.Length; string strEncode = "010010100"; //添加起始码“*”. var font = new System.Drawing.Font("Segoe UI", 5); string AlphaBet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*"; string[] Code39 = { /* 0 */ "000110100", /* 1 */ "100100001", /* 2 */ "001100001", /* 3 */ "101100000", /* 4 */ "000110001", /* 5 */ "100110000", /* 6 */ "001110000", /* 7 */ "000100101", /* 8 */ "100100100", /* 9 */ "001100100", /* A */ "100001001", /* B */ "001001001", /* C */ "101001000", /* D */ "000011001", /* E */ "100011000", /* F */ "001011000", /* G */ "000001101", /* H */ "100001100", /* I */ "001001100", /* J */ "000011100", /* K */ "100000011", /* L */ "001000011", /* M */ "101000010", /* N */ "000010011", /* O */ "100010010", /* P */ "001010010", /* Q */ "000000111", /* R */ "100000110", /* S */ "001000110", /* T */ "000010110", /* U */ "110000001", /* V */ "011000001", /* W */ "111000000", /* X */ "010010001", /* Y */ "110010000", /* Z */ "011010000", /* - */ "010000101", /* . */ "110000100", /*' '*/ "011000100", /* $ */ "010101000", /* / */ "010100010", /* + */ "010001010", /* % */ "000101010", /* * */ "010010100" }; sourceCode = sourceCode.ToUpper(); Bitmap objBitmap = new Bitmap( ((thickLength * 3 + narrowLength * 7) * (intSourceLength + 2)) + (leftMargin * 2), barCodeHeight + (topMargin * 2)); Graphics objGraphics = Graphics.FromImage(objBitmap); objGraphics.FillRectangle(Brushes.White, 0, 0, objBitmap.Width, objBitmap.Height); for (int i = 0; i < intSourceLength; i++) { //非法字符校验 if (AlphaBet.IndexOf(sourceCode[i]) == -1 || sourceCode[i] == '*') { objGraphics.DrawString("Invalid Bar Code", SystemFonts.DefaultFont, Brushes.Red, leftMargin, topMargin); return objBitmap; } //编码 strEncode = string.Format("{0}0{1}", strEncode, Code39[AlphaBet.IndexOf(sourceCode[i])]); } strEncode = string.Format("{0}0010010100", strEncode); //添加结束码“*” int intEncodeLength = strEncode.Length; int intBarWidth; for (int i = 0; i < intEncodeLength; i++) //绘制 Code39 barcode { intBarWidth = strEncode[i] == '1' ? thickLength : narrowLength; objGraphics.FillRectangle(i % 2 == 0 ? Brushes.Black : Brushes.White, leftMargin, topMargin, intBarWidth, barCodeHeight); leftMargin += intBarWidth; } //绘制 明码 SizeF sizeF = objGraphics.MeasureString(sourceCode, font); float x=(objBitmap.Width - sizeF.Width) / 2; float y = objBitmap.Height - sizeF.Height; objGraphics.FillRectangle(Brushes.White, x, y, sizeF.Width, sizeF.Height); objGraphics.DrawString(sourceCode, font, Brushes.Black, x, y); return objBitmap; }
新建一个Winform程序拖一个PictureBox控件,然后把方法返回的图片绑到PictureBox上,就可以看到结果了。
这里明码是www.cnblogs.com
以上代码需要引用 System.Drawing 命名空间。
顺带提一句,还有一种最简单的办法就是下载条形码字体,然后输出的时候设定字体为条形码字体,显示的就是条形码了。不过你不能要求每个客户机都装这种字体。这个是个明显的缺陷,所以不推荐使用这种方法。
感谢楼下DataCool的封装,经他封装后的代码在这里:http://files.cnblogs.com/datacool/Code39BarCode.zip
大家可以试着添加其他类型的条码然后跟我们分享,最终可能会变成一个组件,这是后话。