using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; using System.Text; using ThoughtWorks.QRCode.Codec; namespace CommonTool { public class QrCodeHelper { public QrCodeHelper(string currentPath, List qrCodeLis, int codeScale = 5, int version=10, int imgSize = 320, int imgBorder = 22) { CurrentPath = currentPath; QrCodeList = qrCodeLis; ImgSize = imgSize; ImgBorder = imgBorder; QrCodeScale = codeScale; QrCodeVersion = version; Success = Create_CodeImages(); } public string CurrentPath { get; set; } public List QrCodeList { get; set; } public int ImgSize { get; set; } public int ImgBorder { get; set; } public int QrCodeScale { get; set; } public int QrCodeVersion { get; set; } public bool Success { get; set; } /// /// 批量生成二维码图片 /// public bool Create_CodeImages() { try { if (QrCodeList?.Count > 0) { //清空目录 DeleteDir(CurrentPath); foreach (QrCode qrCode in QrCodeList) { if (!string.IsNullOrEmpty(qrCode.Code) &&!string.IsNullOrEmpty(qrCode.Name)) { //生成图片 Bitmap image = Create_QRCode(qrCode.Code, QrCodeScale,QrCodeVersion); //保存图片 SaveImg(CurrentPath, qrCode.Name, image); } } //打开文件夹 //Open_File(CurrentPath); return true; } } catch (Exception) { return false; } return false; } /// /// 生成二维码图片 /// /// 要生成二维码的字符串 /// 大小尺寸 /// /// 二维码图片 public Bitmap Create_QRCode(string codeNumber, int size = 5, int version = 10) { //创建二维码生成类 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder { //设置编码模式 QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE, //设置编码测量度 QRCodeScale = size, //设置编码版本 QRCodeVersion = version, //设置编码错误纠正 QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M }; //生成二维码图片 Bitmap codeImage = qrCodeEncoder.Encode(codeNumber, Encoding.UTF8); return codeImage; } /// /// 生成二维码 /// /// 内容文本 /// 图片尺寸(像素),0表示不设置 /// 图片白边(像素),当size大于0时有效 /// 每个小方格的预设宽度(像素),正整数 /// 二维码版本号 0-40 /// 二维码编码方式 /// 纠错码等级 /// 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) { if (!Enum.IsDefined(typeof(QRCodeEncoder.ERROR_CORRECTION), qrCodeErrorCorrect)) throw new InvalidEnumArgumentException(nameof(qrCodeErrorCorrect), (int)qrCodeErrorCorrect, typeof(QRCodeEncoder.ERROR_CORRECTION)); QRCodeEncoder qrCodeEncoder = new QRCodeEncoder { QRCodeEncodeMode = qrCodeEncodeMode, QRCodeErrorCorrect = qrCodeErrorCorrect, QRCodeScale = qrCodeScale, QRCodeVersion = qrCodeVersion }; Bitmap image = qrCodeEncoder.Encode(codeNumber); #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框 if (size > 0) { //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸 #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸 while (image.Width < size) { qrCodeEncoder.QRCodeScale++; Bitmap imageNew = qrCodeEncoder.Encode(codeNumber); if (imageNew.Width < size) { image = new Bitmap(imageNew); imageNew.Dispose(); } else { qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸 imageNew.Dispose(); break; } } #endregion //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸 #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸 while (image.Width > size && qrCodeEncoder.QRCodeScale > 1) { qrCodeEncoder.QRCodeScale--; Bitmap imageNew = qrCodeEncoder.Encode(codeNumber); image = new Bitmap(imageNew); imageNew.Dispose(); if (image.Width < size) { break; } } #endregion //如果目标尺寸大于生成的图片尺寸,则为图片增加白边 #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边 if (image.Width <= size) { //根据参数设置二维码图片白边的最小宽度 #region 根据参数设置二维码图片白边的最小宽度 if (border > 0) { while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1) { qrCodeEncoder.QRCodeScale--; Bitmap imageNew = qrCodeEncoder.Encode(codeNumber); image = new Bitmap(imageNew); imageNew.Dispose(); } } #endregion //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置 if (image.Width < size) { //新建空白绘图 Bitmap panel = new Bitmap(size, size); Graphics graphic0 = Graphics.FromImage(panel); int pLeft = 0; int pTop = 0; if (image.Width <= size) //如果原图比目标形状宽 { pLeft = (size - image.Width) / 2; } if (image.Height <= size) { pTop = (size - image.Height) / 2; } //将生成的二维码图像粘贴至绘图的中心位置 graphic0.DrawImage(image, pLeft, pTop, image.Width, image.Height); image = new Bitmap(panel); panel.Dispose(); graphic0.Dispose(); } } #endregion } #endregion return image; } /// /// 保存图片 /// /// 保存路径 /// 图片名 /// 图片 public void SaveImg(string strPath,string imgName, Bitmap img) { //保存图片到目录 if (!Directory.Exists(strPath)) //当前目录不存在,则创建 Directory.CreateDirectory(strPath); //文件名称 imgName = imgName + "-" + DateTime.Now.ToString("MMddHHmmssffff") + ".png"; img.Save(strPath + "/" + imgName, System.Drawing.Imaging.ImageFormat.Png); } /// /// /打开指定目录 /// /// public void Open_File(string path) { System.Diagnostics.Process.Start("explorer.exe", path); } /// /// 删除目录下所有文件 /// /// 路径 public void DeleteDir(string aimPath) { //目录是否存在 if (Directory.Exists(aimPath)) { // 检查目标目录是否以目录分割字符结束如果不是则添加之 if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar) aimPath += Path.DirectorySeparatorChar; // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组 // 如果你指向Delete目标文件下面的文件而不包含目录请使用下面的方法 string[] fileList = Directory.GetFiles(aimPath); //string[] fileList = Directory.GetFileSystemEntries(aimPath); // 遍历所有的文件和目录 foreach (string file in fileList) { // 先当作目录处理如果存在这个目录就递归Delete该目录下面的文件 if (Directory.Exists(file)) { DeleteDir(aimPath + Path.GetFileName(file)); } // 否则直接Delete文件 else { File.Delete(aimPath + Path.GetFileName(file)); } } } } } public struct QrCode { public string Name { get; set; } public string Code { get; set; } } }