本示例中我使用的是Gma.QrCodeNet,先写个QRCodeHelper.cs
using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Web;
namespace SH.Web.Models
{
// 含有QR码的描述类和包装编码和渲染
public class QRCodeHelper
{
public static bool GetQRCode(string strContent, MemoryStream ms, int size)
{
ErrorCorrectionLevel Ecl = ErrorCorrectionLevel.M; //误差校正水平
string Content = strContent;//待编码内容
QuietZoneModules QuietZones = QuietZoneModules.Two; //空白区域
int ModuleSize = size;//大小
var encoder = new QrEncoder(Ecl);
QrCode qr;
if (encoder.TryEncode(Content, out qr))//对内容进行编码,并保存生成的矩阵
{
var render = new GraphicsRenderer(new FixedModuleSize(ModuleSize, QuietZones));
render.WriteToStream(qr.Matrix, ImageFormat.Png, ms);
}
else
{
return false;
}
return true;
}
///获取二维码并保存
public static void GetQRCode(string name)
{
QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.M);
QrCode qrCode = qrEncoder.Encode(name);
//保存成png文件
if (!System.IO.Directory.Exists(HttpContext.Current.Server.MapPath("/Upload/QrCode/")))
{
System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("/Upload/QrCode/"));//不存在就创建目录
}
string filename = HttpContext.Current.Server.MapPath("/Upload/QrCode/"+name+".png");
GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(20, QuietZoneModules.Two), Brushes.Black, Brushes.White);
using (FileStream stream = new FileStream(filename, FileMode.Create))
{
render.WriteToStream(qrCode.Matrix, ImageFormat.Png, stream);
}
}
//生成二维码保存并返回流
public static MemoryStream GetQRCode(string content, string Name, int moduleSize = 20)
{
var encoder = new QrEncoder(ErrorCorrectionLevel.M);
QrCode qrCode = encoder.Encode(content);
GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two), Brushes.Black, Brushes.White);
//从文件流保存
if (!System.IO.Directory.Exists(HttpContext.Current.Server.MapPath("/Upload/QrCode/")))
{
System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("/Upload/QrCode/"));//不存在就创建目录
}
string filename = HttpContext.Current.Server.MapPath("/Upload/QrCode/" + Name + ".png");
using (FileStream stream = new FileStream(filename, FileMode.Create))
{
render.WriteToStream(qrCode.Matrix, ImageFormat.Png, stream);
}
//返回文件流
MemoryStream memoryStream = new MemoryStream();
render.WriteToStream(qrCode.Matrix, ImageFormat.Png, memoryStream);
return memoryStream;
}
//生成带logo的二维码保存并返回流
public static MemoryStream GetQRCodeLogo(string content, string Name, int moduleSize = 14)
{
var encoder = new QrEncoder(ErrorCorrectionLevel.M);
QrCode qrCode = encoder.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);
Image img = Image.FromFile(HttpContext.Current.Server.MapPath(PageParam.LogoPath+PageNetInfo.NetLogo));
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 ms = new MemoryStream();
map.Save(ms, ImageFormat.Png);
if (!System.IO.Directory.Exists(HttpContext.Current.Server.MapPath("/Upload/QrCode/")))
{
System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("/Upload/QrCode/"));//不存在就创建目录
}
map.Save(HttpContext.Current.Server.MapPath("/Upload/QrCode/" + Name + ".png"), ImageFormat.Png);
return ms;
}
}
}以上就是操作类,现在开始写调用
1.返回图片文件流代码:显示图片
控制器中的文件视图调用如下:
// 二维码输出
public FileContentResult GetQrCode()
{
MemoryStream ms = QRCodeHelper.GetQRCodeLogo(string content, string name);
return File(ms.ToArray(), "image/Png");
}前台html展示图片调用
<img src="/Home/GetQrCode"/>
2.返回图片文件:下载图片
//图片下载
public FilePathResult DownFileQrCode()
{
var path = Server.MapPath("/Upload/QrCode/001.png");
var name = Path.GetFileName(path);
return File(path, "application/octet-stream", name);
}这里只返回本地存在的图片,其他需求另说
前台调用:
<a href="/Home/DownFileQrCode">下载</a>
基本用法就介绍完毕了,大神们如果有更好的方法显示和下载请联系我。
川公网安备 51010702003150号
留下您的脚步
最近评论