C# winform通过ThoughtWorks.QRCode生成二维码解码可以添加logo
首先要下载ThoughtWorks.QRCode.dll文件,添加引用。
ThoughtWorks.QRCode.dll下载,点击下载
界面如下:
代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using ThoughtWorks.QRCode.Codec; using ThoughtWorks.QRCode.Codec.Data; using ThoughtWorks.QRCode.Codec.Util; using System.IO; namespace QRCode { public partial class FMain : Form { public FMain() { InitializeComponent(); string[] cbversion = new string[41]; for (int i = 0; i <= 40; i++) { cbversion[i] = i.ToString(); } cbVersion.DataSource = cbversion; cbVersion.Text = "7"; cbEncoding.Text = "Byte"; cbCorrectionLevel.Text = "M"; } private void btnEncode_Click(object sender, EventArgs e) { string encoding = cbEncoding.Text; string correctionLever = cbCorrectionLevel.Text; int version = Convert.ToInt32(cbVersion.Text); int scale; if (!int.TryParse(txtScale.Text.Trim(), out scale)) { MessageBox.Show("Scale必须为数字"); return; } string data = txtData.Text.Trim(); if (data == string.Empty) { MessageBox.Show("数据不能为空,请输入数据哦!"); return; } QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();//创建一个对象 switch (encoding)//设置编码模式 { case "Byte": qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; break; case "AlphaNumeric": qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC; break; case "Numeric": qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC; break; } //设置编码测量度 qrCodeEncoder.QRCodeScale = scale; //设置编码版本 qrCodeEncoder.QRCodeVersion = version; if (correctionLever == "L")//设置编码错误纠正 { qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L; } else if (correctionLever == "M") { qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; } else if (correctionLever == "Q") { qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q; } else if (correctionLever == "H") { qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H; } qrCodeEncoder.QRCodeForegroundColor = btnQRCodeForegroundColor.BackColor;//设置二维码前景色 qrCodeEncoder.QRCodeBackgroundColor = btnQRCodeBackgroundColor.BackColor;//设置二维码背景色 Image image = qrCodeEncoder.Encode(data,Encoding.UTF8);//生成二维码图片 if (txtLogo.Text.Trim() != string.Empty)//如果有logo的话则添加logo { Bitmap btm = new Bitmap(txtLogo.Text); Bitmap copyImage = new Bitmap(btm,image.Width/5,image.Height/5); Graphics g = Graphics.FromImage(image); int x = image.Width / 2 - copyImage.Width / 2; int y = image.Height / 2 - copyImage.Height / 2; g.DrawImage(copyImage,x,y); } picEncode.Image = image; } private void btnDecode_Click(object sender, EventArgs e) { try { string decodedString = new QRCodeDecoder().decode(new QRCodeBitmapImage(new Bitmap(picEncode.Image)),Encoding.UTF8); txtData.Text = decodedString; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void btnSave_Click(object sender, EventArgs e)//保存二维码到磁盘 { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|PNG Image|*.png"; sfd.Title = "保存二维码"; sfd.FileName = string.Empty; if (picEncode.Image != null) { if (sfd.ShowDialog() == DialogResult.OK && sfd.FileName != "") { using (FileStream fs = (FileStream)sfd.OpenFile()) { switch (sfd.FilterIndex) { case 1: picEncode.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); break; case 2: picEncode.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp); break; case 3: picEncode.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Gif); break; case 4: picEncode.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Png); break; } } MessageBox.Show("恭喜,保存成功!"); } } else { MessageBox.Show("抱歉,没有要保存的图片哦!"); } } private void btnPrint_Click(object sender, EventArgs e) { } private void btnOpen_Click(object sender, EventArgs e)//打开要选的logo文件 { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|PNG Image|*.png"; if (ofd.ShowDialog() == DialogResult.OK) { String fileName = ofd.FileName; picEncode.Image = new Bitmap(fileName); } } private void btnChooseLogo_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|PNG Image|*.png"; if (ofd.ShowDialog() == DialogResult.OK) { txtLogo.Text = ofd.FileName; } } private void btnQRCodeForegroundColor_Click(object sender, EventArgs e) { ColorDialog cd = new ColorDialog(); if (cd.ShowDialog() == DialogResult.OK) { btnQRCodeForegroundColor.BackColor = cd.Color; } } private void btnQRCodeBackgroundColor_Click(object sender, EventArgs e) { ColorDialog cd = new ColorDialog(); if (cd.ShowDialog() == DialogResult.OK) { btnQRCodeBackgroundColor.BackColor = cd.Color; } } } }
效果如下: