首先在NuGet程序包里安装ThoughtWorks.QRCode程序包 在控制器里引用 using ThoughtWorks.QRCode.Codec; using System.Drawing;
/// <summary>
/// 生成二维码
/// </summary>
/// <param name="link">链接</param>
/// <returns></returns>
public string QRCode(string link)
{
var str = string.Empty;
try
{
Bitmap bt;
string enCodeString = link;
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注 意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
qrCodeEncoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
qrCodeEncoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时 发生错误)
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效 验、错误更正(有4个等级)
qrCodeEncoder.QRCodeBackgroundColor = Color.White;//背景色
qrCodeEncoder.QRCodeForegroundColor = Color.Black;//前景色
bt = qrCodeEncoder.Encode(enCodeString, System.Text.Encoding.UTF8);
System.Drawing.Image newImage = bt.GetThumbnailImage(165, 165, null, System.IntPtr.Zero);//设置图片固定大小
string filename = DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".png";//根 据时间生成唯一的文件名
string file_path = "/uploadfiles/qrcoderimg/cnnerweima /"+DateTime.Now.Year.ToString()+"/"+DateTime.Now.Month+"/";//存照片的地址
//根据文件名称,自动建立对应目录
if (!System.IO.Directory.Exists(Server.MapPath(file_path)))
{
System.IO.Directory.CreateDirectory(Server.MapPath(file_path));
}
var fullFileName = Server.MapPath(file_path + filename);
var fs = new FileStream(fullFileName, FileMode.OpenOrCreate, FileAccess.Write);
newImage.Save(fs, ImageFormat.Png); //保存图片
//AddFrame(CombinImage(newImage, Server.MapPath("/images /logo/cnnlogo.png"))).Save(fs, ImageFormat.Png);
fs.Flush();
fs.Close();
str = file_path + filename;
}
catch (Exception ex)
{
str = ex.Message;
}
return str;
}
/// <summary>
/// 在图片四周加入白边
/// </summary>
/// <param name="Img">图片</param>
/// <param name="Margin">白边的高度,单位是像素</param>
/// <returns>Bitmap</returns>
private static Bitmap AddFrame(Image Img, int Margin = 6)
{
//位图宽高
int width = Img.Width + Margin;
int height = Img.Height + Margin;
Bitmap BitmapResult = new Bitmap(width, height);
Graphics Grp = Graphics.FromImage(BitmapResult);
SolidBrush b = new SolidBrush(Color.White);//这里修改颜色
Grp.FillRectangle(b, 0, 0, width, height);
System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(0, 0, Img.Width, Img.Height);
//向矩形框内填充Img
Grp.DrawImage(Img, Margin / 2, Margin / 2, Rec, GraphicsUnit.Pixel);
//返回位图文件
Grp.Dispose();
GC.Collect();
return BitmapResult;
}
/// <summary>
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
/// </summary>
/// <param name="imgBack">粘贴的源图片</param>
/// <param name="destImg">粘贴的目标图片</param>
public static Image CombinImage(Image imgBack, string destImg)
{
Image img = Image.FromFile(destImg); //照片图片
if (img.Height != 25 || img.Width != 25)
{
img = KiResizeImage(img, 25, 25, 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(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height);
GC.Collect();
return imgBack;
}
/// <summary>
/// Resize图片
/// </summary>
/// <param name="bmp">原始Bitmap</param>
/// <param name="newW">新的宽度</param>
/// <param name="newH">新的高度</param>
/// <param name="Mode">保留着,暂时未用</param>
/// <returns>处理以后的图片</returns>
public static Image KiResizeImage(Image bmp, int newW, int newH, int Mode)
{
try
{
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;
}
}