コード例 #1
0
ファイル: PictureHelper.cs プロジェクト: kangwl/KANG.Frame
            /// <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;
            }