QrCodeHelper.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.IO;
  6. using System.Text;
  7. using ThoughtWorks.QRCode.Codec;
  8. namespace CommonTool
  9. {
  10. public class QrCodeHelper
  11. {
  12. public QrCodeHelper(string currentPath, List<QrCode> qrCodeLis, int codeScale = 5, int version=10, int imgSize = 320, int imgBorder = 22)
  13. {
  14. CurrentPath = currentPath;
  15. QrCodeList = qrCodeLis;
  16. ImgSize = imgSize;
  17. ImgBorder = imgBorder;
  18. QrCodeScale = codeScale;
  19. QrCodeVersion = version;
  20. Success = Create_CodeImages();
  21. }
  22. public string CurrentPath { get; set; }
  23. public List<QrCode> QrCodeList { get; set; }
  24. public int ImgSize { get; set; }
  25. public int ImgBorder { get; set; }
  26. public int QrCodeScale { get; set; }
  27. public int QrCodeVersion { get; set; }
  28. public bool Success { get; set; }
  29. /// <summary>
  30. /// 批量生成二维码图片
  31. /// </summary>
  32. public bool Create_CodeImages()
  33. {
  34. try
  35. {
  36. if (QrCodeList?.Count > 0)
  37. {
  38. //清空目录
  39. DeleteDir(CurrentPath);
  40. foreach (QrCode qrCode in QrCodeList)
  41. {
  42. if (!string.IsNullOrEmpty(qrCode.Code) &&!string.IsNullOrEmpty(qrCode.Name))
  43. {
  44. //生成图片
  45. Bitmap image = Create_QRCode(qrCode.Code, QrCodeScale,QrCodeVersion);
  46. //保存图片
  47. SaveImg(CurrentPath, qrCode.Name, image);
  48. }
  49. }
  50. //打开文件夹
  51. //Open_File(CurrentPath);
  52. return true;
  53. }
  54. }
  55. catch (Exception)
  56. {
  57. return false;
  58. }
  59. return false;
  60. }
  61. /// <summary>
  62. /// 生成二维码图片
  63. /// </summary>
  64. /// <param name="codeNumber">要生成二维码的字符串</param>
  65. /// <param name="size">大小尺寸</param>
  66. /// <param name="version"></param>
  67. /// <returns>二维码图片</returns>
  68. public Bitmap Create_QRCode(string codeNumber, int size = 5, int version = 10)
  69. {
  70. //创建二维码生成类
  71. QRCodeEncoder qrCodeEncoder = new QRCodeEncoder
  72. {
  73. //设置编码模式
  74. QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
  75. //设置编码测量度
  76. QRCodeScale = size,
  77. //设置编码版本
  78. QRCodeVersion = version,
  79. //设置编码错误纠正
  80. QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M
  81. };
  82. //生成二维码图片
  83. Bitmap codeImage = qrCodeEncoder.Encode(codeNumber, Encoding.UTF8);
  84. return codeImage;
  85. }
  86. /// <summary>
  87. /// 生成二维码
  88. /// </summary>
  89. /// <param name="codeNumber">内容文本</param>
  90. /// <param name="size">图片尺寸(像素),0表示不设置</param>
  91. /// <param name="border">图片白边(像素),当size大于0时有效</param>
  92. /// <param name="qrCodeScale">每个小方格的预设宽度(像素),正整数</param>
  93. /// <param name="qrCodeVersion">二维码版本号 0-40</param>
  94. /// <param name="qrCodeEncodeMode">二维码编码方式</param>
  95. /// <param name="qrCodeErrorCorrect">纠错码等级</param>
  96. /// <returns></returns>
  97. public Bitmap Create_QRCode(string codeNumber, int qrCodeScale, int qrCodeVersion, int size, int border, QRCodeEncoder.ERROR_CORRECTION qrCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M, QRCodeEncoder.ENCODE_MODE qrCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE)
  98. {
  99. if (!Enum.IsDefined(typeof(QRCodeEncoder.ERROR_CORRECTION), qrCodeErrorCorrect))
  100. throw new InvalidEnumArgumentException(nameof(qrCodeErrorCorrect), (int)qrCodeErrorCorrect,
  101. typeof(QRCodeEncoder.ERROR_CORRECTION));
  102. QRCodeEncoder qrCodeEncoder = new QRCodeEncoder
  103. {
  104. QRCodeEncodeMode = qrCodeEncodeMode,
  105. QRCodeErrorCorrect = qrCodeErrorCorrect,
  106. QRCodeScale = qrCodeScale,
  107. QRCodeVersion = qrCodeVersion
  108. };
  109. Bitmap image = qrCodeEncoder.Encode(codeNumber);
  110. #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框
  111. if (size > 0)
  112. {
  113. //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
  114. #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
  115. while (image.Width < size)
  116. {
  117. qrCodeEncoder.QRCodeScale++;
  118. Bitmap imageNew = qrCodeEncoder.Encode(codeNumber);
  119. if (imageNew.Width < size)
  120. {
  121. image = new Bitmap(imageNew);
  122. imageNew.Dispose();
  123. }
  124. else
  125. {
  126. qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
  127. imageNew.Dispose();
  128. break;
  129. }
  130. }
  131. #endregion
  132. //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
  133. #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
  134. while (image.Width > size && qrCodeEncoder.QRCodeScale > 1)
  135. {
  136. qrCodeEncoder.QRCodeScale--;
  137. Bitmap imageNew = qrCodeEncoder.Encode(codeNumber);
  138. image = new Bitmap(imageNew);
  139. imageNew.Dispose();
  140. if (image.Width < size)
  141. {
  142. break;
  143. }
  144. }
  145. #endregion
  146. //如果目标尺寸大于生成的图片尺寸,则为图片增加白边
  147. #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边
  148. if (image.Width <= size)
  149. {
  150. //根据参数设置二维码图片白边的最小宽度
  151. #region 根据参数设置二维码图片白边的最小宽度
  152. if (border > 0)
  153. {
  154. while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1)
  155. {
  156. qrCodeEncoder.QRCodeScale--;
  157. Bitmap imageNew = qrCodeEncoder.Encode(codeNumber);
  158. image = new Bitmap(imageNew);
  159. imageNew.Dispose();
  160. }
  161. }
  162. #endregion
  163. //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
  164. if (image.Width < size)
  165. {
  166. //新建空白绘图
  167. Bitmap panel = new Bitmap(size, size);
  168. Graphics graphic0 = Graphics.FromImage(panel);
  169. int pLeft = 0;
  170. int pTop = 0;
  171. if (image.Width <= size) //如果原图比目标形状宽
  172. {
  173. pLeft = (size - image.Width) / 2;
  174. }
  175. if (image.Height <= size)
  176. {
  177. pTop = (size - image.Height) / 2;
  178. }
  179. //将生成的二维码图像粘贴至绘图的中心位置
  180. graphic0.DrawImage(image, pLeft, pTop, image.Width, image.Height);
  181. image = new Bitmap(panel);
  182. panel.Dispose();
  183. graphic0.Dispose();
  184. }
  185. }
  186. #endregion
  187. }
  188. #endregion
  189. return image;
  190. }
  191. /// <summary>
  192. /// 保存图片
  193. /// </summary>
  194. /// <param name="strPath">保存路径</param>
  195. /// <param name="imgName">图片名</param>
  196. /// <param name="img">图片</param>
  197. public void SaveImg(string strPath,string imgName, Bitmap img)
  198. {
  199. //保存图片到目录
  200. if (!Directory.Exists(strPath))
  201. //当前目录不存在,则创建
  202. Directory.CreateDirectory(strPath);
  203. //文件名称
  204. imgName = imgName + "-" + DateTime.Now.ToString("MMddHHmmssffff") + ".png";
  205. img.Save(strPath + "/" + imgName, System.Drawing.Imaging.ImageFormat.Png);
  206. }
  207. /// <summary>
  208. /// /打开指定目录
  209. /// </summary>
  210. /// <param name="path"></param>
  211. public void Open_File(string path)
  212. {
  213. System.Diagnostics.Process.Start("explorer.exe", path);
  214. }
  215. /// <summary>
  216. /// 删除目录下所有文件
  217. /// </summary>
  218. /// <param name="aimPath">路径</param>
  219. public void DeleteDir(string aimPath)
  220. {
  221. //目录是否存在
  222. if (Directory.Exists(aimPath))
  223. {
  224. // 检查目标目录是否以目录分割字符结束如果不是则添加之
  225. if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar)
  226. aimPath += Path.DirectorySeparatorChar;
  227. // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
  228. // 如果你指向Delete目标文件下面的文件而不包含目录请使用下面的方法
  229. string[] fileList = Directory.GetFiles(aimPath);
  230. //string[] fileList = Directory.GetFileSystemEntries(aimPath);
  231. // 遍历所有的文件和目录
  232. foreach (string file in fileList)
  233. {
  234. // 先当作目录处理如果存在这个目录就递归Delete该目录下面的文件
  235. if (Directory.Exists(file))
  236. {
  237. DeleteDir(aimPath + Path.GetFileName(file));
  238. }
  239. // 否则直接Delete文件
  240. else
  241. {
  242. File.Delete(aimPath + Path.GetFileName(file));
  243. }
  244. }
  245. }
  246. }
  247. }
  248. public struct QrCode
  249. {
  250. public string Name { get; set; }
  251. public string Code { get; set; }
  252. }
  253. }