String *I am String* (自由大过天) 路漫漫其修远兮,吾以上下而求索

(道,可道,非常道)-----天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。

导航

在浏览器里动态加载图片

Posted on 2004-06-16 23:24  goodbaby  阅读(1676)  评论(3)    收藏  举报

如果想在你的页面动态的加载一个动态生成饼图以显示某种统计情况,比如某种型号产品销售比列
等等,你可以在你的页面里用<img src=“PieChart.aspx“>来加载他,下午画了一个图,没把在写上去,
但是大概的可以了。下面是PieChart.aspx

namespace PieChart
{
 /// <summary>
 /// WebForm1 的摘要说明。
 /// </summary>
 public class WebForm1 : System.Web.UI.Page
 {
  private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
            Response.ContentType="image/gif";//设置响应为gif
   DrawPieChart(getDataSet(),420,250);//调用绘图方法
  }
  private void DrawPieChart(DataSet dsData,int iWidth,int iHeight)
  {
            Bitmap oBitMap=new Bitmap(iWidth,iHeight);
   Graphics oGraphics=Graphics.FromImage(oBitMap);
            Pen oPen=new Pen(Color.Black,1);
   SolidBrush oBrush=new SolidBrush(Color.White);
   oGraphics.FillRectangle(oBrush,0,0,oBitMap.Width,oBitMap.Height);//将位图刷白
            Color[] aColor=GetColorArray();//颜色数组
   Rectangle oRectPie=new Rectangle(0,0,oBitMap.Height-5,oBitMap.Height-5);//设置绘图位置
            Rectangle oRectShadow=new Rectangle(0,0,oBitMap.Height,oBitMap.Height);//设置阴影位置
   Color cShadow=Color.FromArgb(153,153,153);//阴影颜色
   oBrush.Color=cShadow;
   oGraphics.FillEllipse(oBrush,oRectShadow);//绘阴影
   
   DataRowCollection colRows;
   colRows=dsData.Tables[0].Rows;//获取数据行集对象
            int iRowIndex=0;
   Single fSliceStart=0;//饼图开始点
   Single fSliceDegrees=0;//度数
   Double fTotalValue=0;
   Double fSliceValue=0;
   foreach( DataRow oRow in colRows)
   {

    try
    {
     fTotalValue+=(int)oRow[0];
    }
    catch
    {
    }
            }
   //计算总数
   foreach(DataRow oRow in colRows)
   {
    try
    {
     fSliceValue=(int)oRow[0];
     
    }
    catch
    {
     fSliceValue=0;
    }
                fSliceDegrees=(Single)(fSliceValue/fTotalValue)*360;//每个成分占饼图的度数
    Trace.Warn(fSliceDegrees.ToString());
                oBrush.Color=aColor[iRowIndex];
    oGraphics.FillPie(oBrush,oRectPie,fSliceStart,fSliceDegrees);//绘扇形区
    oGraphics.DrawPie(oPen,oRectPie,fSliceStart,fSliceDegrees);//扇形区边线
    fSliceStart+=fSliceDegrees;
    iRowIndex+=1;
   }
   oBitMap.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Gif);//将图片写到流
   //释放资源
   oPen.Dispose();
   oBrush.Dispose();
   oGraphics.Dispose();
   oBitMap.Dispose();
  }
  //获取颜色数组
  private Color[] GetColorArray()
  {
            Color[] aColors=new Color[10];
   aColors[0]=Color.FromArgb(204,0,0);
   aColors[1]=Color.FromArgb(255,153,0);
   aColors[2]=Color.FromArgb(255,255,0);
   aColors[3]=Color.FromArgb(0,255,255);
   aColors[4]=Color.FromArgb(51,102,255);
   aColors[5]=Color.FromArgb(255,0,255);
   aColors[6]=Color.FromArgb(102,0,102);
   aColors[7]=Color.FromArgb(153,0,0);
   aColors[8]=Color.FromArgb(0,102,0);
   aColors[9]=Color.FromArgb(51,51,102);
   return aColors;
           
  }
  //从数据库获取各成分量
  private DataSet getDataSet()
  {
   string ConnectionString=ConfigurationSettings.AppSettings["ConnectionString"];
   DataSet myDS=new DataSet();
   SqlConnection myCon=new SqlConnection(ConnectionString);
   SqlCommand myCmd=new SqlCommand("select result=sum(Acount) from Catagory group by CatagoryName",myCon);
   SqlDataAdapter myDA=new SqlDataAdapter();
   myDA.SelectCommand=myCmd;
   try
   {
    if(myCon.State.ToString()!="Open")
    {
     myCon.Open();
    }
    myDA.Fill(myDS);
    myCon.Close();
        return myDS;
   }
   catch(DataException ex)
   {
    myCon.Close();
    Trace.Warn(ex.Message);
                return null;
   }

  }
当然,每次都向客户端写图片,性能要受影响的,你可以oBitMap.Save(“你的路径“,ImageFormat.Gif)
按一定时间更新。