由于做的项目需要生成二维码,今天就学习了一下NET中生成二维码的方法,描述
就现在而已,生成二维码的方法很多,其中在.NET中生成二维码可以程序集QrCode.Net和ZXing.Net,其中可以使用VS中集成的Nuget来导入程序集,这里就程序集引用不做太多说明,下面主要描述一下主要代码:
方法一:使用QrCode.Net
引用命名空间:
using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;
后台代码
///
/// 生成二维码
///
/// 待生成的二维码中内容
///
[AllowAnonymous]
public ActionResult SetQRCode(string text)
{
//实例化二维码对象,参数为erorCorrectionLevel(误差校正水平)
QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.H);
QrCode qrCode = new QrCode();
//设置二维码中的内容,并对内容进行编码,生成的矩阵
qrEncoder.TryEncode(text, out qrCode);
//初始化渲染器 默认画笔将是黑色和白色,参数:Size
var renderer = new GraphicsRenderer(
//FixedModuleSize是用于渲染具有固定模块像素大小的QrCode的策略。参数:moduleSize:像素大小,silentZoneModules:空白区域的数量
new FixedModuleSize(12, QuietZoneModules.Two));
//存储流
MemoryStream ms = new MemoryStream();
renderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, ms);
string buffer = Convert.ToBase64String(ms.GetBuffer());
var imageBit= new Bitmap(ms);
var image = new Bitmap(imageBit, new Size(new Point(200, 200)));//设置图片像素
var fileName = Path.Combine(Server.MapPath("~/Content"), "qrcode.png");
image.Save(fileName, ImageFormat.Png);//保存生成的二维码图片
return View();
}
@{
ViewBag.Title = "二维码";
}
结果如图:
方法二:使用ZXing.Net
引用命名空间:
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
生成二维码和条形码后台代码:
///
/// 生成二维码使用ZXing.Net
///
/// 待生成的二维码中内容
///
public ActionResult GetQrCodeWithZing(string text)
{
BarcodeWriter writer = new BarcodeWriter();
writer.Format = BarcodeFormat.QR_CODE;
QrCodeEncodingOptions options = new QrCodeEncodingOptions();
options.DisableECI = true;
//设置内容编码
options.CharacterSet = "UTF-8";
//设置二维码的宽度和高度
options.Width = 500;
options.Height = 500;
//设置二维码的边距,单位不是固定像素
options.Margin = 1;
writer.Options = options;
Bitmap map = writer.Write(text);
var fileName = Path.Combine(Server.MapPath("~/Content"), "qrcodeZing.png");
map.Save(fileName, ImageFormat.Png);
map.Dispose();
return View("SetQRCode");
}
///
/// 生成条形码使用Zing,但只支持数字,支持偶数个,最大长度80
///
///
///
public ActionResult GetBarCodeWithZXing()
{
Random r = new Random();
string text = (r.Next() * 100000000).ToString();
BarcodeWriter writer = new BarcodeWriter();
//使用ITF 格式,不能被现在常用的支付宝、微信扫出来
//writer.Format = BarcodeFormat.ITF;
//如果想生成可识别的可以使用 CODE_128 格式
writer.Format = BarcodeFormat.CODE_128;
//图片大小
EncodingOptions options = new EncodingOptions()
{
Width = 500,
Height = 150,
Margin = 2
};
//选项
writer.Options = options;
Bitmap map = writer.Write(text);
var fileName = Path.Combine(Server.MapPath("~/Content"), "barcode.png");
map.Save(fileName, ImageFormat.Png);
return View("SetQRCode");
}
前台代码:
@{
ViewBag.Title = "二维码";
}
2017年12月5日补充更新:
下面使用ThoughtWorks.QRCode这个动态链接库来生成二维码
///
/// 生成二维码使用ThoughtWorks.QRCode
///
/// 待生成的二维码中内容
///
public static bool GetQrCode(string text,string url)
{
try
{
Bitmap bt;
string enCodeString = text;
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
bt = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8);
string fileName = Path.Combine(url, text + ".png");
bt.Save(fileName);
}
catch (Exception)
{
return false;
}
return true;
}
使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码):
///
/// 生成二维码使用ThoughtWorks.QRCode
///
/// 待生成的二维码中内容
/// 二维码保存位置
/// logo位置
///
public static bool GetQrCodeWithQRCode(string text, string url, string imageUrl)
{
string fileName = Path.Combine(url, text + ".png");
QRCodeEncoder encoder = new QRCodeEncoder();
try
{
//判断图片是否存在
if (!File.Exists(imageUrl))
{
Bitmap bitmap;
bitmap = encoder.Encode(text, Encoding.UTF8);
bitmap.Save(fileName);
}
else
{
Bitmap imgBack = encoder.Encode(text, Encoding.UTF8);
Image logoImg = Image.FromFile(imageUrl);
Image bitmap = new Bitmap(280, 280);
Graphics g = Graphics.FromImage(bitmap);
g.DrawImage(imgBack, 0, 0, 280, 280);
g.DrawImage(logoImg, 140 - 40, 140 - 40, 80, 80);
bitmap.Save(fileName);
}
}
catch (Exception)
{
return false;
}
return true;
}