/// <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=;i<signalOpinionList.Count;i++)
{
seriesOpinionOffsetDic.Add(signalOpinionList[i].Name, + 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 = + signalOpinionList.Count * itemWidth;
Bitmap bmp = new Bitmap(imgWidth, (list.Count + ) * 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 = + seriesNameArr.Length * itemWidth;//画布宽
int imgHeight = (signalFlowInfos.Count + ) * itemHeight;//画布高
Font fontTitle = new Font("宋体", , FontStyle.Bold);
Font font = new Font("宋体", , FontStyle.Regular);
#region 定义表头
Point cellLocation = new Point(, );
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center; Rectangle cellRect;
Pen pen = new Pen(Brushes.Black, ); ;
for (int i = ; i < seriesNameArr.Length; i++)
{
string name=seriesNameArr[i];
cellRect = new Rectangle(seriesOpinionOffsetDic[name] + (itemWidth-)/, , , );//100为矩形tIttle的宽度
//g.FillRectangle(seriesOpinionBrushDic[name], cellRect);
CreateRoundRectangle.FillRoundRectangle(g, seriesOpinionBrushDic[name], cellRect, );
pen.Brush = Brushes.Black;
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;//画虚线
CreateRoundRectangle.DrawRoundRectangle(g, pen, cellRect, );
g.DrawString(name, fontTitle, Brushes.Black, seriesOpinionOffsetDic[name] + itemWidth/, , format); //pen = new Pen(seriesOpinionBrushDic[name], 2);//柱子颜色
pen.Brush = seriesOpinionBrushDic[name];
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;//画虚线
pen.DashPattern = new float[] { , };
int xline=seriesOpinionOffsetDic[name] + itemWidth/;
g.DrawLine(pen, xline, , xline, imgHeight);//画柱子
} #endregion
int hight = ;
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 = ; i < signalFlowInfos.Count; i++)
{
#region 第一行
fromX1Name = signalFlowInfos[i].From;
toX2Name = signalFlowInfos[i].To;
seriesOffsetTo = seriesOpinionOffsetDic[toX2Name] + itemWidth / ;
seriesOffsetFrom = seriesOpinionOffsetDic[fromX1Name] + itemWidth / ;
cellRect = new Rectangle(, hight + , imgWidth, itemHeight);
format.Alignment = StringAlignment.Near;
g.DrawString(signalFlowInfos[i].Time, font, Brushes.Black, cellRect, format); //连接线和箭头
pen.Width = ;
if (Array.IndexOf(seriesNameArr, fromX1Name) < Array.IndexOf(seriesNameArr, toX2Name))//画向右箭头
{
pen.Color = colorTO;
g.DrawLine(pen, seriesOffsetTo - , hight + itemHeight/-, seriesOffsetTo - , hight + itemHeight / );//线上
g.DrawLine(pen, seriesOffsetTo - , hight + itemHeight/+, seriesOffsetTo - , hight + itemHeight / );//线下
}
else//画向左箭头
{
pen.Color = colorFrom;
g.DrawLine(pen, seriesOffsetTo + , hight + itemHeight / , seriesOffsetTo + , hight + itemHeight/-);//线上
g.DrawLine(pen, seriesOffsetTo + , hight + itemHeight / , seriesOffsetTo + , hight + itemHeight/+);//线下
}
pen.Width = ;
g.DrawLine(pen, seriesOffsetFrom, hight + itemHeight / , seriesOffsetTo, hight + itemHeight/);
cellRect = new Rectangle(seriesOffsetFrom - , hight + itemHeight/-, , );
g.FillEllipse(seriesOpinionBrushDic[fromX1Name], cellRect);//画圆
g.DrawEllipse(Pens.Black, cellRect);//画边框
cellRect = new Rectangle(seriesOffsetTo - , hight + itemHeight/-, , );
g.FillEllipse(seriesOpinionBrushDic[toX2Name], cellRect);
g.DrawEllipse(Pens.Black, cellRect);
//写Message
cellRect = new Rectangle(seriesOffsetFrom < seriesOffsetTo ? seriesOffsetFrom : seriesOffsetTo, hight, itemWidth - , itemHeight);
format.Alignment = StringAlignment.Center;
g.DrawString(signalFlowInfos[i].Message, font, Brushes.Black, cellRect, format);
#endregion
hight += itemHeight;
}
}

这是项目源码的一部分。

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

Graphics 导出图片使用【这个主要是画图类图的使用,记录一下】的更多相关文章

  1. 任意flex控件导出图片

    任意flex控件导出图片   flex导出图片功能通常是: 思路1:客户端将UIComponent转化为BitmapData,再转为ByteArray,将ByteArray上传到服务端,服务端发送文件 ...

  2. WPF 导出Excel 导出图片

    /// <summary> /// 导出Excel /// </summary> private void ExportExcel(DataTable ExcelDt) { / ...

  3. C#向PPT文档插入图片以及导出图片

    PowerPoint演示文稿是我们日常工作中常用的办公软件之一,而图片则是PowerPoint文档的重要组成部分,那么如何向幻灯片插入图片以及导出图片呢?本文我将给大家分享如何使用一个免费版Power ...

  4. .net 下新版highcharts本地导出图片bug处理

    最近公司要用到highcharts这个插件来生成图表,所以我花了点时间研究了下. 现在最新的版本是3.0.2,这js插件居多优点就不比多说了,demo官网上也很详细.但是优点不爽的地方是,导出图片这个 ...

  5. Asp.net通过模板(.dot/Html)导出Word,同时导出图片

    一.Office组件导出Word(服务器配置麻烦) 需要引用Office的DLL,在下文的附件中,不同的Offic版本用的不一样,虽然高级版本可以兼容低级的,不过,还是统一版本最好 贴上核心代码(转载 ...

  6. FusionCharts V3图表导出图片和PDF属性说明(转)

    百闻不如一见,狠狠点击,快快下载:(演示文档有错误,不提供下载了.待新的演示文档出来.) 许多朋友说上面的DEMO用不了.fusioncharts官方的演示非常不错,就是来不及整理,各位大侠们可以研究 ...

  7. FusionChart 导出图片 功能实现(转载)

    FusionChart 导出图片 功能实现(转载) http://www.cnblogs.com/jiagoushi/archive/2013/02/05/2893468.html 题目:精美Fusi ...

  8. Highcharts 本地导出图片和PDF asp.net mvc版

    啰嗦: 现在大家利用Highcharts开发时,有时候会遇到导出的功能问题,但是highcharts默认是链接自己的服务器上进行处理,但是有时候我们会连不上他的服务器,所以我们要让他在我们的服务器上进 ...

  9. hightchart导出图片

    通常在使用highchart导出图片pdf等文件时,我们一般直接引入exporting.js即可 执行导出操作则会直接请求highchart服务器,执行生成图片等操作,然后下载到客户端: 但这一切的操 ...

随机推荐

  1. LeetCode 171 Excel Sheet Column Number

    Problem: Given a column title as appear in an Excel sheet, return its corresponding column number. F ...

  2. 【el表达式】jsp中设置默认图像

    <img alt="头像" src="${empty members.headPic ?'images/icon.png':members.headPic}&quo ...

  3. 获取http请求响应头

    一直都是在给服务器端发送请求的时候可能会出现设置头文件的情况,但这次获取HTTP 返回的头文件,着实让我纠结一番,但最终还是实现了,总结一下.(PS:其实最后方法很简单,只是分享一下纠结过程) 先看一 ...

  4. IOS - NSURLSession

    NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...

  5. DB2 Z/os Load utility 使用

    Use the LOAD online utility to load one or more tables of a table space. The LOAD utility loads reco ...

  6. KMP算法学习

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

  7. JS 获取浏览器窗口大小

    JS 获取浏览器窗口大小 <script> // 获取窗口宽度 if (windows.innerWidth) { winWidth = windows.innerWidth; } els ...

  8. 苹果官方制作MAC OS的启动U盘的步骤

    工具/原料 一个8G或者更大容量的U盘 MAC OS系统镜像DMG文件 方法/步骤 1.打开应用程序 - 使用工具里的磁盘工具,将U盘格式化为MAC OS扩展日志式,名称输入Mavericks,并创建 ...

  9. PHP中的常用魔术方法

    魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 php面向对象中,提供了这几个魔术方法,他们的特点都是 以双下划线__开头的 __construct()  构造方法 __destruct( ...

  10. JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

    1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...