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

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

using ThoughtWorks.QRCode.Codec;
 
生成二维码图片:
/// <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页面调用和输出为图片流:

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),效果如下:

/// <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;
}

转自:http://www.lenashane.com/article/20151223-1097.html

 
 

【转】C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码的更多相关文章

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

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

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

    原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) 提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一 ...

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

    原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)  http://blog.csdn.net/johnsu ...

  4. qrcode.js插件将你的内容转换成二维码格式

    ---qrcode.js插件将你的内容转换成二维码格式--- 我之前一直想知道二维码是怎么生成,所以就了解了一下, 最后还是不知道它的原理, 但是,我知道怎么生成. 现在就让我带你制作一个你喜爱的二维 ...

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

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

  6. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  7. 使用CSS3中Canvas 实现两张图片合成一张图片【常用于合成二维码图片】

    CSS3 Canvas 实现两张图片合成一张图片 需求 需求:在项目中遇到将一张固定图片和一张二维码图片合成一张新图片,并且用户能够将图片保存下载到本地. 思路:使用 CSS3 中的 Canvas 将 ...

  8. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...

  9. Python3+qrcode+zxing生成和识别二维码教程

    一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错“Cou ...

随机推荐

  1. Centos下安装git高版本2.1.2

    安装依赖软件 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc # yum in ...

  2. VM三种网络连接方式

    bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和Linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力. 在此种模式下,虚拟机内部的 ...

  3. Python3基础 list 访问列表中的列表的元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. PHP开发者的路书

    初学者 作为初学者,通常情况下,我们都会买一本PHP教材,或者在网上看免费教程,这当然是学习的好途径.因为,这些书籍和网上的免费教程,基本上都是由浅入深的渐进式教学方式,基础知识居多,高级知识占少量的 ...

  5. luoguP2572 [SCOI2010]序列操作

    题目&&链接 反正数据都是一样的,luogu比较友好 luogu bzoj lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变 ...

  6. dp入门 专题记录 2017-7-26

    POJ3176-Cow Bowling 题目大意:现有n行数,以金字塔的形式排列,即第一行一个数字,第二行2个数字,依次类推,现在需要找一条从第一层到第n层的路线,使得该路线上的所有点的权值和最大 思 ...

  7. Chromosome coordinate systems: 0-based, 1-based

    From: https://arnaudceol.wordpress.com/2014/09/18/chromosome-coordinate-systems-0-based-1-based/ I’v ...

  8. hdoj上的一题和程序设计第二次作业的拓展-人见人爱a+b

    hdoj上一道有意思的题目,题目: 人见人爱a+b 敲的也蛮快的,大概十分钟左右就AC了.代码如下: 人见人爱a+b #include<stdio.h> int main() { int ...

  9. UVa 140 带宽

    题意:给出一个n个结点的图G和一个结点的排列,定义结点的带宽为i和相邻结点在排列中的最远距离,求出让带宽最小的结点排列. 思路:用STL的next_permutation来做确实是很方便,适当剪枝一下 ...

  10. c++ 返回指定元素连续相等的位置索引(equal_range)

    #include <iostream> // cout #include <algorithm> // equal_range, sort #include <vecto ...