/// <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. PHP安全编程:不要让不相关的人看到报错信息

    没有不会犯错的开发者,PHP的错误报告功 能可以协助你确认和定位这些错误,可以提供的这些错误的详细描述,但如果被恶意攻击者看到,这就不妙了.不能让大众看到报错信息,这一点很重要.做到这一 点很容易,只 ...

  2. ios block中引用self

    __block __weak typeof(self) tmpSelf = self; ^(){ tmpSelf...... }

  3. August 15th 2016 Week 34th Monday

    Why not discovering as there is glorious faraway scenery? 远方有诗篇,何不去发现? An advertisement of Land Rove ...

  4. mongodb 3.2 用户权限管理配置

    使用mongodb 有段时间了,由于是在内网使用,便没有设置权限,一直是裸奔. 最近有时间,研究了下mongodb 3.2 的用户权限配置,网上有许多用户权限配置的文章,不过大多是之前版本,有些出入, ...

  5. python 获取启动参数

    pytho软件编写过程中,会经常使用带参数的启动脚本,这里记载下如何获取输入的参数. 使用sys.argv可获取启动时输入的所有参数,这个是数组,直接使用[]就可以获取,[0]代表的是启动文件时输入的 ...

  6. windows一个目录下最大文件数目

    对于FAT16文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte): 卷的最大体积是4GB:每个卷上最多可以保存的文件数量是65,536个 ( ...

  7. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  8. 关于内存管理/set/get方法

    MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 .2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...

  9. ora-01400 无法将NULL插入 ID 解决方法

    问题描述:由于工作原因,把部分 字段改了,大体这样 StatementCallback; uncategorized SQLException for SQL [insert into test(sc ...

  10. Android init.rc执行顺序

    转自:http://blog.csdn.net/kickxxx/article/details/7590665 1. 所有的action运行于service之前 2.  下面为各个section的执行 ...