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

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

直接引用

using ThoughtWorks.QRCode.Codec; 需下载dll

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();
    }


测试 效果图如下:

这里写图片描述

///
/// 生成二维码 本函数摘录自网友的方法,后面重写了一个
///
/// 内容文本
/// 二维码编码方式
/// 纠错码等级
/// 二维码版本号 0-40
/// 每个小方格的预设宽度(像素),正整数
/// 图片尺寸(像素),0表示不设置
/// 图片白边(像素),当size大于0时有效
///
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) /
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值