数据直接生成二维码保存路径在数据库与利用base64加载图片

后端

 public class QRCode
    {
        /// 
        /// 生成带Logo的二维码
        /// 
        /// 链接
        /// logo地址
        /// 文件夹名
        public static string Generate(string url, string LogoPath, string PathUrl)
        {
            //Logo 图片
            string path = AppDomain.CurrentDomain.BaseDirectory + LogoPath;
            Bitmap logo = new Bitmap(@path);

            //构造二维码写码器
            MultiFormatWriter writer = new MultiFormatWriter();
            Dictionary hint = new Dictionary();
            hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
            hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

            //生成二维码 
            BitMatrix bm = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, hint);
            BarcodeWriter barcodeWriter = new BarcodeWriter();
            Bitmap map = barcodeWriter.Write(bm);


            //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
            int[] rectangle = bm.getEnclosingRectangle();

            //计算插入图片的大小和位置
            int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);
            int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);
            int middleL = (map.Width - middleW) / 2;
            int middleT = (map.Height - middleH) / 2;

            //将img转换成bmp格式,否则后面无法创建Graphics对象
            Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(bmpimg))
            {
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.DrawImage(map, 0, 0);
            }
            //将二维码插入图片
            Graphics myGraphic = Graphics.FromImage(bmpimg);
            //白底
            myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
            myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH);

            //保存成图片
            string SavePath = AppDomain.CurrentDomain.BaseDirectory;
            //string dated = DateTime.Now.ToString("yyyyMMdd");
            string dates = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string SavePathUrl = @"Upload/QRCode/" + PathUrl + @"/";
            if (!string.IsNullOrEmpty(SavePath))
            {
                SavePath += @"Upload\QRCode\" + PathUrl + @"\";
                if (!Directory.Exists(SavePath))
                {
                    Directory.CreateDirectory(SavePath);
                }
                SavePath += dates + "_" + Number(6) + ".png";
                SavePathUrl += dates + "_" + Number(6) + ".png";
                bmpimg.Save(@SavePath, ImageFormat.Png);
            }
            return SavePathUrl;
        }


        public static string GenerateBase64(string LogoPath, string url)
        {
            //Logo 图片
            string path = AppDomain.CurrentDomain.BaseDirectory + LogoPath;
            Bitmap logo = new Bitmap(@path);

            //构造二维码写码器
            MultiFormatWriter writer = new MultiFormatWriter();
            Dictionary hint = new Dictionary();
            hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
            hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

            //生成二维码 
            BitMatrix bm = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, hint);
            BarcodeWriter barcodeWriter = new BarcodeWriter();
            Bitmap map = barcodeWriter.Write(bm);


            //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
            int[] rectangle = bm.getEnclosingRectangle();

            //计算插入图片的大小和位置
            int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);
            int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);
            int middleL = (map.Width - middleW) / 2;
            int middleT = (map.Height - middleH) / 2;

            //将img转换成bmp格式,否则后面无法创建Graphics对象
            Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(bmpimg))
            {
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.DrawImage(map, 0, 0);
            }
            //将二维码插入图片
            Graphics myGraphic = Graphics.FromImage(bmpimg);
            //白底
            myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
            myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH);
            return BitMapToBase64String(bmpimg);//图片转base64编码
        }


        //图片转为base64编码的字符串
        public static string BitMapToBase64String(Bitmap bmp)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length);
                ms.Close();
                return Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                return null;
            }
        }


        /// 
        /// 生成随机数字
        /// 
        /// 生成长度
        /// 
        public static string Number(int Length)
        {
            return Number(Length, false);
        }
        /// 
        /// 生成随机数字
        /// 
        /// 生成长度
        /// 是否要在生成前将当前线程阻止以避免重复
        /// 
        public static string Number(int Length, bool Sleep)
        {
            if (Sleep)
                System.Threading.Thread.Sleep(3);
            string result = "";
            System.Random random = new Random();
            for (int i = 0; i < Length; i++)
            {
                result += random.Next(10).ToString();
            }
            return result;
        }
    }

处理程序调用
数据直接生成二维码保存路径在数据库与利用base64加载图片_第1张图片

 case "qrcode"://二维码
                    //传入两个参数action=qrcode&mainkeyid=
                    string b64 = QRCode.GenerateBase64(@"JydModleOrder\img\jyd.png", ConfigHelper.GetValue("website") + "/JydModleOrder/QRCodeView.aspx?KeyID=" + context.Request["mainkeyid"]);
                    context.Response.Write(b64);
                    break;

前台调用


数据直接生成二维码保存路径在数据库与利用base64加载图片_第2张图片

你可能感兴趣的:(C#)