| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- 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<QrCode> 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<QrCode> 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; }
- /// <summary>
- /// 批量生成二维码图片
- /// </summary>
- 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;
- }
- /// <summary>
- /// 生成二维码图片
- /// </summary>
- /// <param name="codeNumber">要生成二维码的字符串</param>
- /// <param name="size">大小尺寸</param>
- /// <param name="version"></param>
- /// <returns>二维码图片</returns>
- 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;
- }
- /// <summary>
- /// 生成二维码
- /// </summary>
- /// <param name="codeNumber">内容文本</param>
- /// <param name="size">图片尺寸(像素),0表示不设置</param>
- /// <param name="border">图片白边(像素),当size大于0时有效</param>
- /// <param name="qrCodeScale">每个小方格的预设宽度(像素),正整数</param>
- /// <param name="qrCodeVersion">二维码版本号 0-40</param>
- /// <param name="qrCodeEncodeMode">二维码编码方式</param>
- /// <param name="qrCodeErrorCorrect">纠错码等级</param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 保存图片
- /// </summary>
- /// <param name="strPath">保存路径</param>
- /// <param name="imgName">图片名</param>
- /// <param name="img">图片</param>
- 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);
- }
- /// <summary>
- /// /打开指定目录
- /// </summary>
- /// <param name="path"></param>
- public void Open_File(string path)
- {
- System.Diagnostics.Process.Start("explorer.exe", path);
- }
- /// <summary>
- /// 删除目录下所有文件
- /// </summary>
- /// <param name="aimPath">路径</param>
- 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; }
- }
- }
|