C#生成二维码的内容
生成二维码的内容
using QRCoder;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 生成二维码的内容 string strCode = this.txtQr.Text.Trim(); if (string.IsNullOrWhiteSpace(strCode)) { MessageBox.Show("请输入值"); return; } //var bitmap = QrCodeHelper.Create(cont); //pictureBox1.Image = bitmap; QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(strCode, QRCodeGenerator.ECCLevel.Q); QRCode qrcode = new QRCode(qrCodeData); // qrcode.GetGraphic 方法可参考最下发“补充说明” Bitmap qrCodeImage = qrcode.GetGraphic(5, Color.Black, Color.White, null, 15, 6, false); MemoryStream ms = new MemoryStream(); //qrCodeImage.Save((ms, ImageFormat.Jpeg); // 如果想保存图片 可使用 string strDirPath = System.AppDomain.CurrentDomain.BaseDirectory + "QrCoderImg"; if (!Directory.Exists(strDirPath)) { Directory.CreateDirectory(strDirPath); } string filePath = strDirPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".png"; qrCodeImage.Save(filePath); pictureBox1.ImageLocation = filePath; //// 响应类型 //context.Response.ContentType = "image/Jpeg"; ////输出字符流 //context.Response.BinaryWrite(ms.ToArray());
带logo
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 生成带logo二维码 /// </summary> public class QRCodeHelper {/// <summary> /// 创建二维码 /// </summary> /// <param name="content"></param> /// <param name="size"></param> /// <returns></returns> public static Bitmap Create(string content) { try { //var options = new QrCodeEncodingOptions //{ // DisableECI = true, // CharacterSet = "UTF-8", // Width = size, // Height = size, // Margin = 0, // ErrorCorrection = ErrorCorrectionLevel.H //}; //var writer = new BarcodeWriter(); //writer.Format = BarcodeFormat.QR_CODE; //writer.Options = options; //var bmp = writer.Write(content); //return bmp; QRCodeEncoder qRCodeEncoder = new QRCodeEncoder(); qRCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//设置二维码编码格式 qRCodeEncoder.QRCodeScale = 4;//设置编码测量度 qRCodeEncoder.QRCodeVersion = 7;//设置编码版本 qRCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//设置错误校验 Bitmap image = qRCodeEncoder.Encode(content); return image; } catch (Exception ex) { return null; } } /// <summary> /// 获取本地图片 /// </summary> /// <param name="fileName"></param> /// <returns></returns> private static Bitmap GetLocalLog(string fileName) { Bitmap newBmp = new Bitmap(fileName); //Bitmap bmp = new Bitmap(newBmp); return newBmp; } /// <summary> /// 生成带logo二维码 /// </summary> /// <returns></returns> public static Bitmap CreateQRCodeWithLogo(string content, string logopath) { //生成二维码 Bitmap qrcode = Create(content); //生成logo Bitmap logo = GetLocalLog(logopath); ImageUtility util = new ImageUtility(); Bitmap finalImage = util.MergeQrImg(qrcode, logo); return finalImage; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class ImageUtility { #region 合并用户QR图片和用户头像 /// <summary> /// 合并用户QR图片和用户头像 /// </summary> /// <param name="qrImg">QR图片</param> /// <param name="headerImg">用户头像</param> /// <param name="n"></param> /// <returns></returns> public Bitmap MergeQrImg(Bitmap qrImg, Bitmap headerImg, double n = 0.23) { int margin = 10; float dpix = qrImg.HorizontalResolution; float dpiy = qrImg.VerticalResolution; var _newWidth = (10 * qrImg.Width - 36 * margin) * 1.0f / 36; var _headerImg = ZoomPic(headerImg, _newWidth / headerImg.Width); //处理头像 int newImgWidth = _headerImg.Width + margin; Bitmap headerBgImg = new Bitmap(newImgWidth, newImgWidth); headerBgImg.MakeTransparent(); Graphics g = Graphics.FromImage(headerBgImg); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.Clear(Color.Transparent); Pen p = new Pen(new SolidBrush(Color.White)); Rectangle rect = new Rectangle(0, 0, newImgWidth - 1, newImgWidth - 1); using (GraphicsPath path = CreateRoundedRectanglePath(rect, 1)) { g.DrawPath(p, path); g.FillPath(new SolidBrush(Color.White), path); } //画头像 Bitmap img1 = new Bitmap(_headerImg.Width, _headerImg.Width); Graphics g1 = Graphics.FromImage(img1); g1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g1.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g1.Clear(Color.Transparent); Pen p1 = new Pen(new SolidBrush(Color.Gray)); Rectangle rect1 = new Rectangle(0, 0, _headerImg.Width - 1, _headerImg.Width - 1); using (GraphicsPath path1 = CreateRoundedRectanglePath(rect1, 1)) { g1.DrawPath(p1, path1); TextureBrush brush = new TextureBrush(_headerImg); g1.FillPath(brush, path1); } g1.Dispose(); PointF center = new PointF((newImgWidth - _headerImg.Width) / 2, (newImgWidth - _headerImg.Height) / 2); g.DrawImage(img1, center.X, center.Y, _headerImg.Width, _headerImg.Height); g.Dispose(); Bitmap backgroudImg = new Bitmap(qrImg.Width, qrImg.Height); backgroudImg.MakeTransparent(); backgroudImg.SetResolution(dpix, dpiy); headerBgImg.SetResolution(dpix, dpiy); Graphics g2 = Graphics.FromImage(backgroudImg); g2.Clear(Color.Transparent); g2.DrawImage(qrImg, 0, 0); PointF center2 = new PointF((qrImg.Width - headerBgImg.Width) / 2, (qrImg.Height - headerBgImg.Height) / 2); g2.DrawImage(headerBgImg, center2); g2.Dispose(); return backgroudImg; } #endregion #region 图形处理 /// <summary> /// 创建圆角矩形 /// </summary> /// <param name="rect">区域</param> /// <param name="cornerRadius">圆角角度</param> /// <returns></returns> private GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int cornerRadius) { //下午重新整理下,圆角矩形 GraphicsPath roundedRect = new GraphicsPath(); roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90); roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y); roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90); roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2); roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90); roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom); roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90); roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2); roundedRect.CloseFigure(); return roundedRect; } /// <summary> /// 图片按比例缩放 /// </summary> private Image ZoomPic(Image initImage, double n) { //缩略图宽、高计算 double newWidth = initImage.Width; double newHeight = initImage.Height; newWidth = n * initImage.Width; newHeight = n * initImage.Height; //生成新图 //新建一个bmp图片 System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight); //新建一个画板 System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage); //设置质量 newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //置背景色 newG.Clear(Color.Transparent); //画图 newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel); newG.Dispose(); return newImage; } /// <summary> /// 创建缩略图 /// </summary> /// <param name="b"></param> /// <param name="destHeight"></param> /// <param name="destWidth"></param> /// <returns></returns> public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth) { System.Drawing.Image imgSource = b; System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat; int sW = 0, sH = 0; // 按比例缩放 int sWidth = imgSource.Width; int sHeight = imgSource.Height; if (sHeight > destHeight || sWidth > destWidth) { if ((sWidth * destHeight) > (sHeight * destWidth)) { sW = destWidth; sH = (destWidth * sHeight) / sWidth; } else { sH = destHeight; sW = (sWidth * destHeight) / sHeight; } } else { sW = sWidth; sH = sHeight; } Bitmap outBmp = new Bitmap(destWidth, destHeight); Graphics g = Graphics.FromImage(outBmp); g.Clear(Color.Transparent); // 设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel); g.Dispose(); // 以下代码为保存图片时,设置压缩质量 EncoderParameters encoderParams = new EncoderParameters(); long[] quality = new long[1]; quality[0] = 100; EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); encoderParams.Param[0] = encoderParam; imgSource.Dispose(); return outBmp; } #endregion }
生成二维码 https://www.cnblogs.com/wenha/p/11430047.html
随着移动设备的快速发展,二维码越来越大众普及,今天给大家介绍一下我的总结:
先来两张效果图(左图不带文字说明,右图带文字说明)
1. 从Nuget上找到这一个程序包(这个程序包兼容.net framework 4.7和.net core,之前引用过其他的程序包,发现并不兼容.net framework 4.7)
2.我重载了一个方法GenerateQRCode,用于生成带文字说明和不带文字说明的二维码。不带文字说明的二维码大小尺寸没有加限制,返回的是原始大小,带文字说明的二维码大小限制为了600*600px(包括文字,可以根据需要自行调整),同时,我将二维码的文字说明放在了二维码的下面(当然了,文字位置也是可以自行调整的,后续有时间我会继续补充)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using QRCoder; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace App.Common.QRCode { /// <summary> /// 二维码帮助类 /// </summary> public class QRCodeHelper { /// <summary> /// 生成二维码图片 /// </summary> /// <param name="str"></param> /// <returns></returns> public Bitmap CreateQRimg(string str) { QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, QRCodeGenerator.ECCLevel.Q); QRCoder.QRCode qrCode = new QRCoder.QRCode(qrCodeData); Bitmap bt = qrCode.GetGraphic(20); return bt; } /// <summary> /// 生成二维码图片流(二维码上含文字) /// </summary> /// <param name="str1">二维码中要传递的数据(地址)</param> /// <param name="str2">二维码上显示的文字说明</param> public byte[] GenerateQRCode(string str1, string str2) { using (Image codeImage = CreateQRimg(str1), strImage = ConvertStringToImage(str2)) { Image img = CombineImage(600, 600, codeImage, 60, 50, strImage, 0, 530); using (var stream = new MemoryStream()) { img.Save(stream, ImageFormat.Jpeg); //输出图片流 return stream.ToArray(); } } } /// <summary> /// 生成二维码图片流(不含文字) /// </summary> /// <param name="str">二维码中要传递的数据(地址)</param> /// <returns></returns> public byte[] GenerateQRCode(string str) { using (Image codeImage = CreateQRimg(str)) { using (var stream = new MemoryStream()) { codeImage.Save(stream, ImageFormat.Jpeg); return stream.ToArray(); } } } /// <summary> /// 生成文字图片 /// </summary> /// <param name="str"></param> /// <returns></returns> public Image ConvertStringToImage(string str) { Bitmap image = new Bitmap(600, 40, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(image); try { Font font = new Font("SimHei", 14, FontStyle.Regular); g.Clear(Color.White); StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; Rectangle rectangle = new Rectangle(0, 0, 600, 40); g.DrawString(str, font, new SolidBrush(Color.Black), rectangle, format); return image; } catch (Exception e) { throw e; } finally { GC.Collect(); } } /// <summary> /// 在画板中合并二维码图片和文字图片 /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="imgLeft"></param> /// <param name="imgLeft_left"></param> /// <param name="imgLeft_top"></param> /// <param name="imgRight"></param> /// <param name="imgRight_left"></param> /// <param name="imgRight_top"></param> /// <returns></returns> public Image CombineImage(int width, int height, Image imgLeft, int imgLeft_left, int imgLeft_top, Image imgRight, int imgRight_left, int imgRight_top) { Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(image); try { g.Clear(Color.White); g.DrawImage(imgLeft, imgLeft_left, imgLeft_top, 500, 500); g.DrawImage(imgRight, imgRight_left, imgRight_top, imgRight.Width, imgRight.Height); return image; } catch (Exception e) { throw e; } finally { g.Dispose(); } } } }
再补充两个调用方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// Mvc 3 /// </summary> 4 public class QRCodeController : Controller 5 { 6 /// <summary> 7 /// 显示二维码 8 /// </summary> 9 /// <returns></returns> 10 public ActionResult Index() 11 { 12 var qrCode = new QRCodeHelper(); 13 var qrImg = qrCode.GenerateQRCode("https://www.cnblogs.com/wenha"); 14 15 var base64 = "data:image/jpeg;base64," + Convert.ToBase64String(qrImg); 16 17 ViewBag.CodeImg = base64; 18 return View(); 19 } 20 } MVC模式下调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// WebApi 3 /// </summary> 4 public class QRCodeApiController : ApiController 5 { 6 /// <summary> 7 /// 获取二维码图片(base64格式) 8 /// </summary> 9 /// <returns></returns> 10 [HttpGet] 11 public HttpResponseMessage GetQRCode() 12 { 13 var qrCode = new QRCodeHelper(); 14 15 var url = "https://www.cnblogs.com/wenha"; 16 var image = qrCode.GenerateQRCode(url, "博客园地址"); 17 18 var resp = new HttpResponseMessage(HttpStatusCode.OK) 19 { 20 Content = new StringContent("data:image/jpeg;base64," + Convert.ToBase64String(image)) 21 }; 22 23 return resp; 24 } 25 26 /// <summary> 27 /// 获取二维码图片(图片格式) 28 /// </summary> 29 /// <returns></returns> 30 [HttpGet] 31 public HttpResponseMessage GetQRCodeImg() 32 { 33 34 var qrCode = new QRCodeHelper(); 35 36 var url = "https://www.cnblogs.com/wenha"; 37 var image = qrCode.GenerateQRCode(url, "博客园地址"); 38 39 var resp = new HttpResponseMessage(HttpStatusCode.OK) 40 { 41 Content = new ByteArrayContent(image) 42 }; 43 resp.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg"); 44 return resp; 45 } 46 } WebApi模式下调用