由于最近有一个需求,就是要求即时生成一个包含代理商名称的注册url的二维码。以供代理商推广的时候使用。当点击此二维码,则跳转到注册页面,在此页面注册成功的会员属于此代理商。生成二维码相关代码,利用ThoughtWorks.QRCode实现了。可是生成图片显示到页面却把我难住了。按我的想法,因为这个二维码是在内存中生成的,是bitmap对象。我是打算让其直接在页面的<img src="" /> 生成src链接,此页面还会有其他的页面内容。但网上搜索,第一种方法是在服务端的某个目录下面生成一个图片文件。然后可以读取这个图片文件显示,这有点绕,不想采用。
第二种方法,生成ashx文件。代码如下:
/// <summary>
/// GetImgUrl 的摘要说明
/// </summary>
public class GetImgUrl : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "Image/jpeg";
string agent = context.Request.QueryString["agent"].ToString();
string url = string.Format("http://jiaogui.jinrimianshi.com/account/register?agent={0}", agent);
using (var img = QRCode.CreateQRCode(url))
{
img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
//context.Response.Flush();
//context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
这种前端页面中的调用代码为:
<div>
<img src="~/Handler/GetImgUrl.ashx?agent=agent3" />
</div>
第三种方法,使用bas64方式生成图片编码。代码如下:
public ActionResult Test()
{
string strBase64 = "";
string url = "http://jiaogui.jinrimianshi.com/account/register?agent=agent1";
using (var img = QRCode.CreateQRCode(url))
{
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
strBase64 = Convert.ToBase64String(arr);
}
}
ViewBag.img = strBase64;
return View();
}
前端调用代码:
<div>
<img src="data:image/jpg;base64,@ViewBag.img" />
</div>