Wrox Home  
Search P2P Archive for: Go

  Return to Index  

aspx thread: Image Generation Sample...


Message #1 by =?iso-8859-1?Q?Fredrik_Norm=E9n?= <fredrik.normen@e...> on Wed, 11 Oct 2000 10:15:32 +0200
This is a multi-part message in MIME format.



------=_NextPart_000_0047_01C03369.DA5CA060

Content-Type: text/plain;

	charset="iso-8859-1"

Content-Transfer-Encoding: 7bit



Here is something for you..



/Fredrik Normen





From: Scott Guthrie



One of the neat new features of ASP+ that I haven't seen anyone take

advantage of yet is the ability to dynamically generate images on the fly.

Attached is a sample that should allow you to easily experiment with this.

I say "should" since I haven't tested the latest copy of it with the

prerelease bits (I have beta1 on my machine right now).  If there are some

compile issues, I'm hoping someone can help me out with fixing up the

problems and reposting the sample.



The sample I have today is basically a "stock picker" page

(stockpicker.aspx") that enables a user to select one of two stocks (msft

and sun), and then click "show chart".  This causes a request to

"ImageGenerator_Vb.aspx" -- which is the page that dynamically generates a

.jpg on the server plotting the stock price of the selected stock, and then

draws a nice line chart of the data.



A couple of notes about this sample:



1) Most of the actual image chart generation code is encapsulated within the

"ChartEngine.cs" component.  To compile this component, create a "bin"

directory underneath your application and run the attached "mk.bat" batch

file.



2) The "ChartEngine.cs" file is a generic chart generation component.  There

is nothing specific about stocks built into it.  Alternatively, you could

use the exact same component to chart anything you want (example: number of

people on this listserv over time, etc).



2) The ImageGenerator_VB.aspx page uses a <%@ Page ContentType="image/jpeg"

%> attribute to tell ASP+ to set the return mime type of the content as a

jpeg



3) The ImageGenerator_VB.aspx page could have optionally used an <%@

OutputCache Duration="60" %> directive to tell ASP+ to dynamically

outputcache the results of the image generation.  This is recommended in

cases where you can cache the image -- as it will significantly reduce the

load on your system.



4) There are no license issues with using System.Drawing (which is how

ChartEngine.cs was implemented).  Feel free to dynamically generate images

to your hearts content.





 <<mk.bat>>  <<StockPicker.aspx>>  <<ImageGenerator_Vb.aspx>>

<<ChartEngine.cs>>

To run the sample, first create a "bin" directory underneath your

application, run the "mk.bat" file, then hit the stockpicker.aspx page.



Thanks,



Scott





------=_NextPart_000_0047_01C03369.DA5CA060

Content-Type: application/octet-stream;

	name="mk.bat"

Content-Transfer-Encoding: quoted-printable

Content-Disposition: attachment;

	filename="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

------=_NextPart_000_0047_01C03369.DA5CA060

Content-Type: application/octet-stream;

	name="StockPicker.aspx"

Content-Transfer-Encoding: quoted-printable

Content-Disposition: attachment;

	filename="StockPicker.aspx"



<script language=3D"C#" runat=3Dserver>



   void ChartBtn_Click(Object sender, EventArgs e) {

     

      chart.ImageUrl =3D "ImageGenerator_Vb.aspx?";

      chart.Visible =3D true;



      foreach(ListItem item in Stocks.Items) {



         if (item.Selected =3D=3D true) {

            chart.ImageUrl +=3D "symbols=3D" + item.Value + "&";

         }

      }

   }



</script>



<html>



   <body>



      <form runat=3Dserver>



         <h1>Scott's Stock Picker</h1>



         <asp:checkboxlist id=3D"Stocks" runat=3Dserver>

             <asp:listitem>MSFT</asp:listitem>

             <asp:listitem>Sun</asp:listitem>

         </asp:checkboxlist>



         <asp:button text=3D"Chart Your Selected Stocks" 

OnClick=3D"ChartBtn_Click" runat=3Dserver/>



         <hr>



         <asp:Image id=3D"chart" ImageUrl=3D"" Visible=3Dfalse 

runat=3Dserver/>



      </form>



   </body>



</html>

------=_NextPart_000_0047_01C03369.DA5CA060

Content-Type: application/octet-stream;

	name="ImageGenerator_Vb.aspx"

Content-Transfer-Encoding: quoted-printable

Content-Disposition: attachment;

	filename="ImageGenerator_Vb.aspx"



<%@ Page Language=3D"VB" ContentType=3D"image/jpeg" %>

<%@ Import Namespace=3D"System.Drawing" %>

<%@ Import Namespace=3D"System.Drawing.Drawing2D" %>

<%@ Import Namespace=3D"System.Drawing.Imaging" %>

<%@ Import Namespace=3D"ChartGenerator" %>



<script language=3D"VB" runat=3Dserver>



    Function GetStockDetails(Symbol as String) as ChartLine



        Dim myChartLine as new ChartLine



        if (symbol =3D "msft") then



            Dim StockValues() as Single =3D { 60, 110, 120, 180, 185, 

190, 240, 290 }



            myChartLine.Width =3D 5

            myChartLine.Color =3D Color.White

            myChartLine.LineStyle =3D DashStyle.Solid

            myChartLine.Title =3D "Microsoft Corp. (MSFT)"

            myChartLine.Symbol =3D "MSFT"

            myChartLine.Values =3D StockValues

            return myChartLine



        elseif (symbol =3D "sun") then



            Dim StockValues() as Single =3D { 180, 155, 125, 60, 25, 15, 

10, 3 }



            myChartLine.Width =3D 5

            myChartLine.Color =3D Color.Red

            myChartLine.LineStyle =3D DashStyle.Dot

            myChartLine.Title =3D "Sun Corp. (Sun)"

            myChartLine.Symbol =3D "Sun"

            myChartLine.Values =3D 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 =3D { "9:00AM", "9:30AM", "10:00AM", 

"11:00AM", "12:00AM", "1:00PM", "1:30PM" }

       

        Dim MyChartData as New ChartData

        MyChartData.YTickSize =3D 20

        MyChartData.YMax =3D 250

        MyChartData.YMin =3D 0

        MyChartData.XAxisTitles =3D XAxes



        Dim Symbols() as String =3D 

Request.QueryString.GetValues("symbols")



        if (Symbols <> nothing) then



           for i=3D0 to Symbols.Length-1



              Dim stockValue as ChartLine =3D 

GetStockDetails(symbols(i).ToLower)



              if (stockValue <> nothing) 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 =3D MyChartEngine.DrawChart(600, 400, 

myChartData)



        ' Render BitMap Stream Back To Client



        StockBitMap.Save(Response.OutputStream, ImageFormat.JPEG)

   

     End Sub



</script>

------=_NextPart_000_0047_01C03369.DA5CA060

Content-Type: application/octet-stream;

	name="ChartEngine.cs"

Content-Transfer-Encoding: quoted-printable

Content-Disposition: attachment;

	filename="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 =3D lineData;

        }



        //Properties

        public Color Color {

            get { return lineColor ; }

            set { lineColor =3D value ; }

        }



        public DashStyle LineStyle {

            get { return lineStyle ; }

            set { lineStyle =3D value ; }

        }

       

        public string Symbol {

            get { return lineData.LineSymbol ; }

            set { lineData.LineSymbol =3D value ; }

        }



        public string Title {

            get { return lineData.LineTitle ; }

            set { lineData.LineTitle =3D value ; }

        }



        public float[] Values {

            get { return lineData.LineValues ; }

            set { lineData.LineValues =3D value ; }

        }



        public int Width {

            get { return lineWidth ; }

            set { lineWidth =3D value ; }

        }



        //Methods

        public void SetLineData(LineData lineData) {

            this.lineData =3D lineData;

        }

    }



    //Chart Data structure

    public class ChartData {



        private float yTickSize;

        private float yMax;

        private float yMin;

        private string[] xAxisTitles ;

        private ChartLineList lines =3D new ChartLineList();

        private Color gridColor=3DColor.Blue;

        private bool showHGridLines=3Dtrue;

        private bool showVGridLines=3Dtrue;



        //Properties

        public float YTickSize {

            get { return yTickSize ; }

            set { yTickSize =3D value ; }

        }



        public float YMax {

            get { return yMax ; }

            set { yMax =3D value ; }

        }



        public float YMin {

            get { return yMin ; }

            set { yMin =3D value ; }

        }



        public string[] XAxisTitles {

            get { return xAxisTitles ; }

            set { xAxisTitles =3D value ; }

        }



        public ChartLineList Lines {

            get { return lines ; }

            set { lines =3D value ; }

        }



        public Color GridColor {

            get { return gridColor ; }

            set { gridColor =3D value ; }

        }



        public bool ShowHGridLines {

            get { return showHGridLines ; }

            set { showHGridLines =3D value ; }

        }



        public bool ShowVGridLines {

            get { return showVGridLines ; }

            set { showVGridLines =3D value ; }

        }



        //Collection of Chart Lines

        public class ChartLineList : TypedCollectionBase {



            public ChartLine this[int index] {

               get {

                   return (ChartLine)(List[index]);

               }

               set {

                   List[index] =3D 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 =3D new 

Bitmap(width,height,PixelFormat.Format32bppARGB);

           Graphics g =3D Graphics.FromImage(newBitmap);

       

           Rectangle r =3D new Rectangle(0, 0, width, height);

           Color myForeColor =3D Color.Black;

           Color myBackColor =3D Color.White;

           Font myFont =3D 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 =3D chartData;

            this.g =3D g;

            this.r =3D r;

            this.backColor =3D backColor;

            this.foreColor =3D foreColor;

            this.baseFont =3D baseFont;

            this.legendFont =3D new Font(baseFont.FontFamily, 

(baseFont.Size * 2/3), baseFont.Style | FontStyle.Bold);





            g.SmoothingMode =3D SmoothingMode.AntiAlias;



            CalculateChartDimensions();

           

            DrawBackground();

            InternalDrawChart() ;

        }



        private void CalculateChartDimensions() {



            right =3D r.Width - 5;

            top =3D 5 * baseFont.Size ;

            bottom =3D r.Height - baseFont.Size * 2;



            tickCount =3D chartData.YMin ;

            yCount =3D (chartData.YMax-chartData.YMin) / 

chartData.YTickSize ;

            hspacing =3D (bottom-top) / yCount;

            vspacing =3D (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 =3D 

g.MeasureString(chartData.YMax.ToString(), baseFont).Width;

            float firstXTitle =3D 

g.MeasureString(chartData.XAxisTitles[0], baseFont).Width;



            left =3D (maxYTextSize > firstXTitle) ? maxYTextSize : 

firstXTitle ;

            left =3D r.X + left + 5 ;



            //Calculate size of legend box



            float maxLegendWidth =3D 0 ;

            float maxLegendHeight =3D 0 ;



            //Work out size of biggest legend

            foreach (ChartLine cl in chartData.Lines) {

                float currentWidth =3D g.MeasureString(cl.Title, 

legendFont).Width;

                float currentHeight =3D g.MeasureString(cl.Title, 

legendFont).Height;

                maxLegendWidth =3D (maxLegendWidth > currentWidth) ? 

maxLegendWidth : currentWidth ;

                maxLegendHeight =3D (maxLegendHeight > currentHeight) ? 

maxLegendHeight : currentHeight ;

            }



            legendRect =3D new RectangleF(r.X+2, r.Y+2, maxLegendWidth + 

25 + 5, ((maxLegendHeight+2)*chartData.Lines.Count) + 3) ;

        }



        private void DrawBackground() {

            LinearGradientBrush b =3D 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 =3D DateTime.ToString(DateTime.Now) ;

            SizeF textsize =3D 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 =3D new Pen(chartData.GridColor) ;



            //Vertical - include tick desc's

            if (chartData.ShowVGridLines) {

                for (int i =3D 0 ; (vspacing * i) < right; i++) {

                    float x =3D left + (vspacing *i);          

                    string desc =3D chartData.XAxisTitles[i];

                    g.DrawLine(gridPen, x,top,x,bottom 

+(baseFont.Size*1/3));

                    SizeF textsize =3D 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 =3D bottom ; i > top; i-=3Dhspacing) {

                    string desc =3D tickCount.ToString();

                    tickCount+=3DchartData.YTickSize;

                    g.DrawLine(gridPen, right, i, left-3, i);

                    SizeF textsize =3D 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 =3D new Pen(chartLine.Color);

            linePen.StartCap =3D LineCap.Round;

            linePen.EndCap =3D LineCap.Round;

            linePen.Width =3D chartLine.Width ;

            linePen.DashStyle =3D chartLine.LineStyle;



            PointF[] Values =3D new PointF[chartLine.Values.Length];

            float scale =3D hspacing / chartData.YTickSize ;



            for (int i =3D 0 ; i < chartLine.Values.Length; i++) {

                float x =3D left + vspacing * i;          

                Values[i] =3D 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 =3D new 

LinearGradientBrush(legendRect, backColor, Color.SteelBlue, 

LinearGradientMode.Horizontal);

            r.Inflate(-1, -1);

            g.FillRectangle(b, legendRect);

            b.Dispose();



            float startY =3D 5;



            foreach (ChartLine cl in chartData.Lines) {

                Pen p =3D new Pen(cl.Color) ;

                p.Width =3D p.Width*4;

                SizeF textsize =3D g.MeasureString(cl.Title, 

legendFont);

                float lineY =3D 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 +=3D (textsize.Height+2);

            }

        }

    }

}









------=_NextPart_000_0047_01C03369.DA5CA060

Content-Type: text/plain;

	name="ATT00046.txt"

Content-Transfer-Encoding: 7bit

Content-Disposition: attachment;

	filename="ATT00046.txt"





| [aspngbeta] member fredrik.normen@e... = YOUR ID

| http://www.asplists.com/asplists/aspngbeta.asp = JOIN/QUIT

| http://www.asplists.com/search = SEARCH Archives

------=_NextPart_000_0047_01C03369.DA5CA060--



Message #2 by "Anders Lundholm" <lundholm@s...> on Wed, 11 Oct 2000 13:25:54 +0200
I don't get a correct image Fredrik! All I see is a broken image in my

browser. I've checked that all components are properly compiled

(interpreted). Am I missing something?



Looks really great though! Clean code ..



with regards

anders lundholm · lundholm@s...

the sphereworx / monoliner experience

--





Message #3 by =?iso-8859-1?Q?Fredrik_Norm=E9n?= <fredrik.normen@e...> on Wed, 11 Oct 2000 14:34:41 +0200
hmm,



I have no problem with that..

Have you change line 57 from



if (Symbols <> nothing) then



to:



if (Not Symbols Is nothing) then



I only copy the file to my virtual directory add an \bin directory,

and run the mk.bat file.



/Fredrik Normen







-----Original Message-----

From: Anders Lundholm [mailto:lundholm@s...]

Sent: den 11 oktober 2000 13:26

To: ASP+

Subject: [aspx] Re: Image Generation Sample...





I don't get a correct image Fredrik! All I see is a broken image in my

browser. I've checked that all components are properly compiled

(interpreted). Am I missing something?



Looks really great though! Clean code ..



with regards

anders lundholm · lundholm@s...

the sphereworx / monoliner experience

--









Message #4 by "Anders Lundholm" <lundholm@s...> on Wed, 11 Oct 2000 16:46:44 +0200
When running the imagegenerator_vb.aspx file itself, I get an error at line

5.



"BC30466: The namespace or type 'ChartGenerator' for the import

'ChartGenerator' cannot be found."



Line 5:  <%@ Import Namespace="ChartGenerator" %>



I have copied everything to a new directory and made it a virtual directory.

The MK file has also been invoked, and it worked!



with regards

anders lundholm · lundholm@s...

the sphereworx / monoliner experience

--





Message #5 by =?iso-8859-1?Q?Fredrik_Norm=E9n?= <fredrik.normen@e...> on Thu, 12 Oct 2000 08:54:56 +0200
This is a multi-part message in MIME format.



------=_NextPart_000_0010_01C03427.BE4D26B0

Content-Type: text/plain;

	charset="iso-8859-1"

Content-Transfer-Encoding: 8bit



hi,



Hmm, if the ChartGenerator.dll is located in the \bin, there should not be

any problem.

Try to unpack this zip file and see if it would work..







/Fredrik Normen





-----Original Message-----

From: Anders Lundholm [mailto:lundholm@s...]

Sent: den 11 oktober 2000 16:47

To: ASP+

Subject: [aspx] Re: Image Generation Sample...





When running the imagegenerator_vb.aspx file itself, I get an error at line

5.



"BC30466: The namespace or type 'ChartGenerator' for the import

'ChartGenerator' cannot be found."



Line 5:  <%@ Import Namespace="ChartGenerator" %>



I have copied everything to a new directory and made it a virtual directory.

The MK file has also been invoked, and it worked!



with regards

anders lundholm · lundholm@s...

the sphereworx / monoliner experience

--







---

FREE WEB DEVELOPMENT CODE, CONTENT, AND INSIGHTS

IN YOUR INBOX!

Get the latest and best HTML, XML, and JavaScript tips, tools, and

developments from the experts.  Sign up for one or more of EarthWeb?s

FREE IT newsletters at http://www.earthweb.com today!






------=_NextPart_000_0010_01C03427.BE4D26B0

Content-Type: application/x-zip-compressed;

	name="imagegen.zip"

Content-Transfer-Encoding: base64

Content-Disposition: attachment;

	filename="imagegen.zip"



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



------=_NextPart_000_0010_01C03427.BE4D26B0--



Message #6 by "Anders Lundholm" <lundholm@s...> on Thu, 12 Oct 2000 16:31:39 +0200
Hello!



It works now. I had a sub-directory below the website-directory where I

placed the /bin directory. The sub-directory actually was a virtual

directory, but not defined as a website.



I guess the /bin only is supposed to reside in the root of the

website-directory?!



The graph-page is really awesome. It surely shows what is possible with the

framework and the classes. Some of collegues have been working heavily with

the ASPImage component. It seems like it's becoming obsolete now!



Is it possible to do antialiased text too? I didn't see that in the

documentation!



Thanks in advance!



with regards

anders lundholm · lundholm@s...

the sphereworx / monoliner experience

--






  Return to Index