c#中根据链接生成二维码以及二维码中间加上logo,加上白边

297 阅读2分钟

首先在NuGet程序包里安装ThoughtWorks.QRCode程序包 在控制器里引用 using ThoughtWorks.QRCode.Codec; using System.Drawing;

    /// <summary>
    /// 生成二维码
    /// </summary>
    /// <param name="link">链接</param>
    /// <returns></returns>
    public string QRCode(string link)
    {
        var str = string.Empty;
        try
        {
            Bitmap bt;
            string enCodeString = link;

            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注                 意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
            qrCodeEncoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
            qrCodeEncoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时                 发生错误)
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效                 验、错误更正(有4个等级)
            qrCodeEncoder.QRCodeBackgroundColor = Color.White;//背景色
            qrCodeEncoder.QRCodeForegroundColor = Color.Black;//前景色

            bt = qrCodeEncoder.Encode(enCodeString, System.Text.Encoding.UTF8);

            System.Drawing.Image newImage = bt.GetThumbnailImage(165, 165, null,                         System.IntPtr.Zero);//设置图片固定大小

            string filename = DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".png";//根                 据时间生成唯一的文件名

            string file_path = "/uploadfiles/qrcoderimg/cnnerweima                                       /"+DateTime.Now.Year.ToString()+"/"+DateTime.Now.Month+"/";//存照片的地址

            //根据文件名称,自动建立对应目录
            if (!System.IO.Directory.Exists(Server.MapPath(file_path)))
            {
                System.IO.Directory.CreateDirectory(Server.MapPath(file_path));
            }
            var fullFileName = Server.MapPath(file_path + filename);
            var fs = new FileStream(fullFileName, FileMode.OpenOrCreate,                                 FileAccess.Write);
            newImage.Save(fs, ImageFormat.Png); //保存图片
            //AddFrame(CombinImage(newImage, Server.MapPath("/images                                     /logo/cnnlogo.png"))).Save(fs, ImageFormat.Png);
            fs.Flush();
            fs.Close();
            str = file_path + filename;
        }
        catch (Exception ex)
        {

            str = ex.Message;
        }
       

    
        return str;
    }
    
    /// <summary>
    /// 在图片四周加入白边
    /// </summary>
    /// <param name="Img">图片</param>
    /// <param name="Margin">白边的高度,单位是像素</param>
    /// <returns>Bitmap</returns>
    private static Bitmap AddFrame(Image Img, int Margin = 6)
    {
        //位图宽高
        int width = Img.Width + Margin;
        int height = Img.Height + Margin;
        Bitmap BitmapResult = new Bitmap(width, height);
        Graphics Grp = Graphics.FromImage(BitmapResult);
        SolidBrush b = new SolidBrush(Color.White);//这里修改颜色
        Grp.FillRectangle(b, 0, 0, width, height);
        System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(0, 0, Img.Width,                  Img.Height);
        //向矩形框内填充Img
        Grp.DrawImage(Img, Margin / 2, Margin / 2, Rec, GraphicsUnit.Pixel);
        //返回位图文件
        Grp.Dispose();
        GC.Collect();
        return BitmapResult;
    }

    /// <summary>    
    /// 调用此函数后使此两种图片合并,类似相册,有个    
    /// 背景图,中间贴自己的目标图片    
    /// </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 != 25 || img.Width != 25)
        {
            img = KiResizeImage(img, 25, 25, 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 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;
        }
    }