作者:马金虎  来自:yesky

在ASP中插入图表,常用的方法是使用MSChart控件。那么在ASP.NET是否也是这样呢?答案是不可以的。

  我们知道ASP.NET是一种编译语言,当客户端第一次调用ASP.NET页面的时候,其实是经过了一种比较复杂的编译过程,编译生产MSIL文件,存储到本地机,MSIL文件其实是一个中间语言的文件,然后此文件又通过JIT(Just in time)编译器进行再编译,生成机器语言,这样你所调用的ASP.NET页面才展现出来,对于不同的机器,有着不同的JIT,也就被编译成不同机器语言,这就是微软公司大力鼓吹ASP.NET的所谓跨平台的原理。

  当ASP.NET页面被编译成MSIL文件的时候,编译所使用的类库必须是受管代码文件(Managed Code),而ActiveX控件是已经被编译成机器语言的文件,他属于非受管代码文件(Unmanaged Code)。所以直接在ASP.NET调用MSChart组件是不可能的。虽然你可以利用.Net框架提供的工具把此MSChart组件转换成受管代码文件,但这个过程相对比较复杂,并且利用这种方法产生的图表速度相当慢,还有就是由MSChart组件自身所限制,对于复杂的图表,是无法利用他来生成的。

  本文将以股市的行情图表为例,介绍如何在ASP.NET中实现图表。其实我们看到的行情图并不是一个图表,而是一个图片。在服务器端产生图片,然后在图片上面画出想要显示给用户的各种信息,然后通过浏览器发送图片到客户端,从而形成图表,这就是本文要探讨的方法。这种方法虽然实现起来比较复杂,但操作灵活,非常实用,尤其适用于互联网上的图表,下面就来介绍具体的实现方法。

  一.本文中介绍的程序设计及运行环境

  (1).微软视窗2000 服务器版

  (2)..Net Framework SDK Beta 2以上版本

  二.在ASP.NET中实现数据图表的关键步骤以及解决方法:

  在ASP.NET页面中画出图表的关键步骤主要有两步,其一,创建一个图片对象(Bitmap)。然后利用.Net FrameWork SDK所提供的方法在此图片对象上面画出自己想要的图形,譬如画线,画点等。其二,就是为了更适合传输,把此图片对象,以"Jpeg"格式保存,并显示出来。下面我们就来看看这二步的具体实现方法。

  (1).首先我们来看看如何在ASP.NET页面创建一个动态图片,并显示出来。

  创建一个图片对象其实非常容易的,利用命名空间"System.drawing"中的"Bitmap"类来实现的,下列语句可以创建一个位图对象:

//创建一个"Bitmap"对象Bitmap image = new Bitmap ( 400 , 400 ) ;

  修改"Bitmap"对象的二个参数来改变创建的位图对象的长和宽。通过Bitmap类的Save方法就可以显示已经创建的位图对象。由于位图文件要占用很多的空间,为了便于网络传输,一般转换成"Jpeg"或者"Gif"文件来保持。下面语句是把已经创建的位图对象,转换成"Jpeg"文件显示:

//以"Jpeg"格式保存此图片对象,在客户端显示出来image . Save ( Response . OutputStream , ImageFormat . Jpeg ); 

  稍加修改,就可以把位图对象以"Gif"文件来显示,具体如下:

//以"Jpeg"格式保存此图片对象,在客户端显示出来image . Save ( Response . OutputStream , ImageFormat . Gif ) ;

  下面代码(chart3.aspx)的作用就是ASP.NET动态创建一个图片并显示出来:

<%@ Page Language = "C#" ContentType = "image/jpeg" %> <%@ Import Namespace = "System" %><%@ Import Namespace = "System.Drawing" %><%@ Import Namespace = "System.Drawing.Drawing2D" %><%@ Import Namespace = "System.Drawing.Imaging" %><html > <head > <script language = "C#" runat = "server" > void Page_Load ( object sender , EventArgs e ) { //创建一个"Bitmap"对象Bitmap image = new Bitmap ( 400 , 400 ) ;//以"Jpeg"格式保存此图片对象,在客户端显示出来image . Save ( Response . OutputStream , ImageFormat . Jpeg ) ; } </script > </head > <body > </body > </html >

  下面是此代码运行后的界面:


        图01:利用ASP.NET动态创建图片

  产生的是一个黑色的图片,很不美观,下面就来给此图片上色,并且在此图片上面画线、写字等。

(2).如何给产生得图片上色:

  其实给产生得图片上色是比较容易的,首先根据"Bitmap"对象创建一个"Graphic"对象,然后根据此"Graphic"对象的方法来确定上色的图形类型(譬如显示的图片为椭圆、正方形等)。下面代码(chart4.aspx)的作用就是给chart3.aspx代码产生的图片上淡绿色:

<%@ Page Language = "C#" ContentType = "image/jpeg" %> <%@ Import Namespace = "System" %><%@ Import Namespace = "System.Drawing" %><%@ Import Namespace = "System.Drawing.Drawing2D" %><%@ Import Namespace = "System.Drawing.Imaging" %><html > <head > <script language = "C#" runat = "server" > void Page_Load ( object sender , EventArgs e ) { //创建一个"Bitmap"对象Bitmap image = new Bitmap ( 400 , 400 ) ;Graphics g = Graphics . FromImage ( image ) ; g . FillRectangle ( new SolidBrush ( Color . LightGreen ) , 0 , 0 , 400 , 400 ) ;//以"Jpeg"格式保存此图片对象,在客户端显示出来image . Save ( Response . OutputStream , ImageFormat . Jpeg ) ; } </script > </head > <body > </body > </html >

  下图是chart4.aspx运行的界面:


        图02:给产生的图片上色

  当然你不仅可以定制所产生的图片颜色,还可以定制产生的图片的形状,下面代码段的功能就是定制图片的形状为椭圆:

<%@ Page Language = "C#" ContentType = "image/jpeg" %> <%@ Import Namespace = "System" %><%@ Import Namespace = "System.Drawing" %><%@ Import Namespace = "System.Drawing.Drawing2D" %><%@ Import Namespace = "System.Drawing.Imaging" %><html > <head > <script language = "C#" runat = "server" > void Page_Load ( object sender , EventArgs e ) { //创建一个"Bitmap"对象Bitmap image = new Bitmap ( 400 , 400 ) ;Graphics g = Graphics . FromImage ( image ) ; g . FillRectangle ( new SolidBrush ( Color . LightGreen ) , 0 , 0 , 400 , 400 ) ;//以"Jpeg"格式保存此图片对象,在客户端显示出来image . Save ( Response . OutputStream , ImageFormat . Jpeg ) ; } </script > </head > <body > </body > </html >

  下图是此代码的运行界面:


        图03:定制图片的形状

  当然还可以使用"Graphic"对象的其他方法把图片定制成其他形状,这就不一一介绍了。

(3).如何在图片上实现画线和写字:

  在图片上写字是通过产生的"Graphic"对象的DrawString ( )方法来实现的,在调用此方法前,必须设置字体和刷子,具体调用方法是:

public void DrawString ( string s ,Font font ,Brush brush ,float x ,float y) ;

"s"是要输出的字符串,"font"是字符串的字体,"brush"是定义刷子,后面二个参数是产生字符串的位置坐标。在程序中产生字符串的具体语句如下:

Font axesFont = new Font ( "arial" , 10 ) ;Brush blackBrush = new SolidBrush ( Color . Red ) ;g . DrawString ( "在图片上面写入文字,呵呵" , axesFont , blackBrush , 90 , 20 ) ; 

 
  要在图片上画线要使用到"Graphic"对象的DrawLine ( )方法,具体的使用语法如下:

public void DrawLines (Pen pen ,Point [ ] points) ;

  其中"points"是定义点的位置,当然你也可以使用本文中使用的方法来调用,就是定义每画一道线,这样我感觉更方法些。下面是在产生的图片上画出三条线:

Pen redPen = new Pen ( Color . Red , 1 ) ;Pen blackPen = new Pen ( Color . Blue , 2 ) ;//以下语句是在此图片对象上画出各种线条,可以定义线条的粗细、起点、终点等g . DrawLine ( blackPen , 0 , 2 , 210 , 250 ) ;g . DrawLine ( blackPen , 210 , 250 , 310 , 50 ) ;g . DrawLine ( redPen , 310 , 50 , 210 , 350 ) ;

  知道了这些基本知识,在定制图片形状,给图片上色,在图片上写字、画线就显得比较容易了,下面代码(chart2.aspx)的功能就是定制一个正方形图片,并在图片上画线、写字、上色,具体如下:

<%@ Page Language = "C#" ContentType = "image/jpeg" %> <%@ Import Namespace = "System" %><%@ Import Namespace = "System.Drawing" %><%@ Import Namespace = "System.Drawing.Drawing2D" %><%@ Import Namespace = "System.Drawing.Imaging" %><html > <head > <script language = "C#" runat = "server" > void Page_Load ( object sender , EventArgs e ) { Bitmap image = new Bitmap ( 400 , 400 ) ;Font axesFont = new Font ( "arial" , 10 ) ;Brush blackBrush = new SolidBrush ( Color . Red ) ;Pen redPen = new Pen ( Color . Red , 1 ) ;Pen blackPen = new Pen ( Color . Blue , 2 ) ;Graphics g = Graphics . FromImage ( image ) ; g . Clear ( Color . White ) ; g . FillRectangle ( new SolidBrush ( Color . LightGreen ) , 0 , 0 , 400 , 400 ) ;//在此图片对象中画出图片,可以定义文字大小、位置、色彩等g . DrawString ( "在图片上面写入文字,呵呵" , axesFont , blackBrush , 90 , 20 ) ;//以下语句是在此图片对象上画出各种线条,可以定义线条的粗细、起点、终点等g . DrawLine ( blackPen , 0 , 2 , 210 , 250 ) ;g . DrawLine ( blackPen , 210 , 250 , 310 , 50 ) ;g . DrawLine ( redPen , 310 , 50 , 210 , 350 ) ;//以"Jpeg"格式保存此图片对象,在客户端显示出来// image . Save ( Response . OutputStream , ImageFormat . Jpeg ) ; image . Save ( Response . OutputStream , ImageFormat . Jpeg ) ; } </script > </head > <body > </body > </html >

        图04:在图片上完成画线、写字和上色

三.在ASP.NET中实现数据图表的完整源代码和运行界面:

  在掌握了产生图片,在给图片上色、在图片上输出字符、和画线等基本操作过以后,充分的利用各种基本操作,就可以得的在ASP.NET中实现数据图表的完整程序,下图是运行界面:

图05:在ASP.NET中实现数据图表的运行界面

  下面是在ASP.NET中实现数据图表的完整代码(chart1.aspx),如下:

<%@ Import Namespace = "System" %><%@ Import Namespace = "System.Drawing" %><%@ Import Namespace = "System.Drawing.Drawing2D" %><%@ Import Namespace = "System.Drawing.Imaging" %> <script language = "C#" runat = "server" >

class LineChart{public Bitmap b ;public string Title = "在ASP.NET中实现数据图表" ;public ArrayList chartValues = new ArrayList ( ) ;public float Xorigin = 0 , Yorigin = 0 ;public float ScaleX , ScaleY ;public float Xdivs = 2 , Ydivs = 2 ;

private int Width , Height ;private Graphics g ;private Page p ;

struct datapoint {public float x ;public float y ;public bool valid ;}

//初始化public LineChart ( int myWidth , int myHeight , Page myPage ) {Width = myWidth ; Height = myHeight ;ScaleX = myWidth ; ScaleY = myHeight ;b = new Bitmap ( myWidth , myHeight ) ;g = Graphics . FromImage ( b ) ;p = myPage ;}

public void AddValue ( int x , int y ) {datapoint myPoint ;myPoint . x = x ;myPoint . y = y ;myPoint . valid = true ;chartValues . Add ( myPoint ) ;}

public void Draw ( ) {int i ;float x , y , x0 , y0 ;string myLabel ;Pen blackPen = new Pen ( Color . Blue , 2 ) ;Brush blackBrush = new SolidBrush ( Color . Black ) ;Font axesFont = new Font ( "arial" , 10 ) ;

//首先要创建图片的大小p . Response . ContentType = "image/jpeg" ;g . FillRectangle ( new SolidBrush ( Color . LightGreen ) , 0 , 0 , Width , Height ) ;int ChartInset = 50 ;int ChartWidth = Width - ( 2 * ChartInset ) ;int ChartHeight = Height - ( 2 * ChartInset ) ;g . DrawRectangle ( new Pen ( Color . Black , 1 ) , ChartInset , ChartInset , ChartWidth , ChartHeight ) ;//写出图片上面的图片内容文字g . DrawString ( Title , new Font ( "arial" , 14 ) , blackBrush , Width / 3 , 10 ) ;//沿X坐标写入X标签for ( i = 0 ; i <= Xdivs ; i++ ) {x = ChartInset + ( i * ChartWidth ) / Xdivs ;y = ChartHeight + ChartInset ;myLabel = ( Xorigin + ( ScaleX * i / Xdivs ) ) . ToString ( ) ;g . DrawString ( myLabel , axesFont , blackBrush , x - 4 , y + 10 ) ;g . DrawLine ( blackPen , x , y + 2 , x , y - 2 ) ;}//沿Y坐标写入Y标签for ( i = 0 ; i <= Ydivs ; i++ ){x = ChartInset ;y = ChartHeight + ChartInset - ( i * ChartHeight / Ydivs ) ;myLabel = ( Yorigin + ( ScaleY * i / Ydivs ) ) . ToString ( ) ;g . DrawString ( myLabel , axesFont , blackBrush , 5 , y - 6 ) ;g . DrawLine ( blackPen , x + 2 , y , x - 2 , y ) ;}g . RotateTransform ( 180 ) ;g . TranslateTransform ( 0 , - Height ) ;g . TranslateTransform ( - ChartInset , ChartInset ) ;g . ScaleTransform ( - 1 , 1 ) ;

//画出图表中的数据datapoint prevPoint = new datapoint ( ) ;prevPoint . valid = false ;foreach ( datapoint myPoint in chartValues ) {if ( prevPoint . valid == true ) {x0 = ChartWidth * ( prevPoint . x - Xorigin ) / ScaleX ;y0 = ChartHeight * ( prevPoint . y - Yorigin ) / ScaleY ;x = ChartWidth * ( myPoint . x - Xorigin ) / ScaleX ;y = ChartHeight * ( myPoint . y - Yorigin ) / ScaleY ;g . DrawLine ( blackPen , x0 , y0 , x , y ) ;g . FillEllipse ( blackBrush , x0 - 2 , y0 - 2 , 4 , 4 ) ;g . FillEllipse ( blackBrush , x - 2 , y - 2 , 4 , 4 ) ;}prevPoint = myPoint ;}

//最后以图片形式来浏览b . Save ( p . Response . OutputStream , ImageFormat . Jpeg ) ;}

~LineChart ( ) {g . Dispose ( ) ;b . Dispose ( ) ;}}void Page_Load ( Object sender , EventArgs e ) {LineChart c = new LineChart ( 640 , 480 , Page ) ;c . Title = " 在ASP.NET中实现数据图表" ;c . Xorigin = 0 ; c . ScaleX = 500 ; c . Xdivs = 5 ;c . Yorigin = 0 ; c . ScaleY = 1000 ; c . Ydivs = 5 ;c . AddValue ( 0 , 150 ) ;c . AddValue ( 50 , 50 ) ;c . AddValue ( 100 , 700 ) ;c . AddValue ( 200 , 150 ) ;c . AddValue ( 300 , 450 ) ;c . AddValue ( 400 , 75 ) ;c . AddValue ( 450 , 450 ) ;c . AddValue ( 500 , 250 ) ;c . Draw ( ) ;}</script >

   四. 总结:

  实现图表始终是互联网编程的一个难点,本文介绍了在ASP.NET页面中如何实现数据图表,在没有什么好的组件可以利用的前提下,利用.Net FrameWork SDK GDI+中提供的各种用以操作图形的方法,这样的过程虽然有点烦杂,但对实现复杂的图表是非常有用的。希望本文不仅能够帮助读者解决在互联网上的图表问题,也能够对读者的针对GDI+也有所了解。

ASP.NET实现数据图表相关推荐

  1. 【玩转数据】让您的PPT数据图表炫酷起来吧!

    点击上方,选择星标或置顶,精选干货,第一时间送达! 阅读大概需要11分钟 快来pick小博主吧! [导读]我们经常会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗? ...

  2. CSDN:借助工具对【本博客访问来源】进行数据图表可视化(网友主要来自美国、新加坡、日本、英德加澳等)——记录数据来源截止日期20200718晚上22点

    CSDN:借助工具对[本博客访问来源]进行数据图表可视化(网友主要来自美国.新加坡.日本.英德加澳等) 目录 粉丝增量 记录数据来源截止日期20201210晚上24点 记录数据来源截止日期202007 ...

  3. sparklines插件_21个实用的Javascript数据图表插件

    21个实用的Javascript数据图表插件 六月 16, 2015 评论 (2) Sponsor 今天主要和大家分享一些统计图表相关的JS插件,图表通常用在网站后台界面,作为一种可视化数据形式展示, ...

  4. python 图表_用 Python 让你的数据图表动起来

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗? 这篇文章就介绍了 Python 中一种简单的动态图表制作方法. 数据暴增的年代,数据科 ...

  5. asp.net 应用数据缓存 -- Cache对象使用

    ASP.NET 应用数据缓存 -- Cache对象使用 [原文:http://msdn.microsoft.com/zh-cn/library/18c1wd61%28v=vs.100%29.aspx] ...

  6. 数据图表可视化_数据可视化如何选择正确的图表第1部分

    数据图表可视化 According to the World Economic Forum, the world produces 2.5 quintillion bytes of data ever ...

  7. 数据图表可视化_数据可视化十大最有用的图表

    数据图表可视化 分析师每天使用的最佳数据可视化图表列表. (List of best data visualization charts that Analysts use on a daily ba ...

  8. 高效便捷地创建单元格数据图表

    您能想象折线图.柱状图这些图表被放在一个小小的单元格中的样子吗?Excel 2010的迷你图功能为您提供了这样的便捷体验,让您高效便捷地创建单元格数据图表! 1.打开您想要创建迷你图的Excel工作簿 ...

  9. [转]asp.net导出数据到Excel的三种方法

    原文出处:asp.net导出数据到Excel的几种方法(1/3) .asp.net导出数据到Excel的几种方法(2/3).asp.net导出数据到Excel的几种方法(3/3) asp.net导出到 ...

最新文章

  1. c语言界面怎么加图形,「分享」C语言如何编写图形界面
  2. Java Code Convention Rules
  3. JavaScript 同源策略
  4. 堆栈指针ESP和EBP
  5. 关于Mybatis,我总结了 10 种通用的写法
  6. 有关opencv光流法的解释
  7. angular2 如何使用websocket
  8. HBase shell命令行
  9. mysql语句面试题_mysql的sql面试题(1)
  10. “百度贴吧之父”俞军:百度最大的问题是缺少竞争
  11. 自费出书多少钱?如何出书
  12. 力扣:714.买卖股票的最佳时机含手续费
  13. 浅谈电费电价管理中预付费系统的完善措施与应用
  14. Arduino ESP8266利用SPIFFS上传文件和查看文件
  15. Python如何使用Continue语句?用法示例
  16. webx 容器初始化
  17. 小白学习MySQL - MySQL会不会受到“高水位”的影响?
  18. java roundup函数_Excel函数(2)if、rand、round函数
  19. python进阶学习路线(全)
  20. 【微信】一、微信开发环境

热门文章

  1. c语言统计26个英文字母各出现个数,网上答案汇总与分析——【输入一串英文,统计各单词出现的个数】...
  2. java向某一IP发送消息_javaTCP如何将数据发送给指定IP的客户端(求代码)谢谢! 爱问知识人...
  3. Socket通信之操作系统的字节序和位数
  4. 网络流24题(2) P4014 分配问题
  5. python一个月能掌握吗_零基础python入门分析,如何做到一个月学会(深思极恐)...
  6. java优先级目数_10.Java运算符+(优先级、目数)+
  7. HC-05与HC-06的AT指令的区别
  8. Udacity机器人软件工程师课程笔记(十一)-ROS-编写ROS节点
  9. 【全网之最】JavaScript中字符串以特定字符分隔开之后,获取最后一个分割出来的字符串,多用于获取文件的后缀名(格式)
  10. 使用相对路径时,./、../、../../,代表的什么?