开发者社区> 科技小毛> 正文

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

简介: 本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码。网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边边框。
+关注继续查看

本文介绍在 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;
}

 

 

分类: ASP.NET
 
 
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/7458375.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Java 泛型】使用上下边界通配符解决泛型擦除问题
【Java 泛型】使用上下边界通配符解决泛型擦除问题
27 0
Linux系统中使用GCC CPU参数优化代码编译
Linux系统中使用GCC CPU参数优化代码编译 使用特定的GCC参数可以使编译出的程序执行效率有较大提升。具体如下: 1、优化原理: 在编译程序时,借助参数传递的方法,使用与系统CPU相匹配的gcc参数,编译出的程序就是为系统CPU而进行特定优化过的,因而执行速度和效率都会是最好。
822 0
【Java 泛型】使用上下边界通配符解决泛型擦除问题
【Java 泛型】使用上下边界通配符解决泛型擦除问题
25 0
Web Vitals :Google 如何定义性能指标及帮助开发者调优前端性能 ?
来自 Google 的Palances Liao 将在第十五届 D2 前端技术论坛带来 《以全球 Web 角度谈前端性能的更新与趋势》主题演讲,与大家分享关于 Core Web Vitals 的最新指标及每个指标的更新。
1546 0
使用 EF Power Tool Code Frist 生成 Mysql 实体
原文:使用 EF Power Tool Code Frist 生成 Mysql 实体 1,在要生成的项目上右键   2,   3,   4,   5,  生成后的效果     已知问题: 1,在Mysql数据表中 tinyint(1) ,会被映射成为 C# bool ,这样造成一些数据信息的丢失。
731 0
《C语言编程初学者指南》一1.6 使用指令
本节书摘来自华章出版社《C语言编程初学者指南》一书中的第1章,第1.6节,作者【美】Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 使用指令 下面再看看本章一开始给出的示例程序。
1260 0
oracle 数据库问题:“ORA-01922: 必须指定 CASCADE 以删除...“,原因及解决办法
oracle 数据库问题:“ORA-01922: 必须指定 CASCADE 以删除...“,原因及解决办法
49 0
【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
34 0
《OpenACC并行程序设计:性能优化实践指南》一 3.10 使用Score-P和Vampir记录OpenACC运行时事件
本节书摘来自华章出版社《OpenACC并行程序设计:性能优化实践指南》一 书中的第3章,第3.10节,作者:[美] 罗布·法伯(Rob Farber),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1266 0
+关注
580
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载