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,如需转载请自行联系原作者
相关文章
|
6月前
|
开发框架 小程序 .NET
C#动态生成带参数的小程序二维码
C#动态生成带参数的小程序二维码
C#创建无边框可拖动窗口
C#创建无边框可拖动窗口
199 0
|
程序员 C# 图形学
C# 生成二维码,彩色二维码,带有Logo的二维码及普通条形码
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心!    废话少说,咱直接进入正题:    目前来说,比较流行的二维码生成方式有两种:一种是:QrCode.Net和谷歌的Zxing.Net,我个人比较倾向于使用ZXing.Net,今天本篇博客主要讲解Zxing.Net的使用。
1975 0
|
C#
C# 实现生成带二维码的专属微信公众号推广海报
原文:C# 实现生成带二维码的专属微信公众号推广海报 很多微信公众号中需要生成推广海报的功能,粉丝获得专属海报后可以分享到朋友圈或发给朋友,为公众号代言邀请好友即可获取奖励的。海报自带渠道二维码,粉丝长按二维码即可关注微信公众号,从而达到吸粉的目的。
2359 0
|
C# Windows
C#(WPF)为Grid添加实线边框。
原文:C#(WPF)为Grid添加实线边框。 相信大家在做WPF项目的时候,都会用到Grid这个布局控件,一般情况下,如果只是为了布局,那就不需要显示它的边框,但是也有特殊需求,如果把它当做表格来使用,那就需要为它添加实线边框。
2374 0
|
C#
C#彩色艺术化二维码样式设计(仅说思路)
原文:C#彩色艺术化二维码样式设计(仅说思路) 仅讲思路,想要源码的请绕道。   一、样式 1、先看各种二维码的样式吧: (1)最简单的样式——黑白样式,如下图: 图1  最平常见到的二维码样式(如果你用智能手机,且已安装二维码扫描软件,扫描之后你会发现它就是一个网址:http://www.lgms.net) (2)以下为在基本样式的基础上进行的改进: 图2  圆形点状样式(为了保持可识别性,三个定位方块图没有圆形点状化)。
1603 0
|
Shell C# 图形学
C#生成带logo的二维码
原文:C#生成带logo的二维码 带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码。 生成的二维码效果如下: 下面直接贴出二维码生成类   QRCodeHelper.
1242 0
|
C# 索引
C# 利用QRCode生成二维码图片
网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快。但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴。这是本要用它做了一个项目后,简单的整理了一下。
1367 0