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=;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 导出图片使用【这个主要是画图类图的使用,记录一下】的更多相关文章
- 任意flex控件导出图片
任意flex控件导出图片 flex导出图片功能通常是: 思路1:客户端将UIComponent转化为BitmapData,再转为ByteArray,将ByteArray上传到服务端,服务端发送文件 ...
- WPF 导出Excel 导出图片
/// <summary> /// 导出Excel /// </summary> private void ExportExcel(DataTable ExcelDt) { / ...
- C#向PPT文档插入图片以及导出图片
PowerPoint演示文稿是我们日常工作中常用的办公软件之一,而图片则是PowerPoint文档的重要组成部分,那么如何向幻灯片插入图片以及导出图片呢?本文我将给大家分享如何使用一个免费版Power ...
- .net 下新版highcharts本地导出图片bug处理
最近公司要用到highcharts这个插件来生成图表,所以我花了点时间研究了下. 现在最新的版本是3.0.2,这js插件居多优点就不比多说了,demo官网上也很详细.但是优点不爽的地方是,导出图片这个 ...
- Asp.net通过模板(.dot/Html)导出Word,同时导出图片
一.Office组件导出Word(服务器配置麻烦) 需要引用Office的DLL,在下文的附件中,不同的Offic版本用的不一样,虽然高级版本可以兼容低级的,不过,还是统一版本最好 贴上核心代码(转载 ...
- FusionCharts V3图表导出图片和PDF属性说明(转)
百闻不如一见,狠狠点击,快快下载:(演示文档有错误,不提供下载了.待新的演示文档出来.) 许多朋友说上面的DEMO用不了.fusioncharts官方的演示非常不错,就是来不及整理,各位大侠们可以研究 ...
- FusionChart 导出图片 功能实现(转载)
FusionChart 导出图片 功能实现(转载) http://www.cnblogs.com/jiagoushi/archive/2013/02/05/2893468.html 题目:精美Fusi ...
- Highcharts 本地导出图片和PDF asp.net mvc版
啰嗦: 现在大家利用Highcharts开发时,有时候会遇到导出的功能问题,但是highcharts默认是链接自己的服务器上进行处理,但是有时候我们会连不上他的服务器,所以我们要让他在我们的服务器上进 ...
- hightchart导出图片
通常在使用highchart导出图片pdf等文件时,我们一般直接引入exporting.js即可 执行导出操作则会直接请求highchart服务器,执行生成图片等操作,然后下载到客户端: 但这一切的操 ...
随机推荐
- rsync错误日志
问题一: @ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(152 ...
- [Ubuntu] ubuntu10.04系统维护之Wine的安装
在介绍安装wine之前,我想是有必要先介绍一下Wine的.当然,如果是Liunx的高手,我想是没必要看的,但是对于笔者这样的菜鸟级人物还是需要看一下的. Wine是一款Liunx下的模拟器软件,但是W ...
- MongoDB配置文件YAML-based选项全解
配置文件部分 MongoDB引入一个YAML-based格式的配置文件.2.4版本以前的仍然兼容. 我的mongodb配置文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- windows端口备忘
FTP 端口号21 SSH 端口号22 Telnet 端口号23
- 解的个数(codevs 1213)
题目描述 Description 已知整数x,y满足如下面的条件: ax+by+c = 0 p<=x<=q r<=y<=s 求满足这些条件的x,y的个数. 输入描述 Input ...
- 树形DP习题
听闻noip要考树形DP,本蒟蒻万分惶恐,特刷一坨题目,以慰受惊之心. codevs 1486 /*和非常出名的"选课"是一个题*/ #include<cstdio> ...
- ios中通过调试来使用私有api
转自:http://blog.csdn.net/cubepeng/article/details/11284173 OS不允许使用ios私有api,使用私有api可以获得意想不到的效果 ,同时使用私有 ...
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- java-解决业务操可能数据冲突问题
问题提出,由于业务会出现多人同时操作,或者业务人员反复的操作,因此在业务流程中,需要对业务操作数据进行保护,由于使用数据库锁可能会引起一些难以预料的问题,因此考虑使用内存锁,设计思想:在内存中使用一个 ...
- HTML5_Canvas_属性、定义及方法
一.简单图形,整套的属性和方法专门用于绘制矩形:1.fillStyle可以设置为CSS颜色.一个图案或一种颜色渐变.fillStyle默认是纯黑色,你可以设置成你喜欢的任意颜色.只要页面打开着,每个绘 ...