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

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

using ThoughtWorks.QRCode.Codec;

生成二维码图片:

  1. /// <summary>
  2. /// 生成二维码
  3. /// </summary>
  4. /// <param name="Content">内容文本</param>
  5. /// <param name="QRCodeEncodeMode">二维码编码方式</param>
  6. /// <param name="QRCodeErrorCorrect">纠错码等级</param>
  7. /// <param name="QRCodeVersion">二维码版本号 0-40</param>
  8. /// <param name="QRCodeScale">每个小方格的预设宽度(像素),正整数</param>
  9. /// <param name="size">图片尺寸(像素),0表示不设置</param>
  10. /// <param name="border">图片白边(像素),当size大于0时有效</param>
  11. /// <returns></returns>
  12. public System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border)
  13. {
  14. QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
  15. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode;
  16. qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect;
  17. qrCodeEncoder.QRCodeScale = QRCodeScale;
  18. qrCodeEncoder.QRCodeVersion = QRCodeVersion;
  19. System.Drawing.Image image = qrCodeEncoder.Encode(Content);
  20.  
  21. #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框
  22. if (size > )
  23. {
  24. //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
  25. #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
  26. while (image.Width < size)
  27. {
  28. qrCodeEncoder.QRCodeScale++;
  29. System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
  30. if (imageNew.Width < size)
  31. {
  32. image = new System.Drawing.Bitmap(imageNew);
  33. imageNew.Dispose();
  34. imageNew = null;
  35. }
  36. else
  37. {
  38. qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
  39. imageNew.Dispose();
  40. imageNew = null;
  41. break;
  42. }
  43. }
  44. #endregion
  45.  
  46. //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
  47. #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
  48. while (image.Width > size && qrCodeEncoder.QRCodeScale > )
  49. {
  50. qrCodeEncoder.QRCodeScale--;
  51. System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
  52. image = new System.Drawing.Bitmap(imageNew);
  53. imageNew.Dispose();
  54. imageNew = null;
  55. if (image.Width < size)
  56. {
  57. break;
  58. }
  59. }
  60. #endregion
  61.  
  62. //如果目标尺寸大于生成的图片尺寸,则为图片增加白边
  63. #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边
  64. if (image.Width <= size)
  65. {
  66. //根据参数设置二维码图片白边的最小宽度
  67. #region 根据参数设置二维码图片白边的最小宽度
  68. if (border > )
  69. {
  70. while (image.Width <= size && size - image.Width < border * && qrCodeEncoder.QRCodeScale > )
  71. {
  72. qrCodeEncoder.QRCodeScale--;
  73. System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
  74. image = new System.Drawing.Bitmap(imageNew);
  75. imageNew.Dispose();
  76. imageNew = null;
  77. }
  78. }
  79. #endregion
  80.  
  81. //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
  82. if (image.Width < size)
  83. {
  84. //新建空白绘图
  85. System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size);
  86. System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
  87. int p_left = ;
  88. int p_top = ;
  89. if (image.Width <= size) //如果原图比目标形状宽
  90. {
  91. p_left = (size - image.Width) / ;
  92. }
  93. if (image.Height <= size)
  94. {
  95. p_top = (size - image.Height) / ;
  96. }
  97.  
  98. //将生成的二维码图像粘贴至绘图的中心位置
  99. graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
  100. image = new System.Drawing.Bitmap(panel);
  101. panel.Dispose();
  102. panel = null;
  103. graphic0.Dispose();
  104. graphic0 = null;
  105. }
  106. }
  107. #endregion
  108. }
  109. #endregion
  110. return image;
  111. }
  112.  
  113. private static bool IsTrue() // 在Image类别对图片进行缩放的时候,需要一个返回bool类别的委托
  114. {
  115. return true;
  116. }

在aspx页面调用和输出为图片流:

  1. string content = string.IsNullOrEmpty(Request.QueryString["txt"]) ? "http://www.lenashane.com/" : Request.QueryString["txt"];
  2. int size = Convert.ToInt32(string.IsNullOrEmpty(Request.QueryString["size"]) ? "" : Request.QueryString["size"]);
  3. int border = Convert.ToInt32(string.IsNullOrEmpty(Request.QueryString["border"]) ? "" : Request.QueryString["border"]);
  4.  
  5. System.Drawing.Image image = CreateQRCode(content,
  6. QRCodeEncoder.ENCODE_MODE.BYTE,
  7. QRCodeEncoder.ERROR_CORRECTION.M,
  8. ,
  9. ,
  10. size,
  11. border);
  12.  
  13. //将图片输出到页面
  14. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  15. image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  16. HttpContext.Current.Response.ClearContent();
  17. HttpContext.Current.Response.ContentType = "image/Png";
  18. HttpContext.Current.Response.OutputStream.Write(ms.ToArray(), , ms.ToArray().Length);
  19. HttpContext.Current.Response.End();
  20.  
  21. ms.Close();
  22. ms = null;
  23. image.Dispose();
  24. image = null;

更新:

生成二维码方法,增加定位点着色参数(System.Drawing.Color),效果如下:

如有效率更高的绘制方法还望指教,下面是代码

  1. /// <summary>
  2. /// 生成二维码
  3. /// </summary>
  4. /// <param name="Content">内容文本</param>
  5. /// <param name="QRCodeEncodeMode">二维码编码方式</param>
  6. /// <param name="QRCodeErrorCorrect">纠错码等级</param>
  7. /// <param name="QRCodeVersion">二维码版本号 0-40</param>
  8. /// <param name="QRCodeScale">每个小方格的预设宽度(像素),正整数</param>
  9. /// <param name="size">图片尺寸(像素),0表示不设置</param>
  10. /// <param name="border">图片白边(像素),当size大于0时有效</param>
  11. /// <returns></returns>
  12. 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)
  13. {
  14. QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
  15. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode;
  16. qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect;
  17. qrCodeEncoder.QRCodeScale = QRCodeScale;
  18. qrCodeEncoder.QRCodeVersion = QRCodeVersion;
  19.  
  20. System.Drawing.Image image = qrCodeEncoder.Encode(Content);
  21.  
  22. #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框
  23. if (size > )
  24. {
  25. //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
  26. #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
  27. while (image.Width < size)
  28. {
  29. qrCodeEncoder.QRCodeScale++;
  30. System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
  31. if (imageNew.Width < size)
  32. {
  33. image = new System.Drawing.Bitmap(imageNew);
  34. imageNew.Dispose();
  35. imageNew = null;
  36. }
  37. else
  38. {
  39. qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
  40. imageNew.Dispose();
  41. imageNew = null;
  42. break;
  43. }
  44. }
  45. #endregion
  46.  
  47. //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
  48. #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
  49. while (image.Width > size && qrCodeEncoder.QRCodeScale > )
  50. {
  51. qrCodeEncoder.QRCodeScale--;
  52. System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
  53. image = new System.Drawing.Bitmap(imageNew);
  54. imageNew.Dispose();
  55. imageNew = null;
  56. if (image.Width < size)
  57. {
  58. break;
  59. }
  60. }
  61. #endregion
  62.  
  63. //根据参数设置二维码图片白边的最小宽度(按需缩小)
  64. #region 根据参数设置二维码图片白边的最小宽度
  65. if (image.Width <= size && border > )
  66. {
  67. while (image.Width <= size && size - image.Width < border * && qrCodeEncoder.QRCodeScale > )
  68. {
  69. qrCodeEncoder.QRCodeScale--;
  70. System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content);
  71. image = new System.Drawing.Bitmap(imageNew);
  72. imageNew.Dispose();
  73. imageNew = null;
  74. }
  75. }
  76. #endregion
  77.  
  78. //已经确认二维码图像,为图像染色修饰
  79. if (true)
  80. {
  81. //定位点方块边长
  82. int beSize = qrCodeEncoder.QRCodeScale * ;
  83.  
  84. int bep1_l = qrCodeEncoder.QRCodeScale * ;
  85. int bep1_t = qrCodeEncoder.QRCodeScale * ;
  86.  
  87. int bep2_l = image.Width - qrCodeEncoder.QRCodeScale * - ;
  88. int bep2_t = qrCodeEncoder.QRCodeScale * ;
  89.  
  90. int bep3_l = qrCodeEncoder.QRCodeScale * ;
  91. int bep3_t = image.Height - qrCodeEncoder.QRCodeScale * - ;
  92.  
  93. int bep4_l = image.Width - qrCodeEncoder.QRCodeScale * - ;
  94. int bep4_t = image.Height - qrCodeEncoder.QRCodeScale * - ;
  95.  
  96. System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(image);
  97.  
  98. // Create solid brush.
  99. SolidBrush blueBrush = new SolidBrush(codeEyeColor);
  100.  
  101. // Fill rectangle to screen.
  102. graphic0.FillRectangle(blueBrush, bep1_l, bep1_t, beSize, beSize);
  103. graphic0.FillRectangle(blueBrush, bep2_l, bep2_t, beSize, beSize);
  104. graphic0.FillRectangle(blueBrush, bep3_l, bep3_t, beSize, beSize);
  105. graphic0.FillRectangle(blueBrush, bep4_l, bep4_t, qrCodeEncoder.QRCodeScale, qrCodeEncoder.QRCodeScale);
  106. }
  107.  
  108. //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
  109. #region 如果目标尺寸大于生成的图片尺寸,将二维码绘制在目标尺寸白色画布的中心位置
  110. if (image.Width < size)
  111. {
  112. //新建空白绘图
  113. System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size);
  114. System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
  115. int p_left = ;
  116. int p_top = ;
  117. if (image.Width <= size) //如果原图比目标形状宽
  118. {
  119. p_left = (size - image.Width) / ;
  120. }
  121. if (image.Height <= size)
  122. {
  123. p_top = (size - image.Height) / ;
  124. }
  125.  
  126. //将生成的二维码图像粘贴至绘图的中心位置
  127. graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
  128. image = new System.Drawing.Bitmap(panel);
  129. panel.Dispose();
  130. panel = null;
  131. graphic0.Dispose();
  132. graphic0 = null;
  133. }
  134. #endregion
  135. }
  136. #endregion
  137. return image;
  138. }

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

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

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

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

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

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

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

  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. v-show 与 v-if区别

    关于条件渲染 所谓条件渲染,就是根据不同的条件,使用不同的模板来生成 html. 在 Vue.js 中,使用 v-if 和 v-show 指令来控制条件渲染. 区别 v-show 会在app初始化的时 ...

  2. hadoop 管理命令dfsadmin

    hadoop 管理命令dfsadmin dfsadmin 命令用于管理HDFS集群,这些命令常用于管理员. 1. (Safemode)安全模式 动作 命令 把集群切换到安全模式 bin/hdfs df ...

  3. NFS配置与搭建

    参考: Linux下NFS服务器的搭建与配置 https://www.cnblogs.com/liuyisai/p/5992511.html http://blog.51cto.com/hongten ...

  4. How to enable AHCI on Windows7

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci

  5. 14.statefulset服务

    有状态的控制器有以下几个特点 稳定,独特的网络标识符. 稳定,持久的存储. 有序,优雅的部署和扩展. 有序的自动滚动更新. 使用限制 StatefulSet是1.9之前的beta资源,在1.5之前的任 ...

  6. HDU 1074 Doing Homework(经典状压dp)

    题目链接  Doing Homework        Ignatius has just come back school from the 30th ACM/ICPC. Now he has a ...

  7. js判断一个元素是否在数组中

    js判断一个元素是否在数组中 var arr = ['a','s','d','f']; console.info(isInArray(arr,'a'));//循环的方式 function isInAr ...

  8. HTML中的元素定位

    static默认 relative相对定位 absolute绝对定位 mix relative and absolute混合相对定位和绝对定位 fixed固定定位 float浮动 reference ...

  9. Codeforces Round #446 Div. 1

    B:即使看到n<=22也应该猜到这只是为了写spj.将每个数替换为恰好比他大的数即可,最大值替换为最小值.这样原序列中不包含最小值的集合显然都满足条件,并且容易发现包含最小值的集合的变化量都是最 ...

  10. this view is not constrainted......

    this view is not constrainted 解决方案: <EditText android:id="@+id/editText" android:layout ...