/// <summary> /// 绘制图片 /// </summary> /// <param name="imgUrl"></param> /// <param name="dataStyle"></param> /// <param name="dataText"></param> /// <param name="dataCmd">命令参数(后期多样式时用)</param> /// <param name="sNo">屏幕编号</param> /// <param name="bgColor">可变参数,无值时全部默认为透明,一个参数时文字画布的颜色,两个参数时第二个参数为主画布的颜色</param> /// <returns></returns> public static string GenerateImage(string imgUrl, int dataStyle, string dataText, string dataCmd, string sNo, params string[] bgColor) { Image imageFrom = null; var fromPath = imgUrl; // const string savePath = "Images/";//保存图片的路径 try { if (!string.IsNullOrEmpty(fromPath)) { #region 获取网络图片 var myUri = new Uri(fromPath); var webRequest = WebRequest.Create(myUri); var webResponse = webRequest.GetResponse(); var reStream = webResponse.GetResponseStream(); if (reStream != null) imageFrom = new Bitmap(reStream); //读取原图 #endregion } } catch (Exception exp) { // new Common.Log().WriteLog(exp.Message + "PicEditAndPreview.aspx.cs->GenerateImage()->Line64->读取图片时异常"); } if (imageFrom == null) { return null; } var ratio = (float) imageFrom.Width/imageFrom.Height; //原始图片的长宽比例 const int imageWidth = 1280; //背景画布宽高(720P) const int imageHeight = 720; //背景画布宽高(720P) var ratioStyle = 1F; //图片区域的宽高比例 var size = new Size(); var screenType = (ScreenStyle) dataStyle; switch (screenType) { case ScreenStyle.UpAndDown: { #region 图片上文字下的风格(图片:1230*420,上半部分:720*0.618=445px 下半部分:275px) ratioStyle = 2.9286F; if (ratio > ratioStyle) //宽度较宽时 { size = new Size(1230, (int) (1230/ratio)); } else { size = new Size((int) (420*ratio), 420); } #endregion } break; case ScreenStyle.LeftAndRight: { #region 图片左文字右的风格(图片:765*670 左边:790,右边490) ratioStyle = 1.1418F; if (ratio > ratioStyle) //宽度较宽时 { size = new Size(765, (int) (765/ratio)); } else { size = new Size((int) (670*ratio), 670); } #endregion } break; case ScreenStyle.FullScreen: #region 图片全屏的风格(1280*720) ratioStyle = 1.7778F; if (ratio > ratioStyle) //宽度较宽时 { size = new Size(1280, (int) (1280/ratio)); } else { size = new Size((int) (720*ratio), 720); } #endregion break; default: break; } Image bmap = new Bitmap(imageWidth, imageHeight); var g = Graphics.FromImage(bmap); #region 更改画布颜色 var color = Color.Transparent; //默认为透明的 if (bgColor.Length > 0) { color = ColorTranslator.FromHtml(bgColor[0]); //获取十六进制的颜色 } if (bgColor.Length > 1) { g.Clear(ColorTranslator.FromHtml(bgColor[1])); //给画布上色 } else { g.Clear(Color.Transparent); } #endregion Image imageResize = new Bitmap(imageFrom, size); //重新修改图片的尺寸 switch (screenType) { case ScreenStyle.UpAndDown: { g.DrawImage(imageResize, (imageWidth - size.Width)/2, 445 - size.Height + 40); //把图片往画布中画 } break; case ScreenStyle.LeftAndRight: { g.DrawImage(imageResize, 790 - size.Width, (imageHeight - size.Height)/2); } break; case ScreenStyle.FullScreen: { g.DrawImage(imageResize, (imageWidth - size.Width)/2, (imageHeight - size.Height)/2); } break; default: break; } #region 绘制文本 MyFont myFont; Image textBitmap; switch (screenType) { case ScreenStyle.UpAndDown: { myFont = new MyFont(dataText, new Bitmap(1230, 250), color, screenType); textBitmap = myFont.GenerateText(); g.DrawImage(textBitmap, 25, 445); //往画布中贴图片 } break; case ScreenStyle.LeftAndRight: { myFont = new MyFont(dataText, new Bitmap(475, 670), color, screenType); textBitmap = myFont.GenerateText(); g.DrawImage(textBitmap, 790, 25); } break; case ScreenStyle.FullScreen: { myFont = new MyFont(dataText, new Bitmap(400, 250), color, screenType); textBitmap = myFont.GenerateText(); g.DrawImage(textBitmap, (imageWidth + size.Width)/2 - 425, (imageHeight + size.Height)/2 - 275); //在图片的右下角方位 } break; default: break; } #endregion var sPicName = DateTime.Now.ToString("yyyyMMddhhmmss"); var savePath = HttpContext.Current.Server.MapPath(string.Format(saveEditPath, sNo)); if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } var sPicPath = HttpContext.Current.Server.MapPath(string.Format(saveEditPath, sNo) + sPicName + "_thumbnail.jpg"); var sPreFix = HttpContext.Current.Server.MapPath(string.Format(saveEditPath, sNo) + sPicName); #region 创建缩略图 var smBmap = bmap.GetThumbnailImage(Convert.ToInt32(bmap.Width/4.267), Convert.ToInt32(bmap.Height/4.267), null, IntPtr.Zero); smBmap.Save(sPicPath, ImageFormat.Jpeg); #endregion bmap.Save(sPreFix + ".jpg", ImageFormat.Jpeg); var returnImg = string.Format(relative_edit_path, sNo) + sPicName + "_thumbnail.jpg"; return returnImg; }