用ASP.NET动态生成图像(转2)


所属类别:.NET

文章作者:佚名

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


StockPicker.aspx:Sub ChartBtn_Click(Sender as Object, E as EventArgs)chart.ImageUrl = "ImageGenerator_Vb.aspx?"chart.Visible = trueFor i=0 to Stocks.Items.Count-1If (Stocks.Items(i).Selected = true) Thenchart.ImageUrl = chart.ImageUrl & "symbols=" & Stocks.Items(i).Value & "&"End IfNextEnd SubScott's Stock PickerMSFTSUN ImageGenerator_VB.aspx:<%@ Page Language="VB" ContentType="image/jpeg" %><%@ Import Namespace="System.Drawing" %><%@ Import Namespace="System.Drawing.Drawing2D" %><%@ Import Namespace="System.Drawing.Imaging" %><%@ Import Namespace="ChartGenerator" %><%@ OutputCache Duration="10" %>Function GetStockDetails(Symbol as String) as ChartLineDim myChartLine as new ChartLineif (symbol = "msft") thenDim StockValues() as Single = { 60, 110, 120, 180, 185, 190, 240, 290 }myChartLine.Width = 5myChartLine.Color = Color.BluemyChartLine.LineStyle = DashStyle.SolidmyChartLine.Title = "Microsoft Corp. (MSFT)"myChartLine.Symbol = "MSFT"myChartLine.Values = StockValuesreturn myChartLineelseif (symbol = "sun") thenDim StockValues() as Single = { 180, 155, 125, 60, 25, 15, 10, 3 }myChartLine.Width = 5myChartLine.Color = Color.RedmyChartLine.LineStyle = DashStyle.DotmyChartLine.Title = "Sun Corp. (Sun)"myChartLine.Symbol = "Sun"myChartLine.Values = StockValuesreturn myChartLineend ifreturn nothingEnd FunctionSub Page_Load(Sender as Object, E as EventArgs)' Generate Chart Data For Image....Dim XAxes() as String = { "9:00AM", "9:30AM", "10:00AM", "11:00AM", "12:00AM", "1:00PM", "1:30PM" }Dim MyChartData as New ChartDataMyChartData.YTickSize = 20MyChartData.YMax = 250MyChartData.YMin = 0MyChartData.XAxisTitles = XAxesDim Symbols() as String = Request.QueryString.GetValues("symbols")if (Not Symbols = Nothing) thenfor i=0 to Symbols.Length-1Dim stockValue as ChartLine = GetStockDetails(symbols(i).ToLower)If (stockValue <> nothing) thenmyChartData.Lines.Add(stockValue)End ifNextend if' Create In-Memory BitMap of JPEGDim MyChartEngine as New ChartEngineDim StockBitMap as BitMap = MyChartEngine.DrawChart(600, 400, myChartData)' Render BitMap Stream Back To ClientStockBitMap.Save(Response.OutputStream, ImageFormat.JPEG)End Sub ChartEngine.cs:using System.WinForms;using System.Collections;using System.Collections.Bases;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.ComponentModel;using System;using System.IO;namespace ChartGenerator{//Core Line Data structurepublic struct LineData {public float[] LineValues;public string LineTitle ;public string LineSymbol ;} //Line Data plus display style informationpublic class ChartLine {private Color lineColor ;private LineData lineData ;private DashStyle lineStyle ;private int lineWidth;//Constructorspublic ChartLine() :base() {}public ChartLine(LineData lineData) :base() {this.lineData = lineData;}//Propertiespublic Color Color {get { return lineColor ; }set { lineColor = value ; }}public DashStyle LineStyle {get { return lineStyle ; }set { lineStyle = value ; }}public string Symbol {get { return lineData.LineSymbol ; }set { lineData.LineSymbol = value ; }}public string Title {get { return lineData.LineTitle ; }set { lineData.LineTitle = value ; }}public float[] Values {get { return lineData.LineValues ; }set { lineData.LineValues = value ; }}public int Width {get { return lineWidth ; }set { lineWidth = value ; }} //Methodspublic void SetLineData(LineData lineData) {this.lineData = lineData;}}//Chart Data structurepublic class ChartData {private float yTickSize;private float yMax;private float yMin;private string[] xAxisTitles ;private ChartLineList lines = new ChartLineList();private Color gridColor=Color.Blue;private bool showHGridLines=true;private bool showVGridLines=true;//Propertiespublic float YTickSize {get { return yTickSize ; }set { yTickSize = value ; }}public float YMax {get { return yMax ; }set { yMax = value ; }} public float YMin {get { return yMin ; }set { yMin = value ; }}public string[] XAxisTitles {get { return xAxisTitles ; }set { xAxisTitles = value ; }}public ChartLineList Lines {get { return lines ; }set { lines = value ; }}public Color GridColor {get { return gridColor ; }set { gridColor = value ; }}public bool ShowHGridLines {get { return showHGridLines ; }set { showHGridLines = value ; }}public bool ShowVGridLines {get { return showVGridLines ; }set { showVGridLines = value ; }}//Collection of Chart Linespublic class ChartLineList : TypedCollectionBase {public ChartLine this[int index] {get {return (ChartLine)(List[index]);}set {List[index] = value;}}public int Add(ChartLine value) {return List.Add(value);}public void Insert(int index, ChartLine value) {List.Insert(index, value);}public int IndexOf(ChartLine value) {return List.IndexOf(value);}public bool Contains(ChartLine value) {return List.Contains(value);}public void Remove(ChartLine value) {List.Remove(value);}public void CopyTo(ChartLine[] array, int index) {List.CopyTo(array, index);}}} //Charting Engine - draws a chart based on the given ChartDatapublic class ChartEngine {private ChartData chartData ;private float left;private float right;private float top;private float bottom;private float tickCount;private float yCount;private float hspacing;private float vspacing;private Graphics g;private Rectangle r;private Color backColor;private Color foreColor;private Font baseFont;private Font legendFont;private RectangleF legendRect;public ChartEngine() {}public Bitmap DrawChart(int width, int height, ChartData chartData) {Bitmap newBitmap = new Bitmap(width,height,PixelFormat.Format32bppARGB);Graphics g = Graphics.FromImage(newBitmap);Rectangle r = new Rectangle(0, 0, width, height);Color myForeColor = Color.Black;Color myBackColor = Color.White;Font myFont = new Font("Arial", 10);this.DrawChart(g, r, myBackColor, myForeColor, myFont, chartData);return newBitmap;}public void DrawChart(Graphics g, Rectangle r, Color backColor, Color foreColor, Font baseFont, ChartData chartData) {this.chartData = chartData;this.g = g;this.r = r;this.backColor = backColor;this.foreColor = foreColor;this.baseFont = baseFont;this.legendFont = new Font(baseFont.FontFamily, (baseFont.Size * 2/3), baseFont.Style FontStyle.Bold);g.SmoothingMode = SmoothingMode.AntiAlias;CalculateChartDimensions();DrawBackground();InternalDrawChart() ;} private void CalculateChartDimensions() {right = r.Width - 5;top = 5 * baseFont.Size ;bottom = r.Height - baseFont.Size * 2;tickCount = chartData.YMin ;yCount = (chartData.YMax-chartData.YMin) / chartData.YTickSize ;hspacing = (bottom-top) / yCount;vspacing = (right) / chartData.XAxisTitles.Length;//Left depends on width of text - for simplicities sake assume that largest yvalue is the biggest//Take into account the first X Axis titlefloat maxYTextSize = g.MeasureString(chartData.YMax.ToString(), baseFont).Width;float firstXTitle = g.MeasureString(chartData.XAxisTitles[0], baseFont).Width;left = (maxYTextSize > firstXTitle) ? maxYTextSize : firstXTitle ;left = r.X + left + 5 ;//Calculate size of legend boxfloat maxLegendWidth = 0 ;float maxLegendHeight = 0 ;//Work out size of biggest legendforeach (ChartLine cl in chartData.Lines) {float currentWidth = g.MeasureString(cl.Title, legendFont).Width;float currentHeight = g.MeasureString(cl.Title, legendFont).Height;maxLegendWidth = (maxLegendWidth > currentWidth) ? maxLegendWidth : currentWidth ;maxLegendHeight = (maxLegendHeight > currentHeight) ? maxLegendHeight : currentHeight ;}legendRect = new RectangleF(r.X+2, r.Y+2, maxLegendWidth + 25 + 5, ((maxLegendHeight+2)*chartData.Lines.Count) + 3) ;}private void DrawBackground() {LinearGradientBrush b = new LinearGradientBrush(r, Color.SteelBlue, backColor,LinearGradientMode.Horizontal);g.FillRectangle(b, r);b.Dispose();}private void InternalDrawChart() {DrawGrid() ;foreach (ChartLine cl in chartData.Lines) {DrawLine(cl);}DrawLegend() ;//Draw time on chartstring timeString = "Generated:" + DateTime.Now.ToLongTimeString() ;SizeF textsize = g.MeasureString(timeString,baseFont);g.DrawString(timeString, baseFont, new SolidBrush(foreColor), r.Width - textsize.Width - 5, textsize.Height * 2 / 3) ;}privatevoid DrawGrid() {Pen gridPen = new Pen(chartData.GridColor) ; //Vertical - include tick desc'sif (chartData.ShowVGridLines) {for (int i = 0 ; (vspacing * i) < right; i++) {float x = left + (vspacing *i);string desc = chartData.XAxisTitles[i];g.DrawLine(gridPen, x,top,x,bottom +(baseFont.Size*1/3));SizeF textsize = g.MeasureString(desc,baseFont);g.DrawString(desc, baseFont, new SolidBrush(chartData.GridColor), x-(textsize.Width/2), bottom + (baseFont.Size*2/3)) ;}}//Horizontalif (chartData.ShowHGridLines) {for (float i = bottom ; i > top; i-=hspacing) {string desc = tickCount.ToString();tickCount+=chartData.YTickSize;g.DrawLine(gridPen, right, i, left-3, i);SizeF textsize = g.MeasureString(desc,baseFont);g.DrawString(desc, baseFont, new SolidBrush(chartData.GridColor), left-textsize.Width - 3, i - (textsize.Height/2)) ;}}}private void DrawLine(ChartLine chartLine) {Pen linePen = new Pen(chartLine.Color);linePen.StartCap = LineCap.Round;linePen.EndCap = LineCap.Round;linePen.Width = chartLine.Width ;linePen.DashStyle = chartLine.LineStyle;PointF[] Values = new PointF[chartLine.Values.Length];float scale = hspacing / chartData.YTickSize ;for (int i = 0 ; i < chartLine.Values.Length; i++) {float x = left + vspacing * i;Values[i] = new PointF(x, bottom-chartLine.Values[i]*scale);}g.DrawLines(linePen, Values);}private void DrawLegend() {//Draw Legend BoxControlPaint.DrawBorder(g, (Rectangle)legendRect, SystemColors.WindowFrame, ButtonBorderStyle.Solid);LinearGradientBrush b = new LinearGradientBrush(legendRect, backColor, Color.SteelBlue, LinearGradientMode.Horizontal);r.Inflate(-1, -1);g.FillRectangle(b, legendRect);b.Dispose();float startY = 5;foreach (ChartLine cl in chartData.Lines) {Pen p = new Pen(cl.Color) ;p.Width = p.Width*4;SizeF textsize = g.MeasureString(cl.Title, legendFont);float lineY = startY + textsize.Height / 2 ;g.DrawLine(p, r.X + 7, lineY, r.X + 25, lineY);g.DrawString(cl.Title, legendFont, new SolidBrush(foreColor), r.X + 30, startY);startY += (textsize.Height+2);}}}} 关闭本页

相关信息

· 初学JavaScript第二章

· fedora7加速系统启动

· 基于Nokia S60的游戏开发之三

· ASP.NET中备份SQL Server数据库的方法








....

77088 41102