本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码。网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边边框。有需要的朋友们可以试一下,如有bug欢迎指正。

首先,将 ThoughtWorks.QRCode.dll 放在 bin 目录后,在页面中引用:

using ThoughtWorks.QRCode.Codec;
生成二维码图片:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/// <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 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;
}
private static bool IsTrue() // 在Image类别对图片进行缩放的时候,需要一个返回bool类别的委托
{
    return true;
}

在aspx页面调用和输出为图片流:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
string content = string.IsNullOrEmpty(Request.QueryString["txt"]) ? "http://www.lenashane.com/" : Request.QueryString["txt"];
int size = Convert.ToInt32(string.IsNullOrEmpty(Request.QueryString["size"]) ? "200" : Request.QueryString["size"]);
int border = Convert.ToInt32(string.IsNullOrEmpty(Request.QueryString["border"]) ? "10" : Request.QueryString["border"]);
System.Drawing.Image image = CreateQRCode(content,
    QRCodeEncoder.ENCODE_MODE.BYTE,
    QRCodeEncoder.ERROR_CORRECTION.M,
    0,
    5,
    size,
    border);
//将图片输出到页面
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Png";
HttpContext.Current.Response.OutputStream.Write(ms.ToArray(), 0, ms.ToArray().Length);
HttpContext.Current.Response.End();
ms.Close();
ms = null;
image.Dispose();
image = null;

生成二维码方法,增加定位点着色参数(System.Drawing.Color),效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/// <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 System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border, Color codeEyeColor)
{
    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 && 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 (true)
        {
            //定位点方块边长
            int beSize = qrCodeEncoder.QRCodeScale * 3;
            int bep1_l = qrCodeEncoder.QRCodeScale * 2;
            int bep1_t = qrCodeEncoder.QRCodeScale * 2;
            int bep2_l = image.Width - qrCodeEncoder.QRCodeScale * 5 - 1;
            int bep2_t = qrCodeEncoder.QRCodeScale * 2;
            int bep3_l = qrCodeEncoder.QRCodeScale * 2;
            int bep3_t = image.Height - qrCodeEncoder.QRCodeScale * 5 - 1;
            int bep4_l = image.Width - qrCodeEncoder.QRCodeScale * 7 - 1;
            int bep4_t = image.Height - qrCodeEncoder.QRCodeScale * 7 - 1;
            System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(image);
            // Create solid brush.
            SolidBrush blueBrush = new SolidBrush(codeEyeColor);
            // Fill rectangle to screen.
            graphic0.FillRectangle(blueBrush, bep1_l, bep1_t, beSize, beSize);
            graphic0.FillRectangle(blueBrush, bep2_l, bep2_t, beSize, beSize);
            graphic0.FillRectangle(blueBrush, bep3_l, bep3_t, beSize, beSize);
            graphic0.FillRectangle(blueBrush, bep4_l, bep4_t, qrCodeEncoder.QRCodeScale, qrCodeEncoder.QRCodeScale);
        }
        //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
        #region 如果目标尺寸大于生成的图片尺寸,将二维码绘制在目标尺寸白色画布的中心位置
        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;
}

C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码相关推荐

  1. 雨听|生成指定路径的微信小程序二维码

    生成指定路径的微信小程序二维码 步骤一:登录微信公众平台 步骤二:右上方选择"工具",再选择"生成小程序码" 步骤三:选择需要生成二维码的小程序 步骤四:填写页 ...

  2. QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)

    QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应 ...

  3. QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)

    提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOG ...

  4. jquery.qrcode生成带logo和背景图的二维码

    效果图: <html lang="zh-cn"> <head> <title>jQuery生成二维码分享图片</title> < ...

  5. Vue生成带图片logo以及文字的二维码组件,可下载二维码为图片,附组件调用代码--核心qrcode

    目录 1.初始化qrcode 2.二维码生成以及下载组件代码 可以自己控制是否生成logo以及文字说明 3.父页面调用组件代码 1.初始化qrcode cnpm install --save qrco ...

  6. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍  这里我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream o ...

  7. 微信公众号怎么生成带粉丝关注统计的渠道二维码

    关于微信公众号在线生成带粉丝关注统计的渠道二维码,第三方工具微号帮提供了渠道二维码生成功能实现,可以为公众号生成带粉丝关注统计的渠道二维码,可以生成多个不同的渠道二维码,每个渠道二维码都可以单独统计粉 ...

  8. 如何生成背景透明的微信小程序二维码

    如何生成背景透明的微信小程序二维码 透明背景参数 透明背景参数 is_hyaline 是否需要透明底色, is_hyaline 为true时,生成透明底色的小程序码 public function g ...

  9. C# ThoughtWorks.QRCode.dll 生成完美二维码(大小 边距 备注 颜色 LOGO大小背景形状)

    一.先睹为快 功能: 1)边框颜色可改   2)边距可修改     3)二维码背景色可修改  4)二维码前景色可修改   5)备注文本可修改(背景色可改 字体颜色可改 大小可改) 6) logo大小背 ...

最新文章

  1. 太阳光是平行光吗_科普文系列活动 || 奇妙的光现象
  2. Compmgmtlauncher.exe问题解决方法
  3. Unity3D 之NGUI各种脚本及应用
  4. vue模拟加载更多功能(数据追加)
  5. 关于GUI_DOWNLOAD中下载excel等文档的乱码问题
  6. 波司登,除了羽绒服还是羽绒服
  7. Notepad++如何编译、运行Java
  8. .htaccess 后门
  9. orbeon form 的架构简介 - 如何访问用户通过 form 存储的数据
  10. RocketMQ消费幂等性处理
  11. 支付宝上市,让我损失了2000万(盘点这些年错过的机会)
  12. 【转】unity开发android游戏(一)搭建Unity安卓开发环境
  13. linux一键安装python_Linux下,一键安装python3;适用于Centos、Debian、Ubuntu等
  14. socket.io html5 聊天,socket.io实现在线聊天页面
  15. 卸载TeXLive2016
  16. mcafee peo5.3安装配置
  17. SketchUp插件|FredoGhost幻影替身插件最新版免费下载及介绍(轻量化草图大师模型)
  18. 大学教师晋升正教授职称需要多久
  19. VisionMobile:Apple和三星利润的秘诀
  20. 计算机组成原理课程设计报告 给出指令执行流程 add(二进制加法),计算机组成原理课程设计...

热门文章

  1. Qt Creator将应用程序部署到QNX Neutrino设备
  2. C语言实现链表(附完整源码)
  3. C++对象的构造和析构
  4. ap java内容_AP 计算机知识点总结
  5. linux java top_linux top命令 监测系统性能
  6. java什么是对象如何创建对象_java对象的创建过程是什么
  7. 「SVN」ubuntu svn自动忽略了.a.so等文件
  8. yarn timeline1,timeline2官网解释
  9. Oracle中PLSQL中if语句的写法
  10. 数据库元数据数据字典查询_8_列出给定表的默认约束