C# 模仿微信生成九宫图头像
2017-09-26 11:55
483 查看
/// <summary> /// 算出图片坐标 /// </summary> /// <param name="size">合成数量</param> /// <returns></returns> public static string[] GetXy(int size) { string[] s = new string[size]; int _x = 0; int _y = 0; switch (size) { case 1: _x = _y = 6; s[0] = "6,6"; break; case 2: _x = _y = 4; s[0] = "4," + (132 / 2 - 60 / 2); s[1] = 60 + 2 * _x + "," + (132 / 2 - 60 / 2); break; case 3: _x = _y = 4; s[0] = (132 / 2 - 60 / 2) + "," + _y; s[1] = _x + "," + (60 + 2 * _y); s[2] = (60 + 2 * _y) + "," + (60 + 2 * _y); break; case 4: _x = _y = 4; s[0] = _x + "," + _y; s[1] = (_x * 2 + 60) + "," + _y; s[2] = _x + "," + (60 + 2 * _y); s[3] = (60 + 2 * _y) + "," + (60 + 2 * _y); break; case 5: _x = _y = 3; s[0] = (132 - 40 * 2 - _x) / 2 + "," + (132 - 40 * 2 - _y) / 2; s[1] = ((132 - 40 * 2 - _x) / 2 + 40 + _x) + "," + (132 - 40 * 2 - _y) / 2; s[2] = _x + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y); s[3] = (_x * 2 + 40) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y); s[4] = (_x * 3 + 40 * 2) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y); break; case 6: _x = _y = 3; s[0] = _x + "," + ((132 - 40 * 2 - _x) / 2); s[1] = (_x * 2 + 40) + "," + ((132 - 40 * 2 - _x) / 2); s[2] = (_x * 3 + 40 * 2) + "," + ((132 - 40 * 2 - _x) / 2); s[3] = _x + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y); s[4] = (_x * 2 + 40) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y); s[5] = (_x * 3 + 40 * 2) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y); break; case 7: _x = _y = 3; s[0] = (132 - 40) / 2 + "," + _y; s[1] = _x + "," + (_y * 2 + 40); s[2] = (_x * 2 + 40) + "," + (_y * 2 + 40); s[3] = (_x * 3 + 40 * 2) + "," + (_y * 2 + 40); s[4] = _x + "," + (_y * 3 + 40 * 2); s[5] = (_x * 2 + 40) + "," + (_y * 3 + 40 * 2); s[6] = (_x * 3 + 40 * 2) + "," + (_y * 3 + 40 * 2); break; case 8: _x = _y = 3; s[0] = (132 - 80 - _x) / 2 + "," + _y; s[1] = ((132 - 80 - _x) / 2 + _x + 40) + "," + _y; s[2] = _x + "," + (_y * 2 + 40); s[3] = (_x * 2 + 40) + "," + (_y * 2 + 40); s[4] = (_x * 3 + 40 * 2) + "," + (_y * 2 + 40); s[5] = _x + "," + (_y * 3 + 40 * 2); s[6] = (_x * 2 + 40) + "," + (_y * 3 + 40 * 2); s[7] = (_x * 3 + 40 * 2) + "," + (_y * 3 + 40 * 2); break; case 9: _y = 3; s[0] = _x + "," + _y; s[1] = _x * 2 + 40 + "," + _y; s[2] = _x * 3 + 40 * 2 + "," + _y; s[3] = _x + "," + (_y * 2 + 40); s[4] = (_x * 2 + 40) + "," + (_y * 2 + 40); s[5] = (_x * 3 + 40 * 2) + "," + (_y * 2 + 40); s[6] = _x + "," + (_y * 3 + 40 * 2); s[7] = (_x * 2 + 40) + "," + (_y * 3 + 40 * 2); s[8] = (_x * 3 + 40 * 2) + "," + (_y * 3 + 40 * 2); break; } return s; }
/// <summary> /// 图片宽度 /// </summary> /// <param name="size">合成数量</param> /// <returns></returns> public static float GetWidth(int size) { int width = 0; if (size == 1) { width = 120; } if (size > 1 && size <= 4) { width = 60; } if (size >= 5) { width = 40; } return width; }
/// <summary> /// 把要合成的单张图片进行压缩 /// </summary> /// <param name="bitmap">Bitmap</param> /// <param name="width">宽</param> /// <param name="height">高</param> /// <returns></returns> private Bitmap UserPir(Bitmap bitmap, int width, int height) { using (var bmp = new System.Drawing.Bitmap(width, height)) { //从Bitmap创建一个System.Drawing.Graphics对象,用来绘制高质量的缩小图。 using (var gr = System.Drawing.Graphics.FromImage(bmp)) { //设置 System.Drawing.Graphics对象的SmoothingMode属性为HighQuality gr.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality; //下面这个也设成高质量 gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //下面这个设成High gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //把原始图像绘制成上面所设置宽高的截取图 var rectDestination = new System.Drawing.Rectangle(0, 0, width, height); gr.DrawImage(bitmap, 0, 0, rectDestination, System.Drawing.GraphicsUnit.Pixel); //保存截取的图片 return bitmap; } } }
/// <summary> /// 合成头像 /// </summary> /// <param name="imgPathList">图片路径集合</param> /// <param name="oldPath">原路径生成</param> /// <returns></returns> public string GroupPir(List<string> imgPathList, string oldPath = "") { //绘制坐标 string[] arr = JiuGongDiagram.GetXy(imgPathList.Count); //图片尺寸 var wh = JiuGongDiagram.GetWidth(imgPathList.Count); using (Bitmap backgroudImg = new Bitmap(132, 132)) { using (Graphics g = Graphics.FromImage(backgroudImg)) { //设置 System.Drawing.Graphics对象的SmoothingMode属性为HighQuality g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //下面这个也设成高质量 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //下面这个设成High g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //清除画布,背景设置为灰色 g.Clear(System.Drawing.Color.Gainsboro); var flag = 0; MemoryStream ms; imgPathList.ForEach(m => { Bitmap bitmap; if (string.IsNullOrEmpty(m)) { bitmap = new Bitmap(HttpContext.Current.Server.MapPath(WebConfig.GroupUserPir)); } else { byte[] bytes = DownloadUserPir($"{WebConfig.FtpViewPath}{m}"); if (bytes.Length > 0) { ms = new MemoryStream(bytes); bitmap = new Bitmap(ms); ms.Close(); } else { bitmap = new Bitmap(HttpContext.Current.Server.MapPath(WebConfig.GroupUserPir)); } } string[] xy = arr[flag].Split(','); g.DrawImage(UserPir(bitmap, int.Parse(xy[0]), int.Parse(xy[1])), int.Parse(xy[0]), int.Parse(xy[1]), wh, wh); flag++; }); g.Dispose(); ms = new MemoryStream(); backgroudImg.Save(ms, System.Drawing.Imaging.ImageFormat.Png); if (string.IsNullOrEmpty(oldPath)) { //文件保存目录路径 string dirPath = "/Group/GroupPir/" + DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo); //文件名称 string fileName = $"{Utils.GetGuid(false).ToLower()}.png"; //保存的文件路径 var savePath = dirPath + "/" + fileName; return FTPUploadFiles.UploadMemoryStream(ms, dirPath, savePath); } return FTPUploadFiles.UploadMemoryStream(ms, oldPath) ? oldPath : string.Empty; } } }
/// <summary> /// 下载图片 /// </summary> /// <param name="path">路径</param> /// <returns></returns> private byte[] DownloadUserPir(string path) { byte[] bt; try { using (WebClient webClient = new WebClient()) { bt = webClient.DownloadData(path); } } catch (Exception e) { bt = new byte[0]; } return bt; }
相关文章推荐
- c# 仿微信二维码生成二维码中间显示头像
- 自定义PopWindow模仿微信拍照上传头像
- 微信生成公众号带参数二维码加上用户头像(二)
- ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
- C#微信开发之旅(十):APP预支付及支付参数生成(V2)
- 微信生成公众号带参数二维码用户头像 加上文字生成图片(三)
- c# 微信生成带参数的二维码
- C# 微信生成二维码
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
- c# 生成微信公众帐号带参数二维码类
- 前端纯js模仿微信头像的裁剪(图片裁剪)
- 模仿微信更改头像,图片局部放大
- c# 仿微信二维码生成
- c# 微信生成带参数的二维码
- Python之itchat生成微信头像拼接问题
- ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
- C#微信开发之旅(六):生成带参数的二维码
- Javascript验证码的生成 和 C#生成验证码 以及 iframe的使用——模仿京东网练习的总结
- 生成带微信头像的用户二维码
- 生成微信所有朋友合成的头像,来自网络GitHub,