zoukankan      html  css  js  c++  java
  • 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类 

  • 相关阅读:
    买了一个 站立式办公 桌子。
    AutoCppHeader AutoHeader 自动根据CPP 或C文件 来生成头文件。
    cplusplus 库 在线管理; 类似于 python的 pip install 、nodejs 的npm模块
    var this.value 可在任意地方 声明 类成员变量。如果可以利用在C++ 那该有多好啊
    最近遇到了 timer1sec 定时调用的函数,出现了 时间久了,就不是每秒一次了,可能会慢的情况。如何解决呢?
    【我的愿景】每个程序员都应该学习编译原理,而每个人都应该学习 编程 和 设计。
    [已解决]下载chromium源码 download_from_google_storage 无法下载文件
    突发奇想-取缔宏定义,用另外一种语言来做C++的部分外层封装
    我讨厌Apple Safari浏览器的一些地方。不想用
    unix时间戳time_t与UTC时区的关系
  • 原文地址:https://www.cnblogs.com/m7777/p/4073217.html
Copyright © 2011-2022 走看看