带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码。

生成的二维码效果如下:

下面直接贴出二维码生成类   QRCodeHelper.cs  ,直接调用  CreateQRCodeWithLogo 方法,传入相应参数返回bitmap类型的数据,直接将返回的数据绑定到图片控件,如果是web可以先将图片保存到服务器指定地址在获取显示

  1. /// <summary>
  2. /// 生成带logo二维码
  3. /// </summary>
  4. public class QRCodeHelper
  5. {/// <summary>
  6. /// 创建二维码
  7. /// </summary>
  8. /// <param name="content"></param>
  9. /// <param name="size"></param>
  10. /// <returns></returns>
  11. public static Bitmap Create(string content)
  12. {
  13. try
  14. {
  15. //var options = new QrCodeEncodingOptions
  16. //{
  17. // DisableECI = true,
  18. // CharacterSet = "UTF-8",
  19. // Width = size,
  20. // Height = size,
  21. // Margin = 0,
  22. // ErrorCorrection = ErrorCorrectionLevel.H
  23.  
  24. //};
  25. //var writer = new BarcodeWriter();
  26. //writer.Format = BarcodeFormat.QR_CODE;
  27. //writer.Options = options;
  28. //var bmp = writer.Write(content);
  29. //return bmp;
  30.  
  31. QRCodeEncoder qRCodeEncoder = new QRCodeEncoder();
  32. qRCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//设置二维码编码格式 
  33. qRCodeEncoder.QRCodeScale = ;//设置编码测量度             
  34. qRCodeEncoder.QRCodeVersion = ;//设置编码版本   
  35. qRCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//设置错误校验 
  36.  
  37. Bitmap image = qRCodeEncoder.Encode(content);
  38. return image;
  39. }
  40. catch (Exception ex)
  41. {
  42. return null;
  43. }
  44. }
  45.  
  46. /// <summary>
  47. /// 获取本地图片
  48. /// </summary>
  49. /// <param name="fileName"></param>
  50. /// <returns></returns>
  51. private static Bitmap GetLocalLog(string fileName)
  52. {
  53. Bitmap newBmp = new Bitmap(fileName);
  54. //Bitmap bmp = new Bitmap(newBmp);
  55. return newBmp;
  56. }
  57. /// <summary>
  58. /// 生成带logo二维码
  59. /// </summary>
  60. /// <returns></returns>
  61. public static Bitmap CreateQRCodeWithLogo(string content, string logopath)
  62. {
  63. //生成二维码
  64. Bitmap qrcode = Create(content);
  65.  
  66. //生成logo
  67. Bitmap logo = GetLocalLog(logopath);
  68. ImageUtility util = new ImageUtility();
  69. Bitmap finalImage = util.MergeQrImg(qrcode, logo);
  70. return finalImage;
  71. }
  72. }

下面是从网上找的图片处理类   ImageUtility.cs

  1. public class ImageUtility
  2. {
  3. #region 合并用户QR图片和用户头像
  4.  
  5. /// <summary>
  6. /// 合并用户QR图片和用户头像
  7. /// </summary>
  8. /// <param name="qrImg">QR图片</param>
  9. /// <param name="headerImg">用户头像</param>
  10. /// <param name="n"></param>
  11. /// <returns></returns>
  12. public Bitmap MergeQrImg(Bitmap qrImg, Bitmap headerImg, double n = 0.23)
  13. {
  14. int margin = ;
  15. float dpix = qrImg.HorizontalResolution;
  16. float dpiy = qrImg.VerticalResolution;
  17. var _newWidth = ( * qrImg.Width - * margin) * 1.0f / ;
  18. var _headerImg = ZoomPic(headerImg, _newWidth / headerImg.Width);
  19. //处理头像
  20. int newImgWidth = _headerImg.Width + margin;
  21. Bitmap headerBgImg = new Bitmap(newImgWidth, newImgWidth);
  22. headerBgImg.MakeTransparent();
  23. Graphics g = Graphics.FromImage(headerBgImg);
  24. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  25. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  26. g.Clear(Color.Transparent);
  27. Pen p = new Pen(new SolidBrush(Color.White));
  28. Rectangle rect = new Rectangle(, , newImgWidth - , newImgWidth - );
  29. using (GraphicsPath path = CreateRoundedRectanglePath(rect, ))
  30. {
  31. g.DrawPath(p, path);
  32. g.FillPath(new SolidBrush(Color.White), path);
  33. }
  34. //画头像
  35. Bitmap img1 = new Bitmap(_headerImg.Width, _headerImg.Width);
  36. Graphics g1 = Graphics.FromImage(img1);
  37. g1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  38. g1.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  39. g1.Clear(Color.Transparent);
  40. Pen p1 = new Pen(new SolidBrush(Color.Gray));
  41. Rectangle rect1 = new Rectangle(, , _headerImg.Width - , _headerImg.Width - );
  42. using (GraphicsPath path1 = CreateRoundedRectanglePath(rect1, ))
  43. {
  44. g1.DrawPath(p1, path1);
  45. TextureBrush brush = new TextureBrush(_headerImg);
  46. g1.FillPath(brush, path1);
  47. }
  48. g1.Dispose();
  49. PointF center = new PointF((newImgWidth - _headerImg.Width) / , (newImgWidth - _headerImg.Height) / );
  50. g.DrawImage(img1, center.X, center.Y, _headerImg.Width, _headerImg.Height);
  51. g.Dispose();
  52. Bitmap backgroudImg = new Bitmap(qrImg.Width, qrImg.Height);
  53. backgroudImg.MakeTransparent();
  54. backgroudImg.SetResolution(dpix, dpiy);
  55. headerBgImg.SetResolution(dpix, dpiy);
  56. Graphics g2 = Graphics.FromImage(backgroudImg);
  57. g2.Clear(Color.Transparent);
  58. g2.DrawImage(qrImg, , );
  59. PointF center2 = new PointF((qrImg.Width - headerBgImg.Width) / , (qrImg.Height - headerBgImg.Height) / );
  60. g2.DrawImage(headerBgImg, center2);
  61. g2.Dispose();
  62. return backgroudImg;
  63. }
  64. #endregion
  65.  
  66. #region 图形处理
  67. /// <summary>
  68. /// 创建圆角矩形
  69. /// </summary>
  70. /// <param name="rect">区域</param>
  71. /// <param name="cornerRadius">圆角角度</param>
  72. /// <returns></returns>
  73. private GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int cornerRadius)
  74. {
  75. //下午重新整理下,圆角矩形
  76. GraphicsPath roundedRect = new GraphicsPath();
  77. roundedRect.AddArc(rect.X, rect.Y, cornerRadius * , cornerRadius * , , );
  78. roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * , rect.Y);
  79. roundedRect.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y, cornerRadius * , cornerRadius * , , );
  80. roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * , rect.Right, rect.Y + rect.Height - cornerRadius * );
  81. roundedRect.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y + rect.Height - cornerRadius * , cornerRadius * , cornerRadius * , , );
  82. roundedRect.AddLine(rect.Right - cornerRadius * , rect.Bottom, rect.X + cornerRadius * , rect.Bottom);
  83. roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * , cornerRadius * , cornerRadius * , , );
  84. roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * , rect.X, rect.Y + cornerRadius * );
  85. roundedRect.CloseFigure();
  86. return roundedRect;
  87. }
  88. /// <summary>
  89. /// 图片按比例缩放
  90. /// </summary>
  91. private Image ZoomPic(Image initImage, double n)
  92. {
  93. //缩略图宽、高计算
  94. double newWidth = initImage.Width;
  95. double newHeight = initImage.Height;
  96. newWidth = n * initImage.Width;
  97. newHeight = n * initImage.Height;
  98. //生成新图
  99. //新建一个bmp图片
  100. System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
  101. //新建一个画板
  102. System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
  103. //设置质量
  104. newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  105. newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  106. //置背景色
  107. newG.Clear(Color.Transparent);
  108. //画图
  109. newG.DrawImage(initImage, new System.Drawing.Rectangle(, , newImage.Width, newImage.Height), new System.Drawing.Rectangle(, , initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
  110. newG.Dispose();
  111. return newImage;
  112. }
  113.  
  114. /// <summary>
  115. /// 创建缩略图
  116. /// </summary>
  117. /// <param name="b"></param>
  118. /// <param name="destHeight"></param>
  119. /// <param name="destWidth"></param>
  120. /// <returns></returns>
  121. public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth)
  122. {
  123. System.Drawing.Image imgSource = b;
  124. System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;
  125. int sW = , sH = ;
  126. // 按比例缩放
  127. int sWidth = imgSource.Width;
  128. int sHeight = imgSource.Height;
  129. if (sHeight > destHeight || sWidth > destWidth)
  130. {
  131. if ((sWidth * destHeight) > (sHeight * destWidth))
  132. {
  133. sW = destWidth;
  134. sH = (destWidth * sHeight) / sWidth;
  135. }
  136. else
  137. {
  138. sH = destHeight;
  139. sW = (sWidth * destHeight) / sHeight;
  140. }
  141. }
  142. else
  143. {
  144. sW = sWidth;
  145. sH = sHeight;
  146. }
  147. Bitmap outBmp = new Bitmap(destWidth, destHeight);
  148. Graphics g = Graphics.FromImage(outBmp);
  149. g.Clear(Color.Transparent);
  150. // 设置画布的描绘质量
  151. g.CompositingQuality = CompositingQuality.HighQuality;
  152. g.SmoothingMode = SmoothingMode.HighQuality;
  153. g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  154. g.DrawImage(imgSource, new Rectangle((destWidth - sW) / , (destHeight - sH) / , sW, sH), , , imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);
  155. g.Dispose();
  156. // 以下代码为保存图片时,设置压缩质量
  157. EncoderParameters encoderParams = new EncoderParameters();
  158. long[] quality = new long[];
  159. quality[] = ;
  160. EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
  161. encoderParams.Param[] = encoderParam;
  162. imgSource.Dispose();
  163. return outBmp;
  164. }
  165. #endregion
  166. }

C#生成带logo的二维码的更多相关文章

  1. .NET生成带Logo的二维码

    使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...

  2. C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)

    1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...

  3. 涛哥的Python脚本工具箱之生成带Logo的二维码

    近期须要在二维码上加Logo,网上没有找到好用的,于是自己用python写了一个. 须要安装qrcode,PIL库 二维码简称 QR Code(Quick Response Code),学名为高速响应 ...

  4. phpqrcode生成带logo的二维码图片及带文字的二维码图片

    <?php require_once "./phpqrcode/phpqrcode.php"; /** * 这样就可以生成二维码了,实际上在png这个方法里还有几个参数需要使 ...

  5. PHP生成带logo图像二维码的两种方法

    本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...

  6. jQuery-qrcode.js 生成带Logo 的二维码

    引入文件  jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...

  7. JAVA生成带Logo的二维码

    1.下载生成二维码所需要的jar包qrcode.jar: 2.直接上生成二维码的java代码 //需要导入的包 import java.awt.Color;import java.awt.Graphi ...

  8. 微信支付生成带logo的二维码

    利用到一个qrcode类 比较简洁 原作者没有加入二维码嵌入logo的功能 在这里我进行了小小的修改 可以实现生成微信支付二维码时打上logo 生成png格式的利用到该类中的png方法(我已经改好了) ...

  9. js生成带logo的二维码

    作为一名java程序员,一直以来都是使用服务端生成二维码,最近接触前端的设计,感觉二维码这块如果放到前端去生成,一方面可以减轻服务端的压力,访问带宽,另一方面,前端页面控制比较顺畅 闲话少叙,说下我的 ...

随机推荐

  1. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  2. Angular企业级开发(1)-AngularJS简介

    AngularJS介绍 AngularJS是一个功能完善的JavaScript前端框架,同时是基于MVC(Model-View-Controller理念的框架,使用它能够高效的开发桌面web app和 ...

  3. 初探Vue

    Vue.js(读音/vju:/,类似于view),是近来比较火的前端框架,但一直没有怎么具体了解.实现过,就知道个啥的MVVM啦,数据驱动啦,等这些关于Vue的虚概念. 由于最近,小生在公司中,负责开 ...

  4. 使用ubuntu作为web开发环境的一些感受

    从ms-dos,win95,win98,winMe,winXp,vista,win7,win10我都有使用的经历,我使用时间最长的应属winxp,其次是win7,说实话,我觉得这两个系统是微软做的最好 ...

  5. $ORACLE_HOME变量值末尾多“/”惹的祸

    之前一直误以为$ORACLE_HOME变量的路径中末尾多写一个"/"不会有影响. 今天做实验时碰到一个情景,发现并不是这样. 环境:OEL 5.7 + Oracle 10.2.0. ...

  6. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...

  7. Android 工具-adb

    Android 工具-adb 版权声明:本文为博主原创文章,未经博主允许不得转载. Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的. Android D ...

  8. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  9. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  10. Mac-OSX的Python3.5虚拟环境下安装Opencv

    Mac-OSX的Python3.5虚拟环境下安装Opencv 1   关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2   概述 本文是一篇 环境搭建 的基础 ...