C# 后端生成二维码

        /// <summary>  
        /// 生成二维码  
        /// </summary>  
        /// <param name="content">内容</param>
        /// <param name="moduleSize">二维码的大小</param>
        /// <returns>输出流</returns>  
        //public static MemoryStream GetQRCode(string content, int moduleSize = 9)
        //{
        //    //ErrorCorrectionLevel 误差校正水平
        //    //QuietZoneModules     空白区域

        //    var encoder = new QrEncoder(ErrorCorrectionLevel.M);
        //    QrCode qrCode = encoder.Encode(content);
        //    GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two), Brushes.Black, Brushes.White);

        //    MemoryStream memoryStream = new MemoryStream();
        //    render.WriteToStream(qrCode.Matrix, ImageFormat.Jpeg, memoryStream);
            
        //    return memoryStream;

        //    //生成图片的代码
        //    //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);
        //    //map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
        //}

        /// <summary>
        /// 生成带Logo二维码  
        /// </summary>
        /// <param name="content">内容</param>
        /// <param name="iconPath">logo路径</param>
        /// <param name="moduleSize">二维码的大小</param>
        /// <returns>输出流</returns>
        public static MemoryStream GetQRCode(string content, string iconPath, int moduleSize = 9)
        {
            QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.M);
            QrCode qrCode = qrEncoder.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);

            //追加Logo图片 ,注意控制Logo图片大小和二维码大小的比例
            //PS:追加的图片过大超过二维码的容错率会导致信息丢失,无法被识别
            Image img = Image.FromFile(iconPath);

            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 memoryStream = new MemoryStream();
            map.Save(memoryStream, ImageFormat.Jpeg);

            return memoryStream;

            //生成图片的代码: map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
        }

  调用方法:

 //生成二维码文件流
            var fileStreamQR = QRCodeHelper.GetQRCode(Url, iconPath, 6);

            var guid = Guid.NewGuid();

            var filename = GetFileName(guid.ToString(), "Jpeg");

            using (var fileStream = new FileStream(filename, FileMode.Create))
            {
                fileStreamQR.WriteTo(fileStream);
            }

 /// <summary>
        /// 获取文件名称
        /// </summary>
        /// <param name="key"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public string GetFileName(string key, string type)
        {
            var uploadDirectory = Path.Combine(AppDomain.CurrentDomain.GetData(".appPath").ToString(), "Content", "uploads");
            if (!Directory.Exists(uploadDirectory))
            {
                Directory.CreateDirectory(uploadDirectory);
            }

            var filename = Path.Combine(uploadDirectory, key + "." + type);
            if (File.Exists(filename))
            {
                File.Delete(filename);
            }
            return filename;
        }

  

 

posted @ 2018-04-10 11:09  微笑代表淡定.Net  阅读(302)  评论(0)    收藏  举报