【转】C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 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 生成指定尺寸和边框宽度的二维码的更多相关文章
- C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
- QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)
原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) 提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一 ...
- QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)
原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) http://blog.csdn.net/johnsu ...
- qrcode.js插件将你的内容转换成二维码格式
---qrcode.js插件将你的内容转换成二维码格式--- 我之前一直想知道二维码是怎么生成,所以就了解了一下, 最后还是不知道它的原理, 但是,我知道怎么生成. 现在就让我带你制作一个你喜爱的二维 ...
- java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- 使用CSS3中Canvas 实现两张图片合成一张图片【常用于合成二维码图片】
CSS3 Canvas 实现两张图片合成一张图片 需求 需求:在项目中遇到将一张固定图片和一张二维码图片合成一张新图片,并且用户能够将图片保存下载到本地. 思路:使用 CSS3 中的 Canvas 将 ...
- QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...
- Python3+qrcode+zxing生成和识别二维码教程
一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错“Cou ...
随机推荐
- centos 安装 ffmpeg
使用yum方式安装ffmpeg: 先安装Nux Dextop仓库: Nux Dextop库依赖于EPEL库,所有要先安装EPEL库(需要管理员权限). 如果安装过则跳过. $ su root $ yu ...
- BZOJ 2141 排队(树状数组套treap)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2141 题意:给出一个数列A,每次交换两个数的位置.输出交换后逆序对的个数. 思路:首先, ...
- ADT Bundle下载和安装
下载官方adt集成包(即ADT Bundle)并安装. Android官方已经推出adt集成包,包含了eclipse.sdk和SDK Manager,只需解压出来,然后就能运行Eclipse. 官方集 ...
- PyCharm/IDEA 使用技巧总结
基本概念 IDEA 没有类似 Eclipse 的工作空间的概念(workspace),最大单元就是 Project.这里可以把 Project 理解为 Eclipse 中的 workspace.Mod ...
- linux下安装微信小程序开发工具
一.环境:: ubuntu 16.04 二.安装过程: 2.1 安装wine sudo apt-get install wine 2.2 安装nwjs-sdk 2.2.1 下载linux版nwjs-s ...
- [Linux] - Linux安装JDK
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html <官方JDK下载 之后 ...
- Java-master(github)教材整理
helloworld class HelloWorld { public static void main(String[] args) { System.out.println("hell ...
- 每个成长者,必须学会可以练习 (来自ProcessOn流程图工具作者底部)
- 环境变量.JAVA_HOME
1.资料:(我的文章) http://www.cnblogs.com/cppskill/p/8341263.html 2. 2.1.界面 2.2.代码 unit formMain; interface ...
- [ios][map]自定义地图标注
参考:http://blog.csdn.net/mad1989/article/details/8794762 ios 一步一步学会自定义地图吹出框(CalloutView)-->(百度地图,高 ...