前言

此篇文章适合一些一脸懵逼开发二维码的人群,相信通过这篇文章能让你对二维码的认知从一无所知到牛逼到死,感谢我吧!骚年。。!!

在写代码之前我觉得应该先讲一下二维码原理以及规则,每个区域的小黑快都有着什么含义。

一. 二维码基本知识

二维码另一个名称是QR Code(Quick Response Code),近年来在移动设备上经常使用,与传统条形码相比,可以存储更多的信息。二维码本质上是个密码算法,基本知识总结如下。 
首先,二维码存在 40 种尺寸,在官方文档中,尺寸又被命名为 Version。尺寸与 Version 存在线性关系:Version 1 是 21×21 的矩阵,Version 2 是 25×25 的矩阵,每增加一个 Version,尺寸都会增加 4,故尺寸 Size 与 Version 的线性关系为:

 

Size=(Version−1)×4Size=(Version−1)×4

 

Version 的最大值是 40,故尺寸最大值是(40-1)*4+21 = 177,即 177 x 177 的矩阵。

二维码结构如下图 1.1 所示: 


C# 二维码生成支持汉字中间带图片 
图1.1 二维码结构 

 

二维码的各部分都有自己的作用,基本上可被分为定位、功能数据、数据内容三部分。

  • 定位图案: 
    • Position Detection Pattern, 定位图案:用于标记二维码矩形的大小;用三个定位图案即可标识并确定一个二维码矩形的位置和方向了;
    • Separators for Position Detection Patterns, 定位图案分割器:用白边框将定位图案与其他区域区分;
    • Timing Patterns, 时序图案:用于定位,二维码如果尺寸过大,扫描时容易畸变,时序图案的作用就是防止扫描时畸变的产生;
    • Alignment Patterns, 对齐图案:只有在 Version 2 及其以上才会需要;
  • 功能数据: 
    • Format Information, 格式信息:存在于所有尺寸中,存放格式化数据;
    • Version Information, 版本信息:用于 Version 7 以上,需要预留两块 3×6 的区域存放部分版本信息;
  • 数据内容:剩余部分存储数据内容 
    • Data Code, 数据码;
    • Error Correction Code, 纠错码;

有趣的我粘贴就粘贴一半,剩下的就让他随缘而去吧。毕竟搞懂这些就已经足够了,可爱的你,如果还是想深究,请戳https://blog.csdn.net/ajianyingxiaoqinghan/article/details/78837864

二. 二维码代码编写

二维码的生成用了一个DLL,叫做ThoughtWorks.QRCode。相信你也已经在网上搜索到了。的却,很贵!面对可爱的你,我决定无偿!!赠送!!https://pan.baidu.com/s/1D2a6MLrYNCxzabRTBtY3iA  密码:ndzq

首先在你的项目里添加这个引用。

然后在你的文件里添加下面的代码。

        #region 生成二维码
        public string GetQRCode()
        {
            string FullPath = string.Empty;
            try
            {
                //需要生成的文字
                string enCodeString = Context.Request["QRStr"];
                if (string.IsNullOrEmpty(enCodeString))
                {
                    enCodeString = "如此可爱的你";
                }
                QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
                //二维码背景颜色
                qrCodeEncoder.QRCodeBackgroundColor = System.Drawing.Color.White;
                //二维码编码方式
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
                //每个小方格的宽度
                qrCodeEncoder.QRCodeScale = 4;
                //版本号越大生成的二维码越大最大为40
                qrCodeEncoder.QRCodeVersion = 8;
                //纠错率级别
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
                System.Drawing.Image image = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8);  
                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                {
                    //图片格式制定为png
                    Image img = CombinImage(image, HttpContext.Current.Server.MapPath("~/Images/hblogo.png"));//这里设置中间图片的路径
                    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                    saveQRCode(img, HttpContext.Current.Server.MapPath("~/") + "/qrimage/");
                    //清除缓冲区流中的所有输出
                    Context.Response.ClearContent();
                    //输出流的HTTP MIME类型设置为"image/Png"
                    Context.Response.ContentType = "image/Png";
                    //输出图片的二进制流
                    Context.Response.BinaryWrite(ms.ToArray());
                }
            }
            catch (Exception ex)
            {
                ExceptionManage.ExceptionHandle(ex);
            }
            return FullPath;
        }
        /// <summary>
        /// 将生成的二维码保存到本地(暂时不用)
        /// </summary>
        /// <param name="img">将要保存的图片</param>
        /// <param name="imgpath"></param>
        private void saveQRCode(Image img,string imgpath)
        {
            if (!System.IO.Directory.Exists(imgpath))
            {
                Directory.CreateDirectory(imgpath);
            }
            string filename = string.Format(DateTime.Now.ToString(), "yyyymmddhhmmss");
            filename = filename.Replace(" ", "");
            filename = filename.Replace(":", "");
            filename = filename.Replace("-", "");
            filename = filename.Replace(".", "");
            filename = filename.Replace("/", "");
            
            img.Save(imgpath + filename + ".jpg");
        }
        /// <summary>    
        /// 调用此函数后使此两种图片合并,类似相册,有个    
        /// 背景图,中间贴自己的目标图片    
        /// </summary>    
        /// <param name="imgBack">粘贴的源图片</param>    
        /// <param name="destImg">粘贴的目标图片</param>    
        public Image CombinImage(Image imgBack, string destImg)
        {
            Image img = Image.FromFile(destImg);        //照片图片      
            if (img.Height != 65 || img.Width != 65)
            {
                img = KiResizeImage(img, 65, 65, 0);
            }
            Graphics g = Graphics.FromImage(imgBack);
  
            g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height);      //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);     
  
            //g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框    
  
            //g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);    
  
            g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height);
            GC.Collect();
            return imgBack;
        }
  
  
        /// <summary>    
        /// Resize图片    
        /// </summary>    
        /// <param name="bmp">原始Bitmap</param>    
        /// <param name="newW">新的宽度</param>    
        /// <param name="newH">新的高度</param>    
        /// <param name="Mode">保留着,暂时未用</param>    
        /// <returns>处理以后的图片</returns>    
        public Image KiResizeImage(Image bmp, int newW, int newH, int Mode)
        {
            try
            {
                Image b = new Bitmap(newW, newH);
                Graphics g = Graphics.FromImage(b);
                // 插值算法的质量    
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
                g.Dispose();
                return b;
            }
            catch
            {
                return null;
            }
        }
        #endregion

到此你就可以生成二维码了,支持汉字,中间自定义图片。

好像你对。。。。两小时后。。。。。

五瓶酒后,兴尽而归。。。。。。。。。。。

到此你就可以生成你所想要的二维码了,好像你也没有牛逼到死哈哈哈,

忘了我吧。。。。

 

相关文章: