今天制造了一个C#的软件,具体是用于生成二维码和条形码的,包括常用的QRCode、DataMatrix、Code128、EAN-8等等。
使用的第三方类库是Zxing.net和DataMatrix.net;另外,程序中也用了委托。
(这两个类库可以在VS2015的NuGet管理器中下载)
但说明一下,其中发现PDF_417是有问题,具体问题是生成的条形码,再解析为字符串时,前面多了“A ”,也不知道是什么原因,反正我很少用到PDF_417,就算了,但其他的编码已经测试过是没问题的。
效果图:
使用非常简单,用法是:从ListView中选择编码类型,然后在Content中输入内容,点击“Encode”则在PictureBox中生成编码,下方的save可以保存图片,open则是打开本地的编码图片,点击“Decode”后即可自动解码。
下面直接上代码(第一段代码是Helper,后面的代码如果不感兴趣可以忽略):
(1)CodeHelper
1 using DataMatrix.net;
2 using System.Collections.Generic;
3 using System.Drawing;
4 using ZXing;
5 using ZXing.Aztec;
6 using ZXing.Common;
7 using ZXing.OneD;
8 using ZXing.PDF417;
9 using ZXing.QrCode;
10
11 namespace CodeHelper
12 {
13 public class CodeHelper
14 {
15 #region 编码
16 public static Bitmap Encode_QR(string content, int width = 100, int margin = 1)
17 {
18 QrCodeEncodingOptions opt = new QrCodeEncodingOptions();
19 opt.DisableECI = true;
20 opt.CharacterSet = "UTF-8";
21 opt.Width = width;
22 opt.Height = width;
23 opt.Margin = margin;
24
25 BarcodeWriter wr = new BarcodeWriter();
26 wr.Options = opt;
27 wr.Format = BarcodeFormat.QR_CODE;
28
29 Bitmap bm = wr.Write(content);
30 return bm;
31 }
32
33 public static Bitmap Encode_DM(string content, int moduleSize = 5, int margin = 5)
34 {
35 DmtxImageEncoderOptions opt = new DmtxImageEncoderOptions();
36 opt.ModuleSize = moduleSize;
37 opt.MarginSize = margin;
38
39 DmtxImageEncoder encoder = new DmtxImageEncoder();
40
41 Bitmap bm = encoder.EncodeImage(content, opt);
42 return bm;
43 }
44
45 public static Bitmap Encode_PDF_417(string content, int width = 100, int margin = 5)
46 {
47 PDF417EncodingOptions opt = new PDF417EncodingOptions();
48 opt.Width = width;
49 opt.Margin = margin;
50 opt.CharacterSet = "UTF-8";
51
52 BarcodeWriter wr = new BarcodeWriter();
53 wr.Options = opt;
54 wr.Format = BarcodeFormat.PDF_417;
55
56 Bitmap bm = wr.Write(content);
57 return bm;
58 }
59
60 public static Bitmap Encode_AZTEC(string content, int width = 100, int margin = 1)
61 {
62 AztecEncodingOptions opt = new AztecEncodingOptions();
63 opt.Width = width;
64 opt.Height = width;
65 opt.Margin = margin;
66
67 BarcodeWriter wr = new BarcodeWriter();
68 wr.Options = opt;
69 wr.Format = BarcodeFormat.AZTEC;
70
71 Bitmap bm = wr.Write(content);
72 return bm;
73 }
74
75 public static Bitmap Encode_Code_128(string content, int heigt = 40, int margin = 5)
76 {
77 Code128EncodingOptions opt = new Code128EncodingOptions();
78 opt.Height = heigt;
79 opt.Margin = margin;
80
81 BarcodeWriter wr = new BarcodeWriter();
82 wr.Options = opt;
83 wr.Format = BarcodeFormat.CODE_128;
84
85 Bitmap bm = wr.Write(content);
86 return bm;
87 }
88
89 public static Bitmap Encode_Code_39(string content, int height = 30, int margin = 1)
90 {
91 EncodingOptions encodeOption = new EncodingOptions();
92 encodeOption.Height = height;
93 encodeOption.Margin = margin;
94
95 BarcodeWriter wr = new BarcodeWriter();
96 wr.Options = encodeOption;
97 wr.Format = BarcodeFormat.CODE_39;
98
99 Bitmap bm = wr.Write(content);
100 return bm;
101 }
102
103 public static Bitmap Encode_EAN_8(string content, int height = 50, int margin = 1)
104 {
105 EncodingOptions encodeOption = new EncodingOptions();
106 encodeOption.Height = height;
107 encodeOption.Margin = margin;
108
109 BarcodeWriter wr = new BarcodeWriter();
110 wr.Options = encodeOption;
111 wr.Format = BarcodeFormat.EAN_8;
112
113 Bitmap bm = wr.Write(content);
114 return bm;
115 }
116
117 public static Bitmap Encode_EAN_13(string content, int height = 50, int margin = 1)
118 {
119 EncodingOptions encodeOption = new EncodingOptions();
120 encodeOption.Height = height;
121 encodeOption.Margin = margin;
122
123 BarcodeWriter wr = new BarcodeWriter();
124 wr.Options = encodeOption;
125 wr.Format = BarcodeFormat.EAN_13;
126
127 Bitmap bm = wr.Write(content);
128 return bm;
129 }
130 #endregion
131
132 #region 编码重载
133 public static Bitmap Encode_QR(string content)
134 {
135 return Encode_QR(content, 100, 1);
136 }
137
138 public static Bitmap Encode_DM(string content)
139 {
140 return Encode_DM(content, 5, 5);
141 }
142
143 public static Bitmap Encode_PDF_417(string content)
144 {
145 return Encode_PDF_417(content, 100, 5);
146 }
147
148 public static Bitmap Encode_AZTEC(string content)
149 {
150 return Encode_AZTEC(content, 100, 1);
151 }
152
153 public static Bitmap Encode_Code_128(string content)
154 {
155 return Encode_Code_128(content, 40, 5);
156 }
157
158 public static Bitmap Encode_Code_39(string content)
159 {
160 return Encode_Code_39(content, 30, 1);
161 }
162
163 public static Bitmap Encode_EAN_8(string content)
164 {
165 return Encode_EAN_8(content, 50, 1);
166 }
167
168 public static Bitmap Encode_EAN_13(string content)
169 {
170 return Encode_EAN_13(content, 50, 1);
171 }
172 #endregion
173
174 ///
175 /// 全部编码类型解码
176 ///
177 ///
178 ///
179 public static string Decode(Bitmap bm)
180 {
181 DecodingOptions opt = new DecodingOptions();
182 opt.PossibleFormats = new List()
183 {
184 BarcodeFormat.QR_CODE,
185 BarcodeFormat.DATA_MATRIX,
186 BarcodeFormat.PDF_417,
187 BarcodeFormat.AZTEC,
188 BarcodeFormat.CODE_128,
189 BarcodeFormat.CODE_39,
190 BarcodeFormat.EAN_8,
191 BarcodeFormat.EAN_13
192 };
193 opt.CharacterSet = "UTF-8";
194
195 BarcodeReader reader = new BarcodeReader();
196 reader.Options = opt;
197 Result rs = reader.Decode(bm);
198 if (rs != null)
199 {
200 return rs.Text;
201 }
202
203 //DM
204 DmtxImageDecoder decoder = new DmtxImageDecoder();
205 List<string> list = decoder.DecodeImage(bm);
206 if (list.Count > 0)
207 {
208 return list[0];
209 }
210
211 return "";
212 }
213 }
214 }
(2)Codes类:
1 using System.Collections.Generic;
2 using System.Drawing;
3 using ZXing;
4
5 namespace CodeHelper
6 {
7 public class Code
8 {
9 public string Name { get; set; }
10
11 public BarcodeFormat Type { get; set; }
12
13 public delegateGetBm GetBm { get; set; }
14 }
15
16 public delegate Bitmap delegateGetBm(string content);
17
18 public class Codes
19 {
20 public Dictionary<int, Code> list { get; set; }
21
22 public Codes()
23 {
24 list = new Dictionary<int, Code>();
25 list.Add(0, new Code { Name = "QR_CODE", Type = BarcodeFormat.QR_CODE, GetBm = CodeHelper.Encode_QR });
26 list.Add(1, new Code { Name = "DATA_MATRIX", Type = BarcodeFormat.DATA_MATRIX, GetBm = CodeHelper.Encode_DM });
27 list.Add(2, new Code { Name = "PDF_417", Type = BarcodeFormat.PDF_417, GetBm = CodeHelper.Encode_PDF_417 });
28 list.Add(3, new Code { Name = "AZTEC", Type = BarcodeFormat.AZTEC, GetBm = CodeHelper.Encode_AZTEC });
29 list.Add(4, new Code { Name = "CODE_128", Type = BarcodeFormat.CODE_128, GetBm = CodeHelper.Encode_Code_128 });
30 list.Add(5, new Code { Name = "CODE_39", Type = BarcodeFormat.CODE_39, GetBm = CodeHelper.Encode_Code_39 });
31 list.Add(6, new Code { Name = "EAN_8", Type = BarcodeFormat.EAN_8, GetBm = CodeHelper.Encode_EAN_8 });
32 list.Add(7, new Code { Name = "EAN_13", Type = BarcodeFormat.EAN_13, GetBm = CodeHelper.Encode_EAN_13 });
33 }
34 }
35 }
(3)主界面的后台代码:
1 using System;
2 using System.Drawing;
3 using System.Windows.Forms;
4
5 namespace CodeHelper
6 {
7 public partial class FrmMain : Form
8 {
9 public Codes Codes = new Codes();
10
11 public FrmMain()
12 {
13 InitializeComponent();
14 }
15
16 private void FrmMain_Load(object sender, EventArgs e)
17 {
18 BindListViewItem();
19 lvType.Items[0].Selected = true;
20 }
21
22 private void btnEncode_Click(object sender, EventArgs e)
23 {
24 string content = txtContent.Text;
25
26 int index = lvType.SelectedItems[0].Index;
27 try
28 {
29 pbCode.Image = Codes.list[index].GetBm(content);
30 }
31 catch (Exception ex)
32 {
33 txtContent.Text = "";
34 pbCode.Image = null;
35 MessageBox.Show(ex.Message);
36 }
37 }
38
39 private void btnSave_Click(object sender, EventArgs e)
40 {
41 if (pbCode.Image == null)
42 {
43 MessageBox.Show("there is no code.");
44 return;
45 }
46
47 bool isSave = true;
48 SaveFileDialog sfd = new SaveFileDialog();
49 sfd.Title = "图片保存";
50 sfd.Filter = @"jpeg|*.jpg|bmp|*.bmp|png|*.png";
51 sfd.FileName = txtContent.Text;
52
53 if (sfd.ShowDialog() == DialogResult.OK)
54 {
55 string fileName = sfd.FileName.ToString();
56 if (fileName != "" && fileName != null)
57 {
58 string fileExtName = fileName.Substring(fileName.LastIndexOf(".") + 1).ToString();
59 System.Drawing.Imaging.ImageFormat imgformat = null;
60 if (fileExtName != "")
61 {
62 switch (fileExtName)
63 {
64 case "jpg":
65 imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
66 break;
67 case "bmp":
68 imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
69 break;
70 case "png":
71 imgformat = System.Drawing.Imaging.ImageFormat.Gif;
72 break;
73 default:
74 MessageBox.Show("只能保存为: jpg,bmp,png 格式");
75 isSave = false;
76 break;
77 }
78 }
79 if (imgformat == null)
80 {
81 imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
82 }
83 if (isSave)
84 {
85 try
86 {
87 pbCode.Image.Save(fileName, imgformat);
88 }
89 catch
90 {
91 MessageBox.Show("保存失败,还没有图片或已经清空图片!");
92 }
93 }
94 }
95 }
96 }
97
98 private void BindListViewItem()
99 {
100 lvType.View = View.LargeIcon;
101 lvType.LargeImageList = imgList;
102 lvType.BeginUpdate();
103
104 for (int i = 0; i < Codes.list.Count; i++)
105 {
106 ListViewItem lvi = new ListViewItem();
107 lvi.ImageIndex = i;
108 lvi.Text = Codes.list[i].Name;
109 lvType.Items.Add(lvi);
110 }
111 lvType.EndUpdate();
112 }
113
114 private void btnDecode_Click(object sender, EventArgs e)
115 {
116 txtContent.Text = "";
117
118 Bitmap bm = (Bitmap)pbCode.Image;
119 try
120 {
121 txtContent.Text = CodeHelper.Decode(bm);
122 }
123 catch (Exception ex)
124 {
125 MessageBox.Show(ex.Message);
126 }
127 }
128
129 private void btnOpen_Click(object sender, EventArgs e)
130 {
131 txtContent.Text = "";
132 pbCode.Image = null;
133
134 OpenFileDialog ofd = new OpenFileDialog();
135 ofd.Title = "打开图片";
136 ofd.Filter = @"所有文件|*.*|jpeg|*.jpg|bmp|*.bmp|png|*.png";
137
138 if (ofd.ShowDialog() == DialogResult.OK)
139 pbCode.Image = Image.FromFile(ofd.FileName);
140 }
141
142 private void lvType_SelectedIndexChanged(object sender, EventArgs e)
143 {
144 pbCode.Image = null;
145 }
146 }
147 }
界面的控件:
Label lblType;
ListView lvType;
Button btnEncode;
Button btnDecode;
PictureBox pbCode;
TextBox txtContent;
Label lblContent;
Button btnSave;
Button btnOpen;
ImageList imgList;
就这样吧,欢迎交流。