隨着移動設備的快速發展,二維碼越來越大眾普及,今天給大家介紹一下我的總結:
先來兩張效果圖(左圖不帶文字說明,右圖帶文字說明)
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 }