using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Util;
namespace WIP_Print
{
public class QRCodeUtil
{
///
/// 生成二维码图片
///
/// 要生成二维码的字符串
/// 大小尺寸(文件大小)
/// 二维码图片
public static Bitmap CreateImgCode(string codeNumber, int size)
{
//创建二维码生成类
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
//设置编码模式
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//设置编码测量度
qrCodeEncoder.QRCodeScale = size;
//设置编码版本
qrCodeEncoder.QRCodeVersion = 0;
//设置编码错误纠正
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//生成二维码图片
Bitmap image = null;
if (QRCodeUtility.IsUniCode(codeNumber))
{
image = qrCodeEncoder.Encode(codeNumber, System.Text.Encoding.UTF8);
}
else
{
image = qrCodeEncoder.Encode(codeNumber, System.Text.Encoding.ASCII);
}
return image;
}
///
/// 生成二维码
///
/// 内容
/// 二维码的大小
/// 输出流
public static MemoryStream GetQRCode(string content, int moduleSize = 9)
{
//ErrorCorrectionLevel 误差校正水平
//QuietZoneModules 空白区域
var encoder = new QrEncoder(ErrorCorrectionLevel.M);
QrCode qrCode = encoder.Encode(content);
GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two), Brushes.Black, Brushes.White);
MemoryStream memoryStream = new MemoryStream();
render.WriteToStream(qrCode.Matrix, ImageFormat.Jpeg, memoryStream);
return memoryStream;
//生成图片的代码
//DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
//Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
//Graphics g = Graphics.FromImage(map);
//render.Draw(g, qrCode.Matrix);
//map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
}
///
/// 生成带Logo二维码
///
/// 内容
/// logo路径
/// 二维码的大小
/// 输出流
public static MemoryStream GetQRCode(string content, string iconPath, int moduleSize = 9)
{
QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.M);
QrCode qrCode = qrEncoder.Encode(content);
GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two), Brushes.Black, Brushes.White);
DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
Graphics g = Graphics.FromImage(map);
render.Draw(g, qrCode.Matrix);
//追加Logo图片 ,注意控制Logo图片大小和二维码大小的比例
//PS:追加的图片过大超过二维码的容错率会导致信息丢失,无法被识别
System.Drawing.Image img = System.Drawing.Image.FromFile(iconPath);
Point imgPoint = new Point((map.Width - img.Width) / 2, (map.Height - img.Height) / 2);
g.DrawImage(img, imgPoint.X, imgPoint.Y, img.Width, img.Height);
MemoryStream memoryStream = new MemoryStream();
map.Save(memoryStream, ImageFormat.Jpeg);
return memoryStream;
//生成图片的代码: map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
}
///
/// 保存图片
///
/// 图片
public static bool SaveImg(System.Drawing.Image img, string savePathAndName, Size size, ImageFormat imgSet)
{
//文件路径
string fullPath = Path.GetDirectoryName(savePathAndName);
if (!Directory.Exists(fullPath))
{
Directory.CreateDirectory(fullPath);
}
if (File.Exists(savePathAndName))
{
File.Delete(savePathAndName);
//LogHelper.Info(typeof(QRCode), "【文件重复】覆盖 - "+ savePathAndName.Substring(savePathAndName.Length-13, 13));
}
Bitmap newImg = new Bitmap(img, size.Width, size.Height);//图片保存的大小尺寸
newImg.SetResolution(150,150);
newImg.Save(savePathAndName, imgSet);
newImg.Dispose();
GC.Collect();
return true;
}
private Font _font = new Font("微软雅黑",15f);
///
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
///
/// 粘贴的源图片
/// 粘贴的目标图片
public static Metafile CombinImage(Size imgSize, string destImg, string fileName,string content="")
{
Bitmap bmp = new Bitmap(imgSize.Width, imgSize.Height);
Graphics gs = Graphics.FromImage(bmp);
Metafile mf = new Metafile(fileName, gs.GetHdc());
Graphics g = Graphics.FromImage(mf);
//g.SmoothingMode = SmoothingMode.HighQuality;
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//g.CompositingQuality = CompositingQuality.HighQuality;
//绘制边框
g.DrawRectangle(new Pen(System.Drawing.Color.FromArgb(54,170,109),12),0,0, imgSize.Width, imgSize.Height);
//绘制二维码
System.Drawing.Image img = System.Drawing.Image.FromFile(destImg);
g.DrawImage(img, Convert.ToInt32(imgSize.Width * 400 / 612), (imgSize.Height - img.Height) / 2, img.Width, img.Height);
img.Dispose();
//绘制logo
//Metafile logo= new Metafile(Application.StartupPath + "\\BackImage\\logo"+ imgSize.Width + imgSize.Height + ".wmf");
Metafile logo = new Metafile(System.Windows.Forms.Application.StartupPath + "\\BackImage\\logo1.wmf");
g.DrawImageUnscaled(logo, Convert.ToInt32(imgSize.Width * 32 / 612), Convert.ToInt32(imgSize.Height * 35 / 236));
//绘制内容
g.DrawString(content, new Font("微软雅黑", 53f), new SolidBrush(System.Drawing.Color.Black), new Point(Convert.ToInt32(imgSize.Width * 62 / 612), Convert.ToInt32(imgSize.Height * 128 / 236)));
g.Save();
g.Dispose();
mf.Dispose();
GC.Collect();
return null;
}
///
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
///
/// 粘贴的源图片
/// 粘贴的目标图片
public static System.Drawing.Image CombinImage(System.Drawing.Image imgBack,System.Drawing.Image destImg)
{
//System.Drawing.Image img = destImg; //照片图片
if (destImg.Height != 780 || destImg.Width != 780)
{
destImg = KiResizeImage(destImg, 780, 780, 0);
}
Graphics g = Graphics.FromImage(imgBack);
g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
//g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框
//g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
g.DrawImage(imgBack, imgBack.Width / 2 - destImg.Width / 2, imgBack.Width / 2 - destImg.Width / 2, destImg.Width, destImg.Height);
GC.Collect();
return imgBack;
}
///
/// Resize图片
///
/// 原始Bitmap
/// 新的宽度
/// 新的高度
/// 保留着,暂时未用
/// 处理以后的图片
public static System.Drawing.Image KiResizeImage(System.Drawing.Image bmp, int newW, int newH, int Mode)
{
try
{
System.Drawing.Image b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch
{
return null;
}
}
}
}