BarCode条形码基于C# GDI+ 的实现
BarCode条形码基于C# GDI+ 的实现.
-博客很久没有更新了,最近在做仓储系统的东西,所以用到了一维码。在参考了其他人的一些解决方案后加上自己的改良,便有了下面的方法。经过扫描机测试完全可用,跟大家分享一下。
条形码在生活中的应用非常广泛,具体的条形码知识大家自行百度,了解条形码知识对理解下面的代码是必要的。如果只是应用的话,直接拿去就可以用了。废话不多说,上代码
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 命名空间。
顺带提一句,还有一种最简单的办法就是下载条形码字体,然后输出的时候设定字体为条形码字体,显示的就是条形码了。不过你不能要求每个客户机都装这种字体。这个是个明显的缺陷,所以不推荐使用这种方法。
分类: C#语言
标签: C# , 条形码
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于BarCode条形码基于C# GDI+ 的实现的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did45905