随着移动设备的快速发展,二维码越来越大众普及,今天给大家介绍一下我的总结:
先来两张效果图(左图不带文字说明,右图带文字说明)
1. 从Nuget上找到这一个程序包(这个程序包兼容.net framework 4.7和.net core,之前引用过其他的程序包,发现并不兼容.net framework 4.7)
2.我重载了一个方法GenerateQRCode,用于生成带文字说明和不带文字说明的二维码。不带文字说明的二维码大小尺寸没有加限制,返回的是原始大小,带文字说明的二维码大小限制为了600*600px(包括文字,可以根据需要自行调整),同时,我将二维码的文字说明放在了二维码的下面(当然了,文字位置也是可以自行调整的,后续有时间我会继续补充)
1 using QRCoder; 2 using System; 3 using System.Collections.Generic; 4 using System.Drawing; 5 using System.Drawing.Imaging; 6 using System.IO; 7 using System.Linq; 8 using System.Text; 9 using System.Threading.Tasks; 10 11 namespace App.Common.QRCode 12 { 13 /// <summary> 14 /// 二维码帮助类 15 /// </summary> 16 public class QRCodeHelper 17 { 18 /// <summary> 19 /// 生成二维码图片 20 /// </summary> 21 /// <param name="str"></param> 22 /// <returns></returns> 23 public Bitmap CreateQRimg(string str) 24 { 25 QRCodeGenerator qrGenerator = new QRCodeGenerator(); 26 QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, QRCodeGenerator.ECCLevel.Q); 27 QRCoder.QRCode qrCode = new QRCoder.QRCode(qrCodeData); 28 Bitmap bt = qrCode.GetGraphic(20); 29 30 return bt; 31 } 32 33 /// <summary> 34 /// 生成二维码图片流(二维码上含文字) 35 /// </summary> 36 /// <param name="str1">二维码中要传递的数据(地址)</param> 37 /// <param name="str2">二维码上显示的文字说明</param> 38 public byte[] GenerateQRCode(string str1, string str2) 39 { 40 using (Image codeImage = CreateQRimg(str1), strImage = ConvertStringToImage(str2)) 41 { 42 Image img = CombineImage(600, 600, codeImage, 60, 50, strImage, 0, 530); 43 using (var stream = new MemoryStream()) 44 { 45 img.Save(stream, ImageFormat.Jpeg); 46 //输出图片流 47 return stream.ToArray(); 48 } 49 } 50 } 51 52 /// <summary> 53 /// 生成二维码图片流(不含文字) 54 /// </summary> 55 /// <param name="str">二维码中要传递的数据(地址)</param> 56 /// <returns></returns> 57 public byte[] GenerateQRCode(string str) 58 { 59 using (Image codeImage = CreateQRimg(str)) 60 { 61 using (var stream = new MemoryStream()) 62 { 63 codeImage.Save(stream, ImageFormat.Jpeg); 64 65 return stream.ToArray(); 66 } 67 } 68 } 69 70 /// <summary> 71 /// 生成文字图片 72 /// </summary> 73 /// <param name="str"></param> 74 /// <returns></returns> 75 public Image ConvertStringToImage(string str) 76 { 77 Bitmap image = new Bitmap(600, 40, PixelFormat.Format24bppRgb); 78 79 Graphics g = Graphics.FromImage(image); 80 81 try 82 { 83 Font font = new Font("SimHei", 14, FontStyle.Regular); 84 85 g.Clear(Color.White); 86 87 StringFormat format = new StringFormat(); 88 format.Alignment = StringAlignment.Center; 89 format.LineAlignment = StringAlignment.Center; 90 91 Rectangle rectangle = new Rectangle(0, 0, 600, 40); 92 93 g.DrawString(str, font, new SolidBrush(Color.Black), rectangle, format); 94 95 return image; 96 } 97 catch (Exception e) 98 { 99 throw e; 100 } 101 finally 102 { 103 GC.Collect(); 104 } 105 } 106 107 /// <summary> 108 /// 在画板中合并二维码图片和文字图片 109 /// </summary> 110 /// <param name="width"></param> 111 /// <param name="height"></param> 112 /// <param name="imgLeft"></param> 113 /// <param name="imgLeft_left"></param> 114 /// <param name="imgLeft_top"></param> 115 /// <param name="imgRight"></param> 116 /// <param name="imgRight_left"></param> 117 /// <param name="imgRight_top"></param> 118 /// <returns></returns> 119 public Image CombineImage(int width, int height, Image imgLeft, int imgLeft_left, int imgLeft_top, Image imgRight, int imgRight_left, int imgRight_top) 120 { 121 Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb); 122 123 Graphics g = Graphics.FromImage(image); 124 125 try 126 { 127 g.Clear(Color.White); 128 g.DrawImage(imgLeft, imgLeft_left, imgLeft_top, 500, 500); 129 g.DrawImage(imgRight, imgRight_left, imgRight_top, imgRight.Width, imgRight.Height); 130 131 return image; 132 } 133 catch (Exception e) 134 { 135 throw e; 136 } 137 finally 138 { 139 g.Dispose(); 140 } 141 } 142 } 143 }
最后,再补充两个调用方法
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 }
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 }