|  | 
 
| 最近工作中需要实现一个比较固定网页的生成图片的功能,首先结合自己枯死冥想,并在网上寻找搜索线索。 最好也没有找到一个好的方案。
 
 在这里首先要感谢飞哥给予的帮助,经过飞哥的指导完成了任务。
 现在我把这些天的努力,记录下来,在论坛上发个帖子,方便以后查阅,也为了有此需要的小伙伴来参考
 
 c# 生成图片 并实现合成图片,添加文字,画矩形,画园等功能
 重点记录功能
 1:添加图片到画布上,并且控制好位置,大小
 2:添加文字到画布上,并且控制好位置,大小,颜色,字体类型,宽度,换行等。
 3:在画布上,画圆,画矩形,大小,半径,空心的,实心的等。
 
 下面记录的实现方案
 
 准备工作:
 1:初始画布大小。(画布初始要根据自己的需求来实例)
 
 [C#] 纯文本查看 复制代码  //初始画布大小
  
                int initialWidth = 880, initialHeight = 2000;
                Bitmap theBitmap = new Bitmap(initialWidth, initialHeight);
                Graphics theGraphics = Graphics.FromImage(theBitmap);
                //呈现质量
                theGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                //背景色
                theGraphics.Clear(Color.FromArgb(255, 255, 255));
                //灰色边框
                theGraphics.DrawRectangle(new Pen(Color.FromArgb(227, 227, 227), 1), 1, 1, initialWidth - 2,
                    initialHeight - 2);2:新建画刷,定义各种所需要的画刷,定义各种所需要的字体
 
 [C#] 纯文本查看 复制代码   
                int autoHeight = 0; //累计高度(动态的内容高度位置)
                int sjh = 0; //时间轴的高度
                float fwigth = 0;
                int fontHeight = 30; //文字行间距
                string FontType = "微软雅黑";
                string IconType = "iconfont";
                Font theFont = new Font(FontType, 18.0f, System.Drawing.FontStyle.Bold);
                //准备工作。定义画刷颜色
                Color col = Color.FromArgb(51, 51, 51);
                Brush newBrush = new SolidBrush(col);
                Brush bush = new SolidBrush(Color.FromArgb(204, 204, 204)); //填充的颜色
 3:在画布上画图片。涉及技术;根据图片路径或网络地址,转换成数据流。
 
 
 [C#] 纯文本查看 复制代码  public Bitmap Get_img(string imgurl)
        {
            Bitmap img = null;
            HttpWebRequest req;
            HttpWebResponse res = null;
            try
            {
                System.Uri httpUrl = new System.Uri(imgurl);
                req = (HttpWebRequest)(WebRequest.Create(httpUrl));
                req.Timeout = 180000; //设置超时值10秒
                req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0";
                req.Accept = "text/html, application/xhtml+xml, */*";
                req.Method = "GET";
                res = (HttpWebResponse)(req.GetResponse());
                img = new Bitmap(res.GetResponseStream());//获取图片流                 
               // img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".png");//随机名
            }
            catch (Exception  ) { }
            return img;
        }
 [C#] 纯文本查看 复制代码 
 Bitmap bmp = Get_img("");//图片地址
theGraphics.DrawImage(bmp, new System.Drawing.Rectangle(36, 36, 198, 198),
                    new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
                    System.Drawing.GraphicsUnit.Pixel);
 4:在画布画圆。
 
 [C#] 纯文本查看 复制代码 画填充圆:         
Graphics gra = this.pictureBox1.CreateGraphics();
gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Brush bush = new SolidBrush(Color.Green);//填充的颜色
gra.FillEllipse(bush, 10, 10, 100, 100);//画填充椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50
画圆圈:
Graphics gra = this.pictureBox1.CreateGraphics();
gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Pen pen = new Pen(Color.Pink);//画笔颜色                                
gra.DrawEllipse(pen, 250, 10, 100, 100);//画椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为505:画矩形 [C#] 纯文本查看 复制代码 Rectangle myRectangle = new Rectangle(100, 50, 80, 40);
myGraphics.DrawRectangle(myPen, myRectangle);
 6:画线 [C#] 纯文本查看 复制代码          theGraphics.DrawLine(new Pen(Color.FromArgb(227, 227, 227), 1), 0, Height, 880, Height); //画线
 7:文字处理。(我自己写了一个方法,根据参数 去换行自动) [C#] 纯文本查看 复制代码     theGraphics.DrawString(str, theFont, newBrush, xwith, yHeight);
 8:文字批量换行处理
 
 [C#] 纯文本查看 复制代码 
        /// <summary>
        /// 文字处理
        /// </summary>
        /// <param name="str">字符串</param>
        /// <param name="autoHeight">开始高度</param>
        /// <param name="fontHeight">行高度</param>
        /// <param name="theGraphics">gdp+</param>
        /// <param name="theFontnormal">文字格式</param>
        /// <param name="newBrushnormal">画刷</param>
        /// <para name="kuandu" >宽度</para>
        /// <returns>返回高度</returns>
        public int DrawFont(string strr, int fwith, int autoHeight, int fontHeight, Graphics theGraphics, Font theFontnormal, Brush newBrushnormal, int kuandu)
        {
            strr = strr.Replace(",", "@m@");
            //换行变,号
            strr = strr.Replace("<br/>", ",");
            string[] tag = strr.Split(new char[] { ',' });
            if (tag.Count() > 0)
            {
                foreach (var item in tag)
                {
                    string str = item.Replace("@m@", ",");
                    int thewight = Convert.ToInt16(Fontwigth(str, theFontnormal));
                    if (thewight > kuandu)
                    {
                        int cs = thewight / kuandu;//除数
                        int ys = thewight % kuandu;//余数
                        if (ys > 0)
                        {
                            cs = cs + 1;
                        }
                        int scs = str.Length / (cs - 1);
                        string newstr = string.Empty;
                        for (int i = 0; i < cs; i++)
                        {
                            if (scs > str.Length)
                            {
                                scs = str.Length;
                            }
                            if (Fontwigth(str, theFontnormal) >= kuandu)
                            {
                                do
                                {
                                    newstr = str.Substring(0, scs);
                                    if (Fontwigth(newstr, theFontnormal) > kuandu && scs < 100)
                                    {
                                        scs = scs - 1;
                                    }
                                } while (Fontwigth(newstr, theFontnormal) > kuandu && scs < 100);
                            }
                            else
                            {
                                do
                                {
                                    newstr = str.Substring(0, scs);
                                    if (scs < str.Length)
                                    {
                                        if (Fontwigth(newstr, theFontnormal) < kuandu && scs < 100 && scs < str.Length)
                                        {
                                            scs = scs + 1;
                                        }
                                    }
                                } while (Fontwigth(newstr, theFontnormal) < kuandu && scs < 100 && scs < str.Length);
                            }
                            theGraphics.DrawString(newstr, theFontnormal, newBrushnormal, fwith, autoHeight);
                            autoHeight += fontHeight;
                            if (scs > 0 && str.Length > scs)
                            {
                                str = str.Substring(scs, str.Length - scs);
                            }
                            newstr = string.Empty;
                        }
                    }
                    else
                    {
                        theGraphics.DrawString(str, theFontnormal, newBrushnormal, fwith, autoHeight);
                        autoHeight += fontHeight;
                    }
                }
            }
            return autoHeight;
        }
 9:图片流实现图片下载保存
 
 [C#] 纯文本查看 复制代码  Response.ContentType = "application/x-msdownload";
  //Bitmap theBitmap = new Bitmap(initialWidth, initialHeight);//此为所画的图片
            string filename = "attachment; filename=" +imgname + ".jpg";
            Response.AddHeader("Content-Disposition", filename);
            Response.BinaryWrite(theBitmap);好了:有了这些准备,一个网页基本上都能画成图片了(这些大家看出来是不是有点像前台设计布局)
 还有不完善之处,欢迎大家提宝贵建议。
 
 
 
 | 
 |