c# 的二维码 需借助插件ThoughtWorks
直接引用
using ThoughtWorks.QRCode.Codec; 需下载dll
using ThoughtWorks.QRCode.Codec.Data;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
//生成二维码方法1
//text 二维码的文本内容
//Counselor对象内含微信头像等信息
public static string GetTwoCodeMetho(string text, bk_Counselor Counselor)
{
String data = text;
string url = "";
if (!string.IsNullOrEmpty(data))
{
//声明QRCodeEncoder 其属性在下面的详细方法中有解释
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
qrCodeEncoder.QRCodeScale = 4;
qrCodeEncoder.QRCodeVersion = 8;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
Image image = CreateQRCode(data, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5);
//System.Drawing.Image image = qrCodeEncoder.Encode(data);
System.IO.MemoryStream MStream = new System.IO.MemoryStream();
image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png);
System.IO.MemoryStream MStream1 = new System.IO.MemoryStream();
System.Drawing.Image codeimg;
//有微信头像地址
if (!string.IsNullOrEmpty(Counselor.CounselorImg))
{
System.Net.WebRequest webreq = System.Net.WebRequest.Create(Counselor.CounselorImg);
System.Net.WebResponse webres = webreq.GetResponse();
Stream stream = webres.GetResponseStream();
Image ImageWeixin;
ImageWeixin = Image.FromStream(stream);
stream.Close();
codeimg = CombinImage(image, ImageWeixin);
codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png);
}
else
{
codeimg = image;
}
//保存图片到本地
string PortraitApp = "~/FileLibs/CodeImg/";
if (!Directory.Exists(HttpContext.Current.Server.MapPath(PortraitApp)))
{
Directory.CreateDirectory(HttpContext.Current.Server.MapPath(PortraitApp));
}
string filename = Counselor.CounselorName + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png";
string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename;
System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
//由于项目前后台分离 需要指定生成二维码后的url
string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString();
url = RetureFile.Replace("/FileLibs/File/", "/FileLibs/CodeImg/") + filename;
//HttpContext.Current.Response.ClearContent();
//HttpContext.Current.Response.ContentType = "image/png";
//HttpContext.Current.Response.BinaryWrite(MStream1.ToArray());//直接输出图片 测试用
//处理完释放资源
//image.Dispose();
MStream.Dispose();
MStream1.Dispose();
}
return url;
//HttpContext.Current.Response.Flush();
//HttpContext.Current.Response.End();
}
测试 效果图如下:
///
/// 生成二维码 本函数摘录自网友的方法,后面重写了一个
///
/// 内容文本
/// 二维码编码方式
/// 纠错码等级
/// 二维码版本号 0-40
/// 每个小方格的预设宽度(像素),正整数
/// 图片尺寸(像素),0表示不设置
/// 图片白边(像素),当size大于0时有效
///
public static System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect;
qrCodeEncoder.QRCodeScale = QRCodeScale;
qrCodeEncoder.QRCodeVersion = QRCodeVersion;
System.Drawing.Image image = qrCodeEncoder.Encode(Content);
#region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框
if (size > 0)
{
//当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
#region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
while (image.Width < size)
{
qrCodeEncoder.QRCodeScale++;
System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
if (imageNew.Width < size)
{
image = new System.Drawing.Bitmap(imageNew);
imageNew.Dispose();
imageNew = null;
}
else
{
qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
imageNew.Dispose();
imageNew = null;
break;
}
}
#endregion
//当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
#region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
while (image.Width > size && qrCodeEncoder.QRCodeScale > 1)
{
qrCodeEncoder.QRCodeScale--;
System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
image = new System.Drawing.Bitmap(imageNew);
imageNew.Dispose();
imageNew = null;
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--;
System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
image = new System.Drawing.Bitmap(imageNew);
imageNew.Dispose();
imageNew = null;
}
}
#endregion
//当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
if (image.Width < size)
{
//新建空白绘图
System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size);
System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
int p_left = 0;
int p_top = 0;
if (image.Width <= size) //如果原图比目标形状宽
{
p_left = (size - image.Width) / 2;
}
if (image.Height <= size)
{
p_top = (size - image.Height) /