偷影子的人

c# 生成与解码二维码,自定义中心图片与边框

c# 的二维码 需借助插件ThoughtWorks 

直接引用

using ThoughtWorks.QRCode.Codec;

using ThoughtWorks.QRCode.Codec.Data;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

        //生成二维码方法1

        //text 二维码的文本内容 

       //Counselor对象内含微信头像等信息
        public static string GetTwoCodeMetho(string text, bk_Counselor Counselor)
        {
            String data = text;
            string url = "";
            if (!string.IsNullOrEmpty(data))
            {

                //声明QRCodeEncoder  其属性在下面的详细方法中有解释
                QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
                qrCodeEncoder.QRCodeScale = 4;
                qrCodeEncoder.QRCodeVersion = 8;
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;

                Image image = CreateQRCode(data, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5);
                //System.Drawing.Image image = qrCodeEncoder.Encode(data);

                System.IO.MemoryStream MStream = new System.IO.MemoryStream();
                image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png);
                System.IO.MemoryStream MStream1 = new System.IO.MemoryStream();
                System.Drawing.Image codeimg;
                //有微信头像地址
                if (!string.IsNullOrEmpty(Counselor.CounselorImg))
                {
                    System.Net.WebRequest webreq = System.Net.WebRequest.Create(Counselor.CounselorImg);
                    System.Net.WebResponse webres = webreq.GetResponse();
                    Stream stream = webres.GetResponseStream();
                    Image ImageWeixin;
                    ImageWeixin = Image.FromStream(stream);
                    stream.Close();
                    codeimg = CombinImage(image, ImageWeixin);
                    codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png);
                }
                else
                {
                    codeimg = image;
                }

                //保存图片到本地
                string PortraitApp = "~/FileLibs/CodeImg/";
                if (!Directory.Exists(HttpContext.Current.Server.MapPath(PortraitApp)))
                {
                    Directory.CreateDirectory(HttpContext.Current.Server.MapPath(PortraitApp));
                }
                string filename = Counselor.CounselorName + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png";
                string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename;
                System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
                codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png);

               //由于项目前后台分离 需要指定生成二维码后的url
                string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString();
                url = RetureFile.Replace("/FileLibs/File/", "/FileLibs/CodeImg/") + filename;


                //HttpContext.Current.Response.ClearContent();
                //HttpContext.Current.Response.ContentType = "image/png";
                //HttpContext.Current.Response.BinaryWrite(MStream1.ToArray());//直接输出图片 测试用

             //处理完释放资源
                //image.Dispose();
                MStream.Dispose();
                MStream1.Dispose();
            }
            return url;
            //HttpContext.Current.Response.Flush();
            //HttpContext.Current.Response.End();
        }

    测试 效果图如下:

     

 

        /// <summary>
        /// 生成二维码  本函数摘录自网友的方法,后面重写了一个
        /// </summary>
        /// <param name="Content">内容文本</param>
        /// <param name="QRCodeEncodeMode">二维码编码方式</param>
        /// <param name="QRCodeErrorCorrect">纠错码等级</param>
        /// <param name="QRCodeVersion">二维码版本号 0-40</param>
        /// <param name="QRCodeScale">每个小方格的预设宽度(像素),正整数</param>
        /// <param name="size">图片尺寸(像素),0表示不设置</param>
        /// <param name="border">图片白边(像素),当size大于0时有效</param>
        /// <returns></returns>
        public static System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border)
        {
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode;
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect;
            qrCodeEncoder.QRCodeScale = QRCodeScale;
            qrCodeEncoder.QRCodeVersion = QRCodeVersion;
            System.Drawing.Image image = qrCodeEncoder.Encode(Content);

            #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框
            if (size > 0)
            {
                //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
                #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
                while (image.Width < size)
                {
                    qrCodeEncoder.QRCodeScale++;
                    System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
                    if (imageNew.Width < size)
                    {
                        image = new System.Drawing.Bitmap(imageNew);
                        imageNew.Dispose();
                        imageNew = null;
                    }
                    else
                    {
                        qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
                        imageNew.Dispose();
                        imageNew = null;
                        break;
                    }
                }
                #endregion

                //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
                #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
                while (image.Width > size && qrCodeEncoder.QRCodeScale > 1)
                {
                    qrCodeEncoder.QRCodeScale--;
                    System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
                    image = new System.Drawing.Bitmap(imageNew);
                    imageNew.Dispose();
                    imageNew = null;
                    if (image.Width < size)
                    {
                        break;
                    }
                }
                #endregion

                //如果目标尺寸大于生成的图片尺寸,则为图片增加白边
                #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边
                if (image.Width <= size)
                {
                    //根据参数设置二维码图片白边的最小宽度
                    #region 根据参数设置二维码图片白边的最小宽度
                    if (border > 0)
                    {
                        while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1)
                        {
                            qrCodeEncoder.QRCodeScale--;
                            System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
                            image = new System.Drawing.Bitmap(imageNew);
                            imageNew.Dispose();
                            imageNew = null;
                        }
                    }
                    #endregion

                    //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
                    if (image.Width < size)
                    {
                        //新建空白绘图
                        System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size);
                        System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
                        int p_left = 0;
                        int p_top = 0;
                        if (image.Width <= size) //如果原图比目标形状宽
                        {
                            p_left = (size - image.Width) / 2;
                        }
                        if (image.Height <= size)
                        {
                            p_top = (size - image.Height) / 2;
                        }

                        //将生成的二维码图像粘贴至绘图的中心位置
                        graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
                        image = new System.Drawing.Bitmap(panel);
                        panel.Dispose();
                        panel = null;
                        graphic0.Dispose();
                        graphic0 = null;
                    }
                }
                #endregion
            }
            #endregion
            return image;
        }

        //生成二维码方法3 text为文本或网址等内容,imgurl则为图片的网址
        public static void GetTwoCodeMethoThree(string text, string imgurl = "")
        {
            try
            {
                String data = text;
                if (!string.IsNullOrEmpty(data))
                {

                    QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式:BYTE 能支持中文,ALPHA_NUMERIC 扫描出来的都是数
                    qrCodeEncoder.QRCodeScale = 4;//大小:值越大生成的二维码图片像素越高
                    qrCodeEncoder.QRCodeVersion = 8;//版本
                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误校验、更正等级

                    Image image = CreateQRCode(text, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5);
                    //System.Drawing.Image image = qrCodeEncoder.Encode(data);

                    System.IO.MemoryStream MStream = new System.IO.MemoryStream();
                    image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png);
                    System.IO.MemoryStream MStream1 = new System.IO.MemoryStream();
                    System.Drawing.Image codeimg;
                    Image ImageWeixin;
                    if (!string.IsNullOrEmpty(imgurl))
                    {
                        try
                        {

                            //获得网络上的图片
                            System.Net.WebRequest webreq = System.Net.WebRequest.Create(imgurl);
                            System.Net.WebResponse webres = webreq.GetResponse();
                            Stream stream = webres.GetResponseStream();

                            ImageWeixin = Image.FromStream(stream);
                            stream.Close();
      //贴图
                            codeimg = CombinImage(image, ImageWeixin);
                            codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png);

                        }
                        catch {  }
                    }
                    //codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png);
                    //string filename = text + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png";
                    //string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename;
                    //System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
                    //codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
                    //string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString();

                    //直接输出图片 不保存
                    HttpContext.Current.Response.ClearContent();
                    HttpContext.Current.Response.ContentType = "image/png";
                    HttpContext.Current.Response.BinaryWrite(MStream1.ToArray());
                    image.Dispose();
                    MStream.Dispose();
                    MStream1.Dispose();
                }

                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.End();
                //return url;
            }
            catch (Exception ex)
            {
                HttpContext.Current.Response.ClearContent();
                HttpContext.Current.Response.ContentType = "text/xml";
                HttpContext.Current.Response.Write("操作异常:" + ex.ToString());
                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.End();
            }
        }

 

       /// <summary>
        /// 调用此函数后使此两种图片合并,类似相册,有个
        /// 背景图,中间贴自己的目标图片,注意参数不同 destImg使用的是已经初始化的Image,可用于网址类的图片
        /// </summary>
        /// <param name="imgBack">粘贴的源图片</param>
        /// <param name="destImg">粘贴的目标图片</param>
        public static Image CombinImage(Image imgBack, Image destImg, int Lenth = 40)
        {
            Image img = destImg;    //照片图片
            if (img.Height != Lenth || img.Width != Lenth)
            {
                img = KiResizeImage(img, Lenth, Lenth, 0);
                //圆角处理 此处后来优化后调用一次就可以了
                img = CreateRoundedCorner(img, "", "TopLeft");
                img = CreateRoundedCorner(img, "", "TopRight");
                img = CreateRoundedCorner(img, "", "BottomLeft");
                img = CreateRoundedCorner(img, "", "BottomRight");
            }
     
            Graphics g = Graphics.FromImage(imgBack);
            g.DrawImage(imgBack, 0, 0, imgBack.Width + 5, imgBack.Height + 5);   //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>
        /// 调用此函数后使此两种图片合并,类似相册,有个
        /// 背景图,中间贴自己的目标图片 参数不同,destImg使用的是本地路径
        /// </summary>
        /// <param name="imgBack">粘贴的源图片</param>
        /// <param name="destImg">粘贴的目标图片</param>
        public static Image CombinImage(Image imgBack, string destImg)
        {
            Image img = Image.FromFile(destImg);    //照片图片
            if (img.Height != 65 || img.Width != 65)
            {
                img = KiResizeImage(img, 45, 45, 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;
        }
        //创建图层圆角
        public static Image CreateRoundedCorner(Image image, string sDstFilePath, string sCornerLocation)
        {
            Graphics g = Graphics.FromImage(image);
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.CompositingQuality = CompositingQuality.HighQuality;
            Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
            GraphicsPath rectPath = CreateRoundRectanglePath(rect, image.Width / 10, sCornerLocation); //构建圆角外部路径
            Brush b = new SolidBrush(Color.White);//圆角背景白色
            g.DrawPath(new Pen(b), rectPath);
            g.FillPath(b, rectPath);
            g.Dispose();
            //image.Save(sDstFilePath, ImageFormat.Png);            
            return image;
            //image.Dispose();
        }
        //处理圆角 上下左右
        private static GraphicsPath CreateRoundRectanglePath(Rectangle rect, int radius, string sPosition)
        {
            GraphicsPath rectPath = new GraphicsPath();
            switch (sPosition)
            {
                case "TopLeft":
                    {
                        rectPath.AddArc(rect.Left, rect.Top, radius * 2, radius * 2, 180, 90);
                        rectPath.AddLine(rect.Left, rect.Top, rect.Left, rect.Top + radius);
                        break;
                    }

                case "TopRight":
                    {
                        rectPath.AddArc(rect.Right - radius * 2, rect.Top, radius * 2, radius * 2, 270, 90);
                        rectPath.AddLine(rect.Right, rect.Top, rect.Right - radius, rect.Top);
                        break;
                    }

                case "BottomLeft":
                    {
                        rectPath.AddArc(rect.Left, rect.Bottom - radius * 2, radius * 2, radius * 2, 90, 90);
                        rectPath.AddLine(rect.Left, rect.Bottom - radius, rect.Left, rect.Bottom);
                        break;
                    }

                case "BottomRight":
                    {
                        rectPath.AddArc(rect.Right - radius * 2, rect.Bottom - radius * 2, radius * 2, radius * 2, 0, 90);
                        rectPath.AddLine(rect.Right - radius, rect.Bottom, rect.Right, rect.Bottom);
                        break;
                    }

            }
            return rectPath;
        }

 

        /// <summary>
        /// Resize图片 裁剪
        /// </summary>
        /// <param name="bmp">原始Bitmap</param>
        /// <param name="newW">新的宽度</param>
        /// <param name="newH">新的高度</param>
        /// <param name="Mode">保留着,暂时未用</param>
        /// <returns>处理以后的图片</returns>
        public static 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;
            }
        }

 

//二维码解码

 /// <summary>
        /// 二维码解码
        /// </summary>
        /// <param name="filePath">图片路径</param>
        /// <returns></returns>
        public string CodeDecoder(string filePath)
        {
            if (!System.IO.File.Exists(filePath))
                return null;
            Bitmap myBitmap = new Bitmap(Image.FromFile(filePath));
            QRCodeDecoder decoder = new QRCodeDecoder();
            string decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
            return decodedString;
        }

图片地址:http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg

例子:http://192.168.2.228/api/Counselor/GetCodeImg?text=sb&imgurl=http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg

 

调用api 生成图片如下

扫码即可得出text的内容

 

posted @ 2017-07-20 21:32  肉!快到碗里来  阅读(1578)  评论(1编辑  收藏  举报