目录
关于 ThoughtWorks.QRCode
开发运行环境
方法设计
代码实现
调用示例
Logo图标透明化
小结
关于 ThoughtWorks.QRCode
二维码是用某种特定的几何图形按一定规律在平面分布的、黑白相间的、记录数据符号信息的图形,在应用程序开发中也被广泛使用,诸如信息获取(如关注微信公众号)、网站跳转(写入Url)、防伪查询(反馈查询结果)、手机支付(如微信支付、支付宝支付)、会员登录(扫码登录方式)等等。
ThoughtWorks.QRCode是一款功能强劲的动态链接库,能够为.net应用生成二维码,QR 全称为 Quick Response,是一种编码方式。
开发运行环境
操作系统: Windows Server 2019 DataCenter
.net版本: .netFramework4.0 或以上
开发工具:VS2019 C#
方法设计
public bool CreateQrCode 方法(创建二维码)调用参数见如下表格:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
1 | Content | string | 要写入的内容,如Url链接地址等 |
2 | ImagePath | string | 要生成的目标二维码图片物理文件路径 |
3 | QRCodeScale | int | 二维码像素大小,值越大生成的二维码图片像素越高尺寸越大 |
4 | backgroundColor | System.Drawing.Color | 二维码的背景颜色,建议设置为白色 |
5 | foreColor | System.Drawing.Color | 二维码的前景颜色,建议设置为黑色 |
6 | logoImage="" | string | 可选择是否在二维码图片中间添加Logo小图标,默认值为“”字符串,即表示不设置,如果设置则填入图标物理文件路径,方法会判断该文件是否存在,存在则尝试添加 |
本方法返回 bool 值 ,表示填入参数 ImagePath 的文件是否存在,为True则表示成功,程序可以后续继续处理其它业务。
代码实现
public bool CreateQrCode(string Content, string ImagePath, int QRCodeScale, System.Drawing.Color backgroundColor,System.Drawing.Color foreColor,string logoImage="")
{
ThoughtWorks.QRCode.Codec.QRCodeEncoder encoder = new ThoughtWorks.QRCode.Codec.QRCodeEncoder();
encoder.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
encoder.QRCodeScale = QRCodeScale;//大小(值越大生成的二维码图片像素越高)
encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
encoder.QRCodeErrorCorrect = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)
encoder.QRCodeBackgroundColor = backgroundColor;
encoder.QRCodeForegroundColor = foreColor;
System.Drawing.Bitmap bcodeBitmap = encoder.Encode(Content,Encoding.UTF8);
//FileStream fs = new FileStream(ImagePath, FileMode.OpenOrCreate);
bcodeBitmap.Save(ImagePath,System.Drawing.Imaging.ImageFormat.Jpeg);
if (logoImage != "")
{
System.Drawing.Bitmap btm = new System.Drawing.Bitmap(logoImage);
System.Drawing.Bitmap copyImage = new System.Drawing.Bitmap(btm,bcodeBitmap.Width / 4,bcodeBitmap.Height / 4);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bcodeBitmap);
int x = bcodeBitmap.Width / 2 - copyImage.Width / 2;
int y = bcodeBitmap.Height / 2 - copyImage.Height / 2;
g.DrawImage(copyImage, x, y);
bcodeBitmap.Save(ImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
// CombinImage(bcodeBitmap, "").Save(ImagePath);
}
IntPtr ip = bcodeBitmap.GetHbitmap();
bcodeBitmap.Dispose();
//fs.Close();
//fs.Dispose();
DeleteObject(ip);
GC.Collect();
// File.Delete(ImagePath);
return File.Exists(ImagePath);
}
调用示例
假设服务器有 d:\logo.jpg 做为二维码附加图标,最终组合生成到 d:\1.jpg。前端页面放置 Image控件 image1,则示例代码如下:
bool ss=CreateQrCode("https://www.baidu.com", "d:\\1.jpg", 20, System.Drawing.Color.White, System.Drawing.Color.Black, "d:\\logo.jpg");
if (ss == true)
{
string result_base64 = ImgToBase64String("d:\\1.jpg", true);
image1.ImageUrl = result_base64;
return;
}
生成结果如下图所示:
Logo图标透明化
可以将Logo图标透明化,增加一点乐趣。public void ImageToPNG 方法参数调用说明如下:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
1 | sourceFilename | string | 源图片文件物理路径 |
2 | pngFilename | string | 要生成的png文件物理路径 |
3 | backcolor | System.Drawing.Color | 要变透明而要去除的主背景色 |
实现代码如下:
public void ImageToPNG(string sourceFilename,string pngFilename,System.Drawing.Color backcolor)
{
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(sourceFilename);
bmp.MakeTransparent(System.Drawing.Color.FromArgb(0, backcolor));
bmp.Save(pngFilename,System.Drawing.Imaging.ImageFormat.Png);
}
调用示例:
ImageToPNG("d:\\logo.jpg", "d:\\logo.png", System.Drawing.Color.White);
bool ss=mb.CreateQrCode("https://www.baidu.com", "d:\\1.jpg", 20, System.Drawing.Color.White, System.Drawing.Color.Black, "d:\\logo.png");
if (ss == true)
{
string result_base64 = mb.ImgToBase64String("d:\\1.jpg", true);
image1.ImageUrl = result_base64;
return;
}
生成结果如下图所示:
小结
生成二维码需要添加 ThoughtWorks.QRCode.dll 引用,下载链接资源如下:
https://download.csdn.net/download/michaelline/89207338
实现方法可以根据我们的实际开发需要进一步进行修改,如二维码图片的大小、Logo的大小、质量等。
如何获取图像 base64 数据的方法请参照我的文章:《C# 自动填充文字内容到指定图片》
感谢您的阅读,希望本文能够对您有所帮助。