当前位置:   article > 正文

通过vs2019用C#简单了实现二维码的生成与保存的2种方式_c# 生成二维码

c# 生成二维码

1.主要是记录一下,可能以后自己能再次通过自己写的这篇东西温故而知新;

其中参考了几篇其他大神写的实现c#二维码之代码。

首先c#要想实现二维码的相关操作需要ZXing.dll这个文件

具体方式如下

 项目中右键找到管理NuGet程序包(N)

安装成功后;进行如下代码

方式1.通过创建类的方式,将系统提供的ZXing类的数据进行封装

先创建类ZXingLibs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Drawing;
  7. using System.Drawing.Imaging;
  8. using ZXing;
  9. using ZXing.Common;
  10. using ZXing.QrCode;
  11. using ZXing.QrCode.Internal;
  12. namespace WindowsFormsApp2
  13. {
  14. class ZXingLibs
  15. {
  16. /// 生成二维码
  17. public static Bitmap GetQRCode(string text, int width, int height)
  18. {
  19. BarcodeWriter writer = new BarcodeWriter();
  20. writer.Format = BarcodeFormat.QR_CODE;
  21. QrCodeEncodingOptions options = new QrCodeEncodingOptions()
  22. {
  23. DisableECI = true,//设置内容编码
  24. CharacterSet = "UTF-8",
  25. Width = width,//设置二维码的宽度和高度
  26. Height = height,
  27. Margin = 1//设置二维码的边距,单位不是固定像素
  28. };
  29. writer.Options = options;
  30. Bitmap map = writer.Write(text);
  31. return map;
  32. }
  33. /// 生成一维条形码
  34. public static Bitmap GetBarCode(string text, int width, int height)
  35. {
  36. BarcodeWriter writer = new BarcodeWriter();
  37. //使用ITF 格式,不能被现在常用的支付宝、微信扫出来
  38. //如果想生成可识别的可以使用 CODE_128 格式
  39. //writer.Format = BarcodeFormat.ITF;
  40. writer.Format = BarcodeFormat.CODE_39;
  41. EncodingOptions options = new EncodingOptions()
  42. {
  43. Width = width,
  44. Height = height,
  45. Margin = 2
  46. };
  47. writer.Options = options;
  48. Bitmap map = writer.Write(text);
  49. return map;
  50. }
  51. /// 生成带Logo的二维码
  52. public static Bitmap GetQRCodeWithLogo(string text, int width, int height)
  53. {
  54. //Logo 图片
  55. string logoPath = System.AppDomain.CurrentDomain.BaseDirectory + @"zp.bmp";
  56. Bitmap logo = new Bitmap(logoPath);
  57. //构造二维码写码器
  58. MultiFormatWriter writer = new MultiFormatWriter();
  59. Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
  60. hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
  61. hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  62. //hint.Add(EncodeHintType.MARGIN, 2);//旧版本不起作用,需要手动去除白边
  63. //生成二维码
  64. BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, width + 80, height + 80, hint);
  65. bm = deleteWhite(bm);
  66. BarcodeWriter barcodeWriter = new BarcodeWriter();
  67. Bitmap map = barcodeWriter.Write(bm);
  68. //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
  69. int[] rectangle = bm.getEnclosingRectangle();
  70. //计算插入图片的大小和位置
  71. int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);
  72. int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);
  73. int middleL = (map.Width - middleW) / 2;
  74. int middleT = (map.Height - middleH) / 2;
  75. Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
  76. using (Graphics g = Graphics.FromImage(bmpimg))
  77. {
  78. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  79. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  80. g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
  81. g.DrawImage(map, 0, 0, width, height);
  82. //白底将二维码插入图片
  83. g.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
  84. g.DrawImage(logo, middleL, middleT, middleW, middleH);
  85. }
  86. return bmpimg;
  87. }
  88. /// 删除默认对应的空白
  89. private static BitMatrix deleteWhite(BitMatrix matrix)
  90. {
  91. int[] rec = matrix.getEnclosingRectangle();
  92. int resWidth = rec[2] + 1;
  93. int resHeight = rec[3] + 1;
  94. BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
  95. resMatrix.clear();
  96. for (int i = 0; i < resWidth; i++)
  97. {
  98. for (int j = 0; j < resHeight; j++)
  99. {
  100. if (matrix[i + rec[0], j + rec[1]])
  101. resMatrix[i, j] = true;
  102. }
  103. }
  104. return resMatrix;
  105. }
  106. }
  107. }

再通过调用ZXingLibs类的方式进行生成二维码,如下图所示

  1. private void Button10_Click(object sender, EventArgs e)
  2. {
  3. string qrData = "";
  4. qrData = "" + textBox1.Text ;
  5. pictureBox1.Image = ZXingLibs.GetQRCode(qrData, pictureBox1.Width, pictureBox1.Height);
  6. }

方式二:直接利用ZXing中自带的类,直接调用;相对来说直接使用时,没有方式1(已二次封装)更加简洁

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using ZXing.Common;
  11. using ZXing;
  12. namespace WindowsFormsApp2
  13. {
  14.     public partial class FrmUseControls : Form
  15.     {
  16.         public FrmUseControls()
  17.         {
  18.             InitializeComponent();
  19.         }
  20.         private void Button11_Click(object sender, EventArgs e)
  21.         {
  22.             // 1.设置QR二维码的规格
  23.             ZXing.QrCode.QrCodeEncodingOptions qrEncodeOption = new ZXing.QrCode.QrCodeEncodingOptions();
  24.             qrEncodeOption.CharacterSet = "UTF-8"; // 设置编码格式,否则读取'中文'乱码
  25.             qrEncodeOption.Height = pictureBox1.Height;//设置高度
  26.             qrEncodeOption.Width = pictureBox1.Width; //设置宽度
  27.             qrEncodeOption.Margin = 1;  // 设置周围空白边距
  28.             // 2.生成条形码图片并保存
  29.             ZXing.BarcodeWriter Qr = new BarcodeWriter();
  30.             Qr.Format = BarcodeFormat.QR_CODE; // 二维码
  31.             Qr.Options = qrEncodeOption;
  32.             Bitmap img = Qr.Write(textBox1.Text);//"textBox1"就是用来输入数据内容的控件
  33.             pictureBox1.Image = img;
  34.     }
  35. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/715800
推荐阅读
相关标签
  

闽ICP备14008679号