先NuGet引入ThoughtWorks.QRCode
//path :打算存入二维码的位置
//id:因为名称重复会被覆盖 这里用的唯一标识
//name: 用来在白底保存文字的内容
public void QRCodeByProjectList(string path, string id, string name)
{
System.Drawing.Bitmap bt;
//安全反馈移动端地址
string SafetyFeedbackMobileUrl = ConfigurationManager.AppSettings["SafetyFeedbackMobileUrl"].ToString();
string enCodeString = SafetyFeedbackMobileUrl + "?projectid=" + id;
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
qrCodeEncoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
qrCodeEncoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)
qrCodeEncoder.QRCodeBackgroundColor = Color.White;//背景色
qrCodeEncoder.QRCodeForegroundColor = Color.Black;//前景色
bt = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8);
//对二维码进行重绘(白底)
Bitmap bitmap = new Bitmap(bt.Width + 30, bt.Height + 30);
Graphics g = Graphics.FromImage(bitmap);
g.Clear(Color.White);
g.DrawRectangle(new Pen(Color.White), new Rectangle(0, 0, bitmap.Width, bitmap.Height));
g.DrawImage(bt, new PointF(15, 2));
bitmap = InsertWords(bitmap, name);
string codeUrl = path + id + ".jpg";
bitmap.Save(codeUrl);//保存图片
}
public Bitmap InsertWords(Bitmap qrImg, string content = "")
{
Bitmap backgroudImg = new Bitmap(qrImg.Width, qrImg.Height);
backgroudImg.MakeTransparent();
Graphics g2 = Graphics.FromImage(backgroudImg);
g2.Clear(Color.Transparent);
//画二维码到新的面板上
g2.DrawImage(qrImg, 0, 0);
if (!string.IsNullOrEmpty(content))
{
//文本(服务器存在的字体 不然会报错)
FontFamily fontFamily = new FontFamily(System.Drawing.Text.GenericFontFamilies.Monospace);
Font font1 = new Font(fontFamily, 14f, FontStyle.Bold, GraphicsUnit.Pixel);
//文字长度
int strWidth = (int)g2.MeasureString(content, font1).Width;
//总长度减去文字长度的一半 (居中显示)
int wordStartX = (qrImg.Width - strWidth) / 2;
int wordStartY = qrImg.Height - 30;
g2.DrawString(content, font1, Brushes.Black, wordStartX, wordStartY);
}
g2.Dispose();
return backgroudImg;
}