源码推荐:一个使用C#绘制图形引擎的Framework

    技术2022-05-11  112

     

                               Batman    下面将推荐一个可以很方便的生成多种图形格式的,使用了ASP+技术的图形引擎代码。它的主要描述如下:1.可以生成的图形文件格式支持BMP  EMF,GIF,Icon,JPEG,PNG,TIFF,WMF2.在文件ChartEngine.cs中为这个图形引擎的大量关键代码  StockPicker.aspx文件是一个使用该引擎绘图的例子3.要使用这个图形引擎,需要把所有的代码文件复制到你的web的某个运用目录(注:不是普通目录)中,然后在该目录下建立一个bin目录,然后运行mk.bat4.ImageGenerator_VB.asp文件的头使用了<%@ Page ContentType="image/jpeg"   %>来说明生成的是某种格式的图形文件5.为了服务器性能考虑,还可以在ImageGenerator_VB.asp中增加以下代码<%@ OutputCache Duration="60" %>,该代码可以将生成的图形文件缓存起来这样如果网站访问量大时,可以大大减轻服务器的负担    好了,废话少说,大家可以自己研究研究代码:1.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 structure     public struct LineData {        public float[] LineValues  ;        public string LineTitle ;        public string LineSymbol ;    }    //Line Data plus display style information     public class ChartLine {        private Color lineColor ;        private LineData lineData ;        private DashStyle lineStyle ;        private int lineWidth  ;        //Constructors        public ChartLine() :base() {}        public ChartLine(LineData lineData) :base() {            this.lineData = lineData;        }        //Properties        public 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 ; }        }        //Methods        public void SetLineData(LineData lineData) {            this.lineData = lineData;        }    }    //Chart Data structure    public 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;        //Properties        public 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 Lines        public 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 ChartData    public 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 title            float 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 box             float maxLegendWidth = 0 ;            float maxLegendHeight = 0 ;            //Work out size of biggest legend             foreach (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 chart            string timeString = DateTime.ToString(DateTime.Now) ;            SizeF textsize = g.MeasureString(timeString,baseFont);            g.DrawString(timeString, baseFont, new SolidBrush(foreColor), r.Width - textsize.Width - 5, textsize.Height * 2 / 3) ;        }                               private  void DrawGrid() {            Pen gridPen = new Pen(chartData.GridColor) ;            //Vertical - include tick desc's            if (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)) ;                }            }            //Horizontal            if (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 Box             ControlPaint.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);            }        }    }}2.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" %><script language="VB" runat=server>    Function GetStockDetails(Symbol as String) as ChartLine        Dim myChartLine as new ChartLine        if (symbol = "msft") then            Dim StockValues() as Single = { 60, 110, 120, 180, 185, 190, 240, 290 }            myChartLine.Width = 5            myChartLine.Color = Color.White            myChartLine.LineStyle = DashStyle.Solid            myChartLine.Title = "Microsoft Corp. (MSFT)"            myChartLine.Symbol = "MSFT"            myChartLine.Values = StockValues            return myChartLine        elseif (symbol = "sun") then           Dim StockValues() as Single = { 180, 155, 125, 60, 25, 15, 10, 3 }            myChartLine.Width = 5            myChartLine.Color = Color.Red            myChartLine.LineStyle = DashStyle.Dot            myChartLine.Title = "Sun Corp. (Sun)"            myChartLine.Symbol = "Sun"            myChartLine.Values = StockValues            return myChartLine        end if        return nothing    End Function    Sub 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 ChartData        MyChartData.YTickSize = 20        MyChartData.YMax = 250        MyChartData.YMin = 0        MyChartData.XAxisTitles = XAxes        Dim Symbols() as String = Request.QueryString.GetValues("symbols")        if (Not Symbols Is Nothing) then           for i=0 to Symbols.Length-1              Dim stockValue as ChartLine = GetStockDetails(symbols(i).ToLower)              if (stockValue <> noting) then                 myChartData.Lines.Add(stockValue)              end if           Next        end if        ' Create In-Memory BitMap of JPEG        Dim MyChartEngine as New ChartEngine        Dim StockBitMap as BitMap = MyChartEngine.DrawChart(600, 400, myChartData)        ' Render BitMap Stream Back To Client        StockBitMap.Save(Response.OutputStream, ImageFormat.JPEG)     End Sub</script>3.StockPicker.aspx文件<script language="C#" runat=server>   void ChartBtn_Click(Object sender, EventArgs e) {      chart.ImageUrl = "ImageGenerator_Vb.aspx?";      chart.Visible = true;      foreach(ListItem item in Stocks.Items) {         if (item.Selected == true) {            chart.ImageUrl += "symbols=" + item.Value + "&";         }      }   }</script><html>   <body>      <form runat=server>         <h1>Scott's Stock Picker</h1>         <asp:checkboxlist id="Stocks" runat=server>             <asp:listitem>MSFT</asp:listitem>             <asp:listitem>Sun</asp:listitem>         </asp:checkboxlist>         <asp:button text="Chart Your Selected Stocks" OnClick="ChartBtn_Click" runat=server/>         <hr>         <asp:Image id="chart" ImageUrl="" Visible=false runat=server/>      </form>   </body></html>4.mk.bat文件csc /t:library /debug+ /out:bin/chartgen.dll ChartEngine.cs /r:System.Web.dll /r:System.Winforms.dll /r:System.Drawing.dll /r:System.dll

     


    最新回复(0)