随着移动设备的快速发展,二维码越来越大众普及,今天给大家介绍一下我的总结: 先来两张效果图(左图不带文字说明,右图带文字说明)

    .NET--二维码 - 图1.NET--二维码 - 图2

    使用QRcode生成二维码,下面是如何生成过程:
    1. 从Nuget上找到这一个程序包(这个程序包兼容.net framework 4.7和.net core,之前引用过其他的程序包,发现并不兼容.net framework 4.7)

    .NET--二维码 - 图3

    1. 我重载了一个方法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. namespace App.Common.QRCode
    11. {
    12. /// <summary>
    13. /// 二维码帮助类
    14. /// </summary>
    15. public class QRCodeHelper
    16. {
    17. /// <summary>
    18. /// 生成二维码图片
    19. /// </summary>
    20. /// <param name="str"></param>
    21. /// <returns></returns>
    22. public Bitmap CreateQRimg(string str)
    23. {
    24. QRCodeGenerator qrGenerator = new QRCodeGenerator();
    25. QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, QRCodeGenerator.ECCLevel.Q);
    26. QRCoder.QRCode qrCode = new QRCoder.QRCode(qrCodeData);
    27. Bitmap bt = qrCode.GetGraphic(20);
    28. return bt;
    29. }
    30. /// <summary>
    31. /// 生成二维码图片流(二维码上含文字)
    32. /// </summary>
    33. /// <param name="str1">二维码中要传递的数据(地址)</param>
    34. /// <param name="str2">二维码上显示的文字说明</param>
    35. public byte[] GenerateQRCode(string str1, string str2)
    36. {
    37. using (Image codeImage = CreateQRimg(str1), strImage = ConvertStringToImage(str2))
    38. {
    39. Image img = CombineImage(600, 600, codeImage, 60, 50, strImage, 0, 530);
    40. using (var stream = new MemoryStream())
    41. {
    42. img.Save(stream, ImageFormat.Jpeg);
    43. //输出图片流
    44. return stream.ToArray();
    45. }
    46. }
    47. }
    48. /// <summary>
    49. /// 生成二维码图片流(不含文字)
    50. /// </summary>
    51. /// <param name="str">二维码中要传递的数据(地址)</param>
    52. /// <returns></returns>
    53. public byte[] GenerateQRCode(string str)
    54. {
    55. using (Image codeImage = CreateQRimg(str))
    56. {
    57. using (var stream = new MemoryStream())
    58. {
    59. codeImage.Save(stream, ImageFormat.Jpeg);
    60. return stream.ToArray();
    61. }
    62. }
    63. }
    64. /// <summary>
    65. /// 生成文字图片
    66. /// </summary>
    67. /// <param name="str"></param>
    68. /// <returns></returns>
    69. public Image ConvertStringToImage(string str)
    70. {
    71. Bitmap image = new Bitmap(600, 40, PixelFormat.Format24bppRgb);
    72. Graphics g = Graphics.FromImage(image);
    73. try
    74. {
    75. Font font = new Font("SimHei", 14, FontStyle.Regular);
    76. g.Clear(Color.White);
    77. StringFormat format = new StringFormat();
    78. format.Alignment = StringAlignment.Center;
    79. format.LineAlignment = StringAlignment.Center;
    80. Rectangle rectangle = new Rectangle(0, 0, 600, 40);
    81. g.DrawString(str, font, new SolidBrush(Color.Black), rectangle, format);
    82. return image;
    83. }
    84. catch (Exception e)
    85. {
    86. throw e;
    87. }
    88. finally
    89. {
    90. GC.Collect();
    91. }
    92. }
    93. /// <summary>
    94. /// 在画板中合并二维码图片和文字图片
    95. /// </summary>
    96. /// <param name="width"></param>
    97. /// <param name="height"></param>
    98. /// <param name="imgLeft"></param>
    99. /// <param name="imgLeft_left"></param>
    100. /// <param name="imgLeft_top"></param>
    101. /// <param name="imgRight"></param>
    102. /// <param name="imgRight_left"></param>
    103. /// <param name="imgRight_top"></param>
    104. /// <returns></returns>
    105. public Image CombineImage(int width, int height, Image imgLeft, int imgLeft_left, int imgLeft_top, Image imgRight, int imgRight_left, int imgRight_top)
    106. {
    107. Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb);
    108. Graphics g = Graphics.FromImage(image);
    109. try
    110. {
    111. g.Clear(Color.White);
    112. g.DrawImage(imgLeft, imgLeft_left, imgLeft_top, 500, 500);
    113. g.DrawImage(imgRight, imgRight_left, imgRight_top, imgRight.Width, imgRight.Height);
    114. return image;
    115. }
    116. catch (Exception e)
    117. {
    118. throw e;
    119. }
    120. finally
    121. {
    122. g.Dispose();
    123. }
    124. }
    125. }
    126. }
    1. 两个调用方法

    MVC模式下调用

    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. var base64 = "data:image/jpeg;base64," + Convert.ToBase64String(qrImg);
    15. ViewBag.CodeImg = base64;
    16. return View();
    17. }
    18. }

    WebApi模式下调用

    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. var url = "https://www.cnblogs.com/wenha";
    15. var image = qrCode.GenerateQRCode(url, "博客园地址");
    16. var resp = new HttpResponseMessage(HttpStatusCode.OK)
    17. {
    18. Content = new StringContent("data:image/jpeg;base64," + Convert.ToBase64String(image))
    19. };
    20. return resp;
    21. }
    22. /// <summary>
    23. /// 获取二维码图片(图片格式)
    24. /// </summary>
    25. /// <returns></returns>
    26. [HttpGet]
    27. public HttpResponseMessage GetQRCodeImg()
    28. {
    29. var qrCode = new QRCodeHelper();
    30. var url = "https://www.cnblogs.com/wenha";
    31. var image = qrCode.GenerateQRCode(url, "博客园地址");
    32. var resp = new HttpResponseMessage(HttpStatusCode.OK)
    33. {
    34. Content = new ByteArrayContent(image)
    35. };
    36. resp.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");
    37. return resp;
    38. }
    39. }

    前端展示:

    即将后端返回的base64格式的字符串放进 img标签,即可显示二维码。

    1. <img style="width: 150px; height: 150px" src="image"/>
    更多阅读:

    c#生成小程序二维码,扫描后跳转指定页面