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上,就可以看到结果了。
这里明码是HdhCmsTestcnblogs测试数据
以上代码需要引用 System.Drawing 命名空间。
顺带提一句,还有一种最简单的办法就是下载条形码字体,然后输出的时候设定字体为条形码字体,显示的就是条形码了。不过你不能要求每个客户机都装这种字体。这个是个明显的缺陷,所以不推荐使用这种方法。
分类: C#语言
标签: C# , 条形码
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于BarCode条形码基于C# GDI+ 的实现的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did45905