博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
阅读量:5282 次
发布时间:2019-06-14

本文共 8888 字,大约阅读时间需要 29 分钟。

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

 

 

转载于:https://www.cnblogs.com/soundcode/p/7458375.html

你可能感兴趣的文章
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
0925 韩顺平java视频
查看>>
iOS-程序启动原理和UIApplication
查看>>
mysql 8.0 zip包安装
查看>>
awk 统计
查看>>
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>