Graphics 导出图片使用【这个主要是画图类图的使用,记录一下】

 /// <summary>
        /// 导出信令流程矢量图
        /// </summary>
        /// <param name="signalFlowInfos">信令流程</param>
        /// <returns>路径</returns>
        public string ExportToImage(List<SignalFlowInfo> list)
        {
            List<SignalOpinion> signalOpinionList=GetSignalOpinion();
            seriesOpinionOffsetDic = new Dictionary<string, int>();
            seriesOpinionBrushDic = new Dictionary<string, Brush>();
            string[] seriesNameArr = new string[signalOpinionList.Count];
            for(int i=0;i<signalOpinionList.Count;i++)
            {
                seriesOpinionOffsetDic.Add(signalOpinionList[i].Name, 80 + itemWidth * i);
                seriesOpinionBrushDic.Add(signalOpinionList[i].Name, new SolidBrush(Color.FromArgb(signalOpinionList[i].ColorA,signalOpinionList[i].ColorR,signalOpinionList[i].ColorG,signalOpinionList[i].ColorB)));
                seriesNameArr[i] = signalOpinionList[i].Name;
            }

            int imgWidth = 80 + signalOpinionList.Count * itemWidth;
            Bitmap bmp = new Bitmap(imgWidth, (list.Count + 2) * itemHeight);
            Graphics gs = Graphics.FromImage(bmp);
            if (!Directory.Exists(TempFilesPath))
            {
                Directory.CreateDirectory(TempFilesPath);
            }
            string fileName = "信令流程图" + System.Guid.NewGuid().ToString() + ".zip";
            string filePath = TempFilesPath + "\\" + fileName;
            Metafile mf = null;
            Graphics g = null;
            try
            {
                mf = new Metafile(filePath, gs.GetHdc());
                g = Graphics.FromImage(mf);
                DrawNew(g, list, seriesNameArr);
                g.Save();
            }
            catch (Exception err)
            {
                WebLogLayout.Error(new List<string>() { "导出信令流程矢量图失败:" + err.Message });
                //return "";
                Exception e = new Exception("导出信令流程矢量图失败", err);
                throw e;
            }
            finally
            {
                if (g != null)
                    g.Dispose();
                if (mf != null)
                    mf.Dispose();
            }
            return fileName;
        }

        /// <summary>
        /// 画图
        /// </summary>
        /// <param name="g">GDI+ 绘图图面</param>
        /// <param name="signalFlowInfos">数据对象集合</param>
        private void DrawNew(Graphics g, List<SignalFlowInfo> signalFlowInfos,string[] seriesNameArr )
        {
            int imgWidth = 80 + seriesNameArr.Length * itemWidth;//画布宽
            int imgHeight = (signalFlowInfos.Count + 2) * itemHeight;//画布高
            Font fontTitle = new Font("宋体", 12, FontStyle.Bold);
            Font font = new Font("宋体", 9, FontStyle.Regular);
            #region 定义表头
            Point cellLocation = new Point(5, 5);
            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;

            Rectangle cellRect;
            Pen pen = new Pen(Brushes.Black, 1); ;
            for (int i = 0; i < seriesNameArr.Length; i++)
            {
                string name=seriesNameArr[i];
                cellRect = new Rectangle(seriesOpinionOffsetDic[name] + (itemWidth-100)/2, 5, 100, 30);//100为矩形tIttle的宽度
                //g.FillRectangle(seriesOpinionBrushDic[name], cellRect);
                CreateRoundRectangle.FillRoundRectangle(g, seriesOpinionBrushDic[name], cellRect, 5);
                pen.Brush = Brushes.Black;
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;//画虚线
                CreateRoundRectangle.DrawRoundRectangle(g, pen, cellRect, 5);
                g.DrawString(name, fontTitle, Brushes.Black, seriesOpinionOffsetDic[name] + itemWidth/2, 20, format);

                //pen = new Pen(seriesOpinionBrushDic[name], 2);//柱子颜色
                pen.Brush = seriesOpinionBrushDic[name];
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;//画虚线
                pen.DashPattern = new float[] { 3, 2 };
                int xline=seriesOpinionOffsetDic[name] + itemWidth/2;
                g.DrawLine(pen, xline, 35, xline, imgHeight);//画柱子
            }
            
            #endregion
            int hight = 35;
            Color colorTO = ColorTranslator.FromHtml("#008000");//向右方向颜色
            Color colorFrom = ColorTranslator.FromHtml("#FFA500");//向左方向颜色

            string fromX1Name;
            string toX2Name;
            int seriesOffsetTo;
            int seriesOffsetFrom;
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;//画实线
            for (int i = 0; i < signalFlowInfos.Count; i++)
            {
                #region 第一行
                fromX1Name = signalFlowInfos[i].From;
                toX2Name = signalFlowInfos[i].To;
                seriesOffsetTo = seriesOpinionOffsetDic[toX2Name] + itemWidth / 2;
                seriesOffsetFrom = seriesOpinionOffsetDic[fromX1Name] + itemWidth / 2;
                cellRect = new Rectangle(6, hight + 1, imgWidth, itemHeight);
                format.Alignment = StringAlignment.Near;
                g.DrawString(signalFlowInfos[i].Time, font, Brushes.Black, cellRect, format);

                //连接线和箭头
                pen.Width = 2;
                if (Array.IndexOf(seriesNameArr, fromX1Name) < Array.IndexOf(seriesNameArr, toX2Name))//画向右箭头
                {
                    pen.Color = colorTO;
                    g.DrawLine(pen, seriesOffsetTo - 10, hight + itemHeight/2-5, seriesOffsetTo - 5, hight + itemHeight / 2);//线上
                    g.DrawLine(pen, seriesOffsetTo - 10, hight + itemHeight/2+5, seriesOffsetTo - 5, hight + itemHeight / 2);//线下
                }
                else//画向左箭头
                {
                    pen.Color =  colorFrom;
                    g.DrawLine(pen, seriesOffsetTo + 5, hight + itemHeight / 2, seriesOffsetTo + 10, hight + itemHeight/2-5);//线上
                    g.DrawLine(pen, seriesOffsetTo + 5, hight + itemHeight / 2, seriesOffsetTo + 10, hight + itemHeight/2+5);//线下
                }
                pen.Width = 1;
                g.DrawLine(pen, seriesOffsetFrom, hight + itemHeight / 2, seriesOffsetTo, hight + itemHeight/2);
                cellRect = new Rectangle(seriesOffsetFrom - 5, hight + itemHeight/2-5, 10, 10);
                g.FillEllipse(seriesOpinionBrushDic[fromX1Name], cellRect);//画圆
                g.DrawEllipse(Pens.Black, cellRect);//画边框
                cellRect = new Rectangle(seriesOffsetTo - 5, hight + itemHeight/2-5, 10, 10);
                g.FillEllipse(seriesOpinionBrushDic[toX2Name], cellRect);
                g.DrawEllipse(Pens.Black, cellRect);
                //写Message
                cellRect = new Rectangle(seriesOffsetFrom < seriesOffsetTo ? seriesOffsetFrom : seriesOffsetTo, hight, itemWidth - 10, itemHeight);
                format.Alignment = StringAlignment.Center;
                g.DrawString(signalFlowInfos[i].Message, font, Brushes.Black, cellRect, format);
                #endregion
                hight += itemHeight;
            }
        }

 

这是项目源码的一部分。

这个例子一些常用的绘图方法都有了,不够的情况可以参考msdn Graphics类 

posted @ 2014-11-04 11:28  莫欺  阅读(684)  评论(0编辑  收藏  举报