由于做的项目需要生成二维码,今天就学习了一下NET中生成二维码的方法,描述

就现在而已,生成二维码的方法很多,其中在.NET中生成二维码可以程序集QrCode.Net和ZXing.Net,其中可以使用VS中集成的Nuget来导入程序集,这里就程序集引用不做太多说明,下面主要描述一下主要代码:

方法一:使用QrCode.Net

引用命名空间:

using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;


后台代码

        /// <summary>
        /// 生成二维码
        /// </summary>
        /// <param name="text">待生成的二维码中内容</param>
        /// <returns></returns>
        [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 = "二维码";
}
<img src=@Url.Content("~/Content/qrcode.png") />
结果如图:


方法二:使用ZXing.Net

引用命名空间:

using ZXing;
using ZXing.Common;
using ZXing.QrCode;

生成二维码和条形码后台代码:

/// <summary>
        /// 生成二维码使用ZXing.Net
        /// </summary>
        /// <param name="text">待生成的二维码中内容</param>
        /// <returns></returns>
        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");
        }
        /// <summary>
        /// 生成条形码使用Zing,但只支持数字,支持偶数个,最大长度80
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        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 = "二维码";
}
<br />
<img src=@Url.Content("~/Content/barcode.png") />
<br />
<img src=@Url.Content("~/Content/qrcodeZXing.png") />

2017年12月5日补充更新:

下面使用ThoughtWorks.QRCode这个动态链接库来生成二维码

        /// <summary>
        /// 生成二维码使用ThoughtWorks.QRCode
        /// </summary>
        /// <param name="text">待生成的二维码中内容</param>
        /// <returns></returns>
        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的二维码(就是中间嵌了一个图片的二维码):

/// <summary>
        /// 生成二维码使用ThoughtWorks.QRCode
        /// </summary>
        /// <param name="text">待生成的二维码中内容</param>
        /// <param name="url">二维码保存位置</param>
        /// <param name="imageUrl">logo位置</param>
        /// <returns></returns>
        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;
        }




Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐