现在需要创建一个场景二维码,除了基础的微信接口创建外,需要加上小logo,思路如下:

1、 首先根据微信的开发文档创建二维码,获取二维码的url,没啥可说的,按照文档来就好了

 获取到的二维码就是这么素净~

 

2、得到了下载地址,我们就已文件流的方式,将二维码的流,转换为图像对象,并将指定的图片转换为图像对象(注意:地址必须是绝对路径         

      /// <summary>        
      /// 下载二维码图片 /// </summary> /// <param name="dirName">文件路径</param> /// <param name="fileName">文件名</param> /// <param name="downloadUrl">下载地址</param> /// <param name="url">最终图片存放地址</param> /// <returns></returns> private string LoadImg(string dirName,string fileName,string downloadUrl, out string url) { //设置文件保存的地址,格式,文件夹的判断和创建 string urlPath =CreateUrl(dirName,fileName, out url);// out 文件路径 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(downloadUrl); req.Method = "GET"; using (WebResponse wr = req.GetResponse()) { HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse(); string strpath = myResponse.ResponseUri.ToString(); WebClient mywebclient = new WebClient();             //开始了             //素净的二维码 byte[] bytelist = mywebclient.DownloadData(strpath); MemoryStream ms1 = new MemoryStream(bytelist); Bitmap b1 = (Bitmap)Image.FromStream(ms1); ms1.Close();             //logo图片 Bitmap b2 = new Bitmap(AppDomain.CurrentDomain.BaseDirectory + @"logo\logo3.png");             //合并 var ret = new ImageUtility().MergeQrImg(b1, b2, 1); Image img = ret; img.Save(AppDomain.CurrentDomain.BaseDirectory + urlPath); string path = urlPath;             //返回最终路径 return path; } }

 

这个是合并图片使用到的帮助类,自己领悟

logo大小的调整、边框颜色的调整在帮助类中可以自行设置。

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

 
最后生成的图片类似这样:

 

微信开发文档:https://mp.weixin.qq.com/wiki