基于C#生成条形码操作知识汇总附源码








本文实例讲述了C#实现用于生成条形码的类。分享给大家供大家参考。具体如下:

这个C#类可以用来生成39码 12位标准条形码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
using System.Collections;
using System.Text.RegularExpressions;
namespace DotNet.Utilities
{
   public class BarCodeToHTML
   {
     public static string get39( string s, int width, int height)
     {
       Hashtable ht = new Hashtable();
       #region 39码 12位
       ht.Add( 'A' , "110101001011" );
       ht.Add( 'B' , "101101001011" );
       ht.Add( 'C' , "110110100101" );
       ht.Add( 'D' , "101011001011" );
       ht.Add( 'E' , "110101100101" );
       ht.Add( 'F' , "101101100101" );
       ht.Add( 'G' , "101010011011" );
       ht.Add( 'H' , "110101001101" );
       ht.Add( 'I' , "101101001101" );
       ht.Add( 'J' , "101011001101" );
       ht.Add( 'K' , "110101010011" );
       ht.Add( 'L' , "101101010011" );
       ht.Add( 'M' , "110110101001" );
       ht.Add( 'N' , "101011010011" );
       ht.Add( 'O' , "110101101001" );
       ht.Add( 'P' , "101101101001" );
       ht.Add( 'Q' , "101010110011" );
       ht.Add( 'R' , "110101011001" );
       ht.Add( 'S' , "101101011001" );
       ht.Add( 'T' , "101011011001" );
       ht.Add( 'U' , "110010101011" );
       ht.Add( 'V' , "100110101011" );
       ht.Add( 'W' , "110011010101" );
       ht.Add( 'X' , "100101101011" );
       ht.Add( 'Y' , "110010110101" );
       ht.Add( 'Z' , "100110110101" );
       ht.Add( '0' , "101001101101" );
       ht.Add( '1' , "110100101011" );
       ht.Add( '2' , "101100101011" );
       ht.Add( '3' , "110110010101" );
       ht.Add( '4' , "101001101011" );
       ht.Add( '5' , "110100110101" );
       ht.Add( '6' , "101100110101" );
       ht.Add( '7' , "101001011011" );
       ht.Add( '8' , "110100101101" );
       ht.Add( '9' , "101100101101" );
       ht.Add( '+' , "100101001001" );
       ht.Add( '-' , "100101011011" );
       ht.Add( '*' , "100101101101" );
       ht.Add( '/' , "100100101001" );
       ht.Add( '%' , "101001001001" );
       ht.Add( '$' , "100100100101" );
       ht.Add( '.' , "110010101101" );
       ht.Add( ' ' , "100110101101" );
       #endregion
       #region 39码 9位
       //ht.Add('0', "000110100");
       //ht.Add('1', "100100001");
       //ht.Add('2', "001100001");
       //ht.Add('3', "101100000");
       //ht.Add('4', "000110001");
       //ht.Add('5', "100110000");
       //ht.Add('6', "001110000");
       //ht.Add('7', "000100101");
       //ht.Add('8', "100100100");
       //ht.Add('9', "001100100");
       //ht.Add('A', "100001001");
       //ht.Add('B', "001001001");
       //ht.Add('C', "101001000");
       //ht.Add('D', "000011001");
       //ht.Add('E', "100011000");
       //ht.Add('F', "001011000");
       //ht.Add('G', "000001101");
       //ht.Add('H', "100001100");
       //ht.Add('I', "001001100");
       //ht.Add('J', "000011100");
       //ht.Add('K', "100000011");
       //ht.Add('L', "001000011");
       //ht.Add('M', "101000010");
       //ht.Add('N', "000010011");
       //ht.Add('O', "100010010");
       //ht.Add('P', "001010010");
       //ht.Add('Q', "000000111");
       //ht.Add('R', "100000110");
       //ht.Add('S', "001000110");
       //ht.Add('T', "000010110");
       //ht.Add('U', "110000001");
       //ht.Add('V', "011000001");
       //ht.Add('W', "111000000");
       //ht.Add('X', "010010001");
       //ht.Add('Y', "110010000");
       //ht.Add('Z', "011010000");
       //ht.Add('-', "010000101");
       //ht.Add('.', "110000100");
       //ht.Add(' ', "011000100");
       //ht.Add('*', "010010100");
       //ht.Add('$', "010101000");
       //ht.Add('/', "010100010");
       //ht.Add('+', "010001010");
       //ht.Add('%', "000101010");
       #endregion
       s = "*" + s.ToUpper() + "*" ;
       string result_bin = "" ; //二进制串
       try
       {
         foreach ( char ch in s)
         {
           result_bin += ht[ch].ToString();
           result_bin += "0" ; //间隔,与一个单位的线条宽度相等
         }
       }
       catch { return "存在不允许的字符!" ; }
       string result_html = "" ; //HTML代码
       string color = "" ;    //颜色
       foreach ( char c in result_bin)
       {
         color = c == '0' ? "#FFFFFF" : "#000000" ;
         result_html += "<div style=\"width:" + width + "px;height:" + height + "px;float:left;background:" + color + ";\"></div>" ;
       }
       result_html += "<div style=\"clear:both\"></div>" ;
       int len = ht[ '*' ].ToString().Length;
       foreach ( char c in s)
       {
         result_html += "<div style=\"width:" + (width * (len + 1)) + "px;float:left;color:#000000;text-align:center;\">" + c + "</div>" ;
       }
       result_html += "<div style=\"clear:both\"></div>" ;
       return "<div style=\"background:#FFFFFF;padding:5px;font-size:" + (width * 10) + "px;font-family:'楷体';\">" + result_html + "</div>" ;
     }
     public static string getEAN13( string s, int width, int height)
     {
       int checkcode_input = -1; //输入的校验码
       if (!Regex.IsMatch(s, @"^\d{12}$" ))
       {
         if (!Regex.IsMatch(s, @"^\d{13}$" ))
         {
           return "存在不允许的字符!" ;
         }
         else
         {
           checkcode_input = int .Parse(s[12].ToString());
           s = s.Substring(0, 12);
         }
       }
       int sum_even = 0; //偶数位之和
       int sum_odd = 0; //奇数位之和
       for ( int i = 0; i < 12; i++)
       {
         if (i % 2 == 0)
         {
           sum_odd += int .Parse(s[i].ToString());
         }
         else
         {
           sum_even += int .Parse(s[i].ToString());
         }
       }
       int checkcode = (10 - (sum_even * 3 + sum_odd) % 10) % 10; //校验码
       if (checkcode_input > 0 && checkcode_input != checkcode)
       {
         return "输入的校验码错误!" ;
       }
       s += checkcode; //变成13位
       // 000000000101左侧42个01010右侧35个校验7个101000000000
       // 6    101左侧6位 01010右侧5位校验1位101000000000
       string result_bin = "" ; //二进制串
       result_bin += "000000000101" ;
       string type = ean13type(s[0]);
       for ( int i = 1; i < 7; i++)
       {
         result_bin += ean13(s[i], type[i - 1]);
       }
       result_bin += "01010" ;
       for ( int i = 7; i < 13; i++)
       {
         result_bin += ean13(s[i], 'C' );
       }
       result_bin += "101000000000" ;
       string result_html = "" ; //HTML代码
       string color = "" ;    //颜色
       int height_bottom = width * 5;
       foreach ( char c in result_bin)
       {
         color = c == '0' ? "#FFFFFF" : "#000000" ;
         result_html += "<div style=\"width:" + width + "px;height:" + height + "px;float:left;background:" + color + ";\"></div>" ;
       }
       result_html += "<div style=\"clear:both\"></div>" ;
       result_html += "<div style=\"float:left;color:#000000;width:" + (width * 9) + "px;text-align:center;\">" + s[0] + "</div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#000000;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#000000;\"></div>" ;
       for ( int i = 1; i < 7; i++)
       {
         result_html += "<div style=\"float:left;width:" + (width * 7) + "px;color:#000000;text-align:center;\">" + s[i] + "</div>" ;
       }
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#000000;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#000000;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;\"></div>" ;
       for ( int i = 7; i < 13; i++)
       {
         result_html += "<div style=\"float:left;width:" + (width * 7) + "px;color:#000000;text-align:center;\">" + s[i] + "</div>" ;
       }
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#000000;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;\"></div>" ;
       result_html += "<div style=\"float:left;width:" + width + "px;height:" + height_bottom + "px;background:#000000;\"></div>" ;
       result_html += "<div style=\"float:left;color:#000000;width:" + (width * 9) + "px;\"></div>" ;
       result_html += "<div style=\"clear:both\"></div>" ;
       return "<div style=\"background:#FFFFFF;padding:0px;font-size:" + (width * 10) + "px;font-family:'楷体';\">" + result_html + "</div>" ;
     }
     private static string ean13( char c, char type)
     {
       switch (type)
       {
         case 'A' :
           {
             switch (c)
             {
               case '0' : return "0001101" ;
               case '1' : return "0011001" ;
               case '2' : return "0010011" ;
               case '3' : return "0111101" ; //011101
               case '4' : return "0100011" ;
               case '5' : return "0110001" ;
               case '6' : return "0101111" ;
               case '7' : return "0111011" ;
               case '8' : return "0110111" ;
               case '9' : return "0001011" ;
               default : return "Error!" ;
             }
           }
         case 'B' :
           {
             switch (c)
             {
               case '0' : return "0100111" ;
               case '1' : return "0110011" ;
               case '2' : return "0011011" ;
               case '3' : return "0100001" ;
               case '4' : return "0011101" ;
               case '5' : return "0111001" ;
               case '6' : return "0000101" ; //000101
               case '7' : return "0010001" ;
               case '8' : return "0001001" ;
               case '9' : return "0010111" ;
               default : return "Error!" ;
             }
           }
         case 'C' :
           {
             switch (c)
             {
               case '0' : return "1110010" ;
               case '1' : return "1100110" ;
               case '2' : return "1101100" ;
               case '3' : return "1000010" ;
               case '4' : return "1011100" ;
               case '5' : return "1001110" ;
               case '6' : return "1010000" ;
               case '7' : return "1000100" ;
               case '8' : return "1001000" ;
               case '9' : return "1110100" ;
               default : return "Error!" ;
             }
           }
         default : return "Error!" ;
       }
     }
     private static string ean13type( char c)
     {
       switch (c)
       {
         case '0' : return "AAAAAA" ;
         case '1' : return "AABABB" ;
         case '2' : return "AABBAB" ;
         case '3' : return "AABBBA" ;
         case '4' : return "ABAABB" ;
         case '5' : return "ABBAAB" ;
         case '6' : return "ABBBAA" ; //中国
         case '7' : return "ABABAB" ;
         case '8' : return "ABABBA" ;
         case '9' : return "ABBABA" ;
         default : return "Error!" ;
       }
     }
   }
}







1. 介绍

1.1 条形码

条形码(barcode):是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。

1.2 条形码分类

可分为一维条形码和二维条形码:

一维条形码:只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息。

二维条形码:在水平和垂直方向的二维空间存储信息的条形码。

1.3 第三方类库:ZXing.Net

1.3.1 说明

ZXing 是一个可生成和读取 1D/2D(1维/2维) 条形码的开源类库。原先是Java版本,后由第三方衍生了支持QT、C++、.Net等版本。

.Net版本支持的平台:.Net 2.0, 3.5 and 4.0、Silverlight 4 and 5、Windows Phone 7.0, 7.1 and 8.0、Windows CE、Unity3D、Xamarin.Android 等等。

1.3.2 下载地址

Java 版本:https://github.com/zxing/zxing

ZXing.Net 版本:http://zxingnet.codeplex.com/

2. 一维码操作

2.1 介绍

一维条形码:只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息。

常用码制:EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码及Codabar(库德巴码)等。

国内推行使用的是EAN商品条形码,可分为EAN-13(标准版)和EAN-8(缩短版)两种。

例图:


frameborder="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; padding: 0px; border: currentColor; border-image: none; width: 100%; height: 74px; vertical-align: baseline; display: block; position: static;" allowtransparency="true">

2.2 生成一维码

以生成EAN-13码制为例:

?
1
2
3
4
5
6
7
8
9
10
11
// 1.设置条形码规格
EncodingOptions encodeOption = new EncodingOptions();
encodeOption.Height = 130; // 必须制定高度、宽度
encodeOption.Width = 240;
// 2.生成条形码图片并保存
ZXing.BarcodeWriter wr = new BarcodeWriter();
wr.Options = encodeOption;
wr.Format = BarcodeFormat.EAN_13; // 条形码规格:EAN13规格:12(无校验位)或13位数字
Bitmap img = wr.Write( this .ContentTxt.Text); // 生成图片
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + "\\EAN_13-" + this .ContentTxt.Text + ".jpg" ;
img.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);

2.3 读取一维码

以读取EAN-13码制的图片为例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 1.设置读取条形码规格
DecodingOptions decodeOption = new DecodingOptions();
decodeOption.PossibleFormats = new List<BarcodeFormat>() {
  BarcodeFormat.EAN_13,
};
// 2.进行读取操作
ZXing.BarcodeReader br = new BarcodeReader();
br.Options = decodeOption;
ZXing.Result rs = br.Decode( this .barCodeImg.Image as Bitmap);
if (rs == null )
{
  this .ContentTxt.Text = "读取失败" ;
  MessageBox.Show( "读取失败" );
}
else
{
  this .ContentTxt.Text = rs.Text;
  MessageBox.Show( "读取成功,内容:" + rs.Text);
}

3. 二维码操作

3.1 介绍

二维码:在水平和垂直方向的二维空间存储信息的条形码。

常用码制:PDF417、QR Code、Code 49、Code 16K、Code One等。

例图:

 

frameborder="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; padding: 0px; border: currentColor; border-image: none; width: 100%; height: 74px; vertical-align: baseline; display: block; position: static;" allowtransparency="true">

3.2 生成二维码

以生成QR码制为例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 1.设置QR二维码的规格
ZXing.QrCode.QrCodeEncodingOptions qrEncodeOption = new ZXing.QrCode.QrCodeEncodingOptions();
qrEncodeOption.CharacterSet = "UTF-8" ; // 设置编码格式,否则读取'中文'乱码
qrEncodeOption.Height = 200;
qrEncodeOption.Width = 200;
qrEncodeOption.Margin = 1; // 设置周围空白边距
// 2.生成条形码图片并保存
ZXing.BarcodeWriter wr = new BarcodeWriter();
wr.Format = BarcodeFormat.QR_CODE; // 二维码
wr.Options = qrEncodeOption;
Bitmap img = wr.Write( this .ContentTxt.Text);
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + "\\QR-" + this .ContentTxt.Text + ".jpg" ;
img.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);

3.3 读取二维码

以读取QR码制的图片为例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 1.设置读取条形码规格
DecodingOptions decodeOption = new DecodingOptions();
decodeOption.PossibleFormats = new List<BarcodeFormat>() {
  BarcodeFormat.QR_CODE,
;
// 2.进行读取操作
ZXing.BarcodeReader br = new BarcodeReader();
br.Options = decodeOption;
ZXing.Result rs = br.Decode( this .barCodeImg.Image as Bitmap);
if (rs == null )
{
  this .ContentTxt.Text = "读取失败" ;
  MessageBox.Show( "读取失败" );
}
else
{
  this .ContentTxt.Text = rs.Text;
  MessageBox.Show( "读取成功,内容:" + rs.Text);
}

3.4 生成带Logo的二维码

二维码带有校验功能,故可以在中间区域展示一定尺寸的图片。

例图:



代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1.设置QR二维码的规格
ZXing.QrCode.QrCodeEncodingOptions qrEncodeOption = new ZXing.QrCode.QrCodeEncodingOptions();
qrEncodeOption.CharacterSet = "UTF-8" ; // 设置编码格式,否则读取'中文'乱码
qrEncodeOption.Height = 200;
qrEncodeOption.Width = 200;
qrEncodeOption.Margin = 1; // 设置周围空白边距
// 2.生成条形码图片
ZXing.BarcodeWriter wr = new BarcodeWriter();
wr.Format = BarcodeFormat.QR_CODE; // 二维码
wr.Options = qrEncodeOption;
Bitmap img = wr.Write( this .ContentTxt.Text);
// 3.在二维码的Bitmap对象上绘制logo图片
Bitmap logoImg = Bitmap.FromFile(System.AppDomain.CurrentDomain.BaseDirectory + "\\logo.jpg" ) as Bitmap;
Graphics g = Graphics.FromImage(img);
Rectangle logoRec = new Rectangle(); // 设置logo图片的大小和绘制位置
logoRec.Width = img.Width / 6;
logoRec.Height = img.Height / 6;
logoRec.X = img.Width / 2 - logoRec.Width / 2; // 中心点
logoRec.Y = img.Height / 2 - logoRec.Height / 2;
g.DrawImage(logoImg, logoRec);
// 4.保存绘制后的图片
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + "\\QR-" + this .ContentTxt.Text + ".jpg" ;
img.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);

4. 源码下载

4.1 运行图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值