http://www38.websamba.com/hz891/images/line.jpg
http://www38.websamba.com/hz891/images/bar.jpg
上面的两张图片是利用GDI+绘制的,但是图片效果朦胧不清,不知问题何在,现贴出代码,望诸位高手赐教解决:using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Microsoft.Web.UI.WebControls;
using OceanSoft.Pantheon.DAO;
using KMP50._2052.Aspx.Common_Class;
using System.IO;
using System.Diagnostics;namespace KMP50._2052.Aspx.WJ_Collect.Aspx
{
/// <summary>
/// DataChart 的摘要说明。
/// </summary>
public class DataChart : System.Web.UI.Page
{
protected System.Web.UI.WebControls.RadioButton rdCompany;
protected System.Web.UI.WebControls.Image Image1;
protected System.Web.UI.WebControls.DropDownList ddlYear;
protected System.Web.UI.WebControls.DropDownList ddlMonth;
protected System.Web.UI.WebControls.DropDownList ddlCompany;
protected System.Web.UI.WebControls.RadioButton rdDistrict;
protected Microsoft.Web.UI.WebControls.Toolbar tlbAddressList;
WJ_EnterpriseSummaryCtl WJESCtl=new WJ_EnterpriseSummaryCtl();
WJ_EnterpriseSummaryEnt WJESEnt=new WJ_EnterpriseSummaryEnt();
protected System.Web.UI.WebControls.Image Image2;
DataSet ds;

private Bitmap b ;
private Graphics g ;

int width=0,height=0; //画布宽度和高度
float x_width=0,y_height=0; //x轴和y轴长度
float X0=0,Y0=0; //x轴和y轴起始点

float X1=0,Y1=0,X2=0,Y2=0; //两组坐标

float xScale=0; //x轴刻度长度
float yScale=0; //y轴刻度长度
float yScaleValue=0; //y轴单位刻度值
int year=0; //年数:1年/2年/3年
int month=0; //月数:1个月,2个月,......12个月
int ny=5;//将y轴均分5份 string company="",companyGuid=""; //企业名称,企业Guid


public DataChart()
{
width=500;
height=350;
x_width=width*7/10;
y_height=height*7/10;
b = new Bitmap(width,height);

g = Graphics.FromImage ( b ) ;

//呈现质量设置为高
g.SmoothingMode = SmoothingMode.HighQuality;

//关联插补模式设置为高质量双三次插值法
g.InterpolationMode=InterpolationMode.HighQualityBicubic; //设置合成图像的呈现质量为高
g.CompositingQuality=CompositingQuality.HighQuality;

//设置坐标度量单位为像素
g.PageUnit=GraphicsUnit.Pixel;

//设置像素偏移质量为高
g.PixelOffsetMode=PixelOffsetMode.HighQuality;
}

~DataChart()
{
g.Dispose();
b.Dispose();
System.GC.Collect();
}

解决方案 »

  1.   

    private void DrawImage()
    {
    // if(rdCompany.Checked) //绘制企业经营图表
    // {
    // Image1.ImageUrl="Line.aspx?company="+ddlCompany.SelectedValue.Trim()+
    // "&year="+ddlYear.SelectedValue.Trim()+"&month="+ddlMonth.SelectedValue.Trim();
    // Image2.ImageUrl="histogram.aspx?company="+ddlCompany.SelectedValue.Trim()+
    // "&year="+ddlYear.SelectedValue.Trim()+"&month="+ddlMonth.SelectedValue.Trim();
    // }
    // else //绘制全区企业经营图表
    // {
    // Image1.ImageUrl="Line.aspx?company=all"+
    // "&year="+ddlYear.SelectedValue.Trim()+"&month="+ddlMonth.SelectedValue.Trim();
    // Image2.ImageUrl="histogram.aspx?company=all"+
    // "&year="+ddlYear.SelectedValue.Trim()+"&month="+ddlMonth.SelectedValue.Trim();
    // }
    // Image1.Visible=true;
    // Image2.Visible=true; if(rdCompany.Checked)
    {
    companyGuid=ddlCompany.SelectedValue.Trim();
    }
    else
    {
    companyGuid="all";
    }
    string path="DataSummary";
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    path="DataSummary/images";
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }

    path="DataSummary/images/"+companyGuid;
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    DeleteFiles(path,"*.jpg");
    DrawLineChart();
    DrawBarChart();
    }

    //清空在指定目录下生成的所有指定文件!
    private void DeleteFiles(string DirectoryName,string FileName)
    {
    DirectoryInfo di;
    FileInfo[] fi;
    di=new DirectoryInfo(Server.MapPath(DirectoryName));
    fi=di.GetFiles(FileName);
    foreach(FileInfo f in fi)
    {
    f.Delete();
    }
    }

    //将图片导出至Excel(弹出新窗口下载)
    private void ExportExcel()
    {
    DrawImage();
    if(rdCompany.Checked)
    {
    company=ddlCompany.SelectedItem.Text.Trim();
    companyGuid=ddlCompany.SelectedValue.Trim();
    }
    else
    {
    company="吴江开发区企业";
    companyGuid="all";
    }
    Response.Write("<script language='javascript'>window.open('ExportExcel.aspx?company="
    +Server.UrlEncode(company)+"&companyGuid="+Server.UrlEncode(companyGuid)
    +"&Line="+Server.UrlEncode(Image1.ImageUrl)
    +"&Bar="+Server.UrlEncode(Image2.ImageUrl)
    +"&year="+year
    +"&month="+month
    +"','ExportExcel','width=500,height=500,directories=no,location=no,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,toolbar=no')</script>");
    }

    private void tlbAddressList_ButtonClick(object sender, System.EventArgs e)
    {
    if (sender is ToolbarButton)
    {
    if(rdCompany.Checked)
    {
    if(ddlCompany.SelectedValue.Trim().Length<1)
    {
    Alert("请选择企业!");
    Image1.Visible=false;
    Image2.Visible=false;
    return;
    }
    }
    if(ddlYear.SelectedIndex==0)
    {
    Alert("请选择阶段(年)!");
    Image1.Visible=false;
    Image2.Visible=false;
    return;
    }
    if(ddlMonth.SelectedIndex==0)
    {
    Alert("请选择阶段(月份)!");
    Image1.Visible=false;
    Image2.Visible=false;
    return;
    }

    year=int.Parse(ddlYear.SelectedValue.Trim());
    month=int.Parse(ddlMonth.SelectedValue.Trim());
    DataTable dt;
    int recCount=0;
    if(rdCompany.Checked)
    {
    companyGuid=ddlCompany.SelectedValue.Trim();
    ds=WJESCtl.GetQueryList("companyGuid='"+companyGuid+"' and sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    dt=ds.Tables[0];
    recCount=dt.Rows.Count;
    if(recCount<1)
    {
    Alert("对不起,当前所选范围没有任何数据!");
    Image1.Visible=false;
    Image2.Visible=false;
    return;
    }
    }
    else if(rdDistrict.Checked)
    {
    ds=WJESCtl.GetDistrictQueryList("sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    dt=ds.Tables[0];
    recCount=dt.Rows.Count;
    if(recCount<1)
    {
    Alert("对不起,当前所选范围没有任何数据!");
    Image1.Visible=false;
    Image2.Visible=false;
    return;
    }
    }

    ToolbarButton tbn=(ToolbarButton)sender;
    switch(tbn.ID)
    {
    case "cmdChart":
    DrawImage();
    break;
    case "cmdExport":
    ExportExcel();
    break;
    default:
    break;
    }
    }
    }
      

  2.   

    //绘制折线图
    private void DrawLineChart()
    {
    g.Clear(Color.SeaShell);
    //绘制x轴
    X1=(width-x_width)/2;
    X0=X1;
    Y1=(height-y_height)/2+y_height;
    Y0=Y1;
    X2=X1+x_width;
    Y2=Y1;
    PointF pt1;
    pt1=new PointF(X1,Y1);
    PointF pt2;
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(new SolidBrush(Color.Black),1.5f),pt1,pt2);

    //绘制x轴箭头
    PointF [] PolygonPoint=new PointF[3];
    PolygonPoint[0]=new PointF(X2,Y0-4);
    PolygonPoint[1]=new PointF(X2,Y0+4);
    PolygonPoint[2]=new PointF(X2+4,Y0);
    g.FillPolygon(new SolidBrush(Color.Black),PolygonPoint);
    // g.DrawString("1",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X1-5,Y0+5));


    //绘制y轴
    X1=X0;
    X2=X0;
    Y2=Y0-y_height;
    pt1=new PointF(X1,Y1);
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(new SolidBrush(Color.Black),1.5f),pt1,pt2);

    //绘制y轴箭头
    PolygonPoint[0]=new PointF(X0-4,Y2);
    PolygonPoint[1]=new PointF(X0+4,Y2);
    PolygonPoint[2]=new PointF(X0,Y2-4);
    g.FillPolygon(new SolidBrush(Color.Black),PolygonPoint);

    g.DrawString("0",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X1-15,Y0-7));

    if(companyGuid!="all") //企业
    { //绘制x轴刻度

    if(month>0)
    {
    //解方程:xScale*month+xScale/2+xScale/5=x_width 得:xScale=10*x_width/(10*month+7) 使x轴富余7/10(1/2+1/5)个刻度
    xScale=10*x_width/(10*month+7);
    }
    Y2=Y0-5;

    for(int i=1;i<=month;i++)
    {
    X1=X0+i*xScale;
    pt1=new PointF(X1,Y1);
    X2=X1;
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(new SolidBrush(Color.Black),1),pt1,pt2);
    g.DrawString(i.ToString(),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X2-5,Y0+5));
    }
    //绘制y轴刻度

    //解方程:yScale*ny+yScale/3=y_height,得:yScale=3*y_height/(3*ny+1) 使y轴富余1/3个刻度
    yScale=3*y_height/(3*ny+1);

    X2=X1+x_width;

    decimal maxSum=0;
    maxSum=WJESCtl.getMaxMarketSum("companyGuid='"+companyGuid+"' and sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    maxSum+=10000;
    yScaleValue=Convert.ToSingle(maxSum/ny);
    float scv=0;
    for(int i=1;i<=ny;i++)
    {
    X1=X0;
    Y1=Y0-i*yScale;
    X2=X0+5;
    Y2=Y1;
    pt1=new PointF(X1,Y1);
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(new SolidBrush(Color.Black),1),pt1,pt2);
    scv=yScaleValue*i;
    g.DrawString(Convert.ToString(scv),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X0-Convert.ToString(scv).Length*7,Y1-7));
    }

    //绘制企业数据

    for(int i=0;i<year;i++)
    {
    switch(i)
    {
    case 0:
    DrawCompanyData(i,Color.Purple,Brushes.Purple);
    break;
    case 1:
    DrawCompanyData(i,Color.Green,Brushes.Green);
    break;
    case 2:
    DrawCompanyData(i,Color.Orange,Brushes.Orange);
    break;
    }
    }


    //绘制图例
    PointF pf1,pf2,pf3;

    for(int i=0;i<year;i++)
    {
    pf1=new PointF(X0+x_width+5,Y0-y_height+i*25);
    pf2=new PointF(X0+x_width+5+15,Y0-y_height+i*25);
    pf3=new PointF(X0+x_width+5+15+5,Y0-y_height+i*25-5);
    g.DrawLine(new Pen(new SolidBrush(getColor(DateTime.Now.Year-i)),1),pf1,pf2);
    g.DrawString(Convert.ToString(DateTime.Now.Year-i),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3);
    }


    //绘制y轴标题
    pf3=new PointF(X0-35,Y0-y_height-25);
    g.DrawString("营业收入:元",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制x轴标题
    pf3=new PointF(X0+x_width+5,Y0-5);
    g.DrawString("月份",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制图表标题
    pf3=new PointF(X0+x_width/2-70,Y0-y_height-20);
    string companyName="";
    companyName=Convert.ToString(DataBase.GetSingle("select companyName from CompanySummaryData_V where companyGuid='"+companyGuid+"'"));
    g.DrawString(companyName+"年度月营业状况",new Font("黑体",14,FontStyle.Bold,GraphicsUnit.Pixel),Brushes.Black,pf3);
    }
    else //开发区
    {

    //绘制x轴刻度
    if(month>0)
    {
    //解方程:xScale*month+xScale/2+xScale/5=x_width 得:xScale=10*x_width/(10*month+7) 使x轴富余7/10(1/2+1/5)个刻度
    xScale=10*x_width/(10*month+7);
    }
    Y2=Y0-5;

    for(int i=1;i<=month;i++)
    {
    X1=X0+i*xScale;
    pt1=new PointF(X1,Y1);
    X2=X1;
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(new SolidBrush(Color.Black),1),pt1,pt2);
    g.DrawString(i.ToString(),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X2-5,Y0+5));
    }

    //绘制y轴刻度

    //解方程:yScale*ny+yScale/3=y_height,得:yScale=3*y_height/(3*ny+1) 使y轴富余1/3个刻度
    yScale=3*y_height/(3*ny+1);


    X2=X1+x_width;

    decimal maxSum=0;
    maxSum=WJESCtl.getMaxDistrictMarketSum("sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    maxSum+=10000;
    yScaleValue=Convert.ToSingle(maxSum/ny);
    float scv=0;
    for(int i=1;i<=ny;i++)
    {
    X1=X0;
    Y1=Y0-i*yScale;
    X2=X0+5;
    Y2=Y1;
    pt1=new PointF(X1,Y1);
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(new SolidBrush(Color.Black),1),pt1,pt2);
    scv=yScaleValue*i;
    g.DrawString(Convert.ToString(scv),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X0-Convert.ToString(scv).Length*7,Y1-7));
    }
    //绘制开发区数据

    for(int i=0;i<year;i++)
    {
    switch(i)
    {
    case 0:
    DrawDistrictData(i,Color.Purple,Brushes.Purple);
    break;
    case 1:
    DrawDistrictData(i,Color.Green,Brushes.Green);
    break;
    case 2:
    DrawDistrictData(i,Color.Orange,Brushes.Orange);
    break;
    }
    } //绘制图例
    PointF pf1,pf2,pf3;

    for(int i=0;i<year;i++)
    {
    pf1=new PointF(X0+x_width+5,Y0-y_height+i*25);
    pf2=new PointF(X0+x_width+5+15,Y0-y_height+i*25);
    pf3=new PointF(X0+x_width+5+15+5,Y0-y_height+i*25-5);
    g.DrawLine(new Pen(new SolidBrush(getColor(DateTime.Now.Year-i)),1),pf1,pf2);
    g.DrawString(Convert.ToString(DateTime.Now.Year-i),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3);
    }

    //绘制y轴标题
    pf3=new PointF(X0-35,Y0-y_height-25);
    g.DrawString("月平均营业收入:元",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制x轴标题
    pf3=new PointF(X0+x_width+5,Y0-5);
    g.DrawString("月份",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制图表标题
    pf3=new PointF(X0+x_width/2-70,Y0-y_height-20);
    g.DrawString("吴江开发区企业年度月营业状况",new Font("黑体",14,FontStyle.Bold,GraphicsUnit.Pixel),Brushes.Black,pf3);
    }

    string path="DataSummary";
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    path="DataSummary/images";
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    path="DataSummary/images/"+companyGuid;
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    string fileName=companyGuid+"_"+DateTime.Now.ToString("yyyyMMddHHmmss")+"_line.jpg";
    path+="/"+fileName.Trim();
    // ImageManipulation.Quantizer quaniz = new ImageManipulation.OctreeQuantizer(255,8);
    // quaniz.Quantize(b);
    b.Save(Server.MapPath(path),System.Drawing.Imaging.ImageFormat.Jpeg);
    Image1.ImageUrl=path;
    Image1.Visible=true;
    }
      

  3.   

    //绘制企业数据
    private void DrawCompanyData(int year,Color clr,Brush bsh)
    {
    DataTable dt;
    ds=WJESCtl.GetQueryList("companyGuid='"+companyGuid+"' and sumYear="+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    dt=ds.Tables[0];
    int recCount=0;
    recCount=dt.Rows.Count;

    PointF [] ptData;
    if(recCount>0)
    {
    ptData=new PointF[recCount];
    for(int i=0;i<recCount;i++)
    {
    X1=xScale*(Convert.ToInt32(dt.Rows[i]["sumMonth"]))+X0;
    Y1=Y0-yScale*(Convert.ToSingle(dt.Rows[i]["etSum"])/yScaleValue);
    ptData[i]=new PointF(X1,Y1);
    g.FillEllipse(bsh,X1-2.5f,Y1-2.5f,5.0f,5.0f);
    if(i>0)
    {
    g.DrawLine(new Pen(new SolidBrush(clr),1),ptData[i-1],ptData[i]);
    }
    }
    }
    }
    //绘制开发区企业平均数据
    private void DrawDistrictData(int year,Color clr,Brush bsh)
    {
    DataTable dt;
    ds=WJESCtl.GetDistrictQueryList("sumYear="+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    dt=ds.Tables[0];
    int recCount=0;
    recCount=dt.Rows.Count;

    PointF [] ptData;
    if(recCount>0)
    {
    ptData=new PointF[recCount];
    for(int i=0;i<recCount;i++)
    {
    X1=xScale*(Convert.ToInt32(dt.Rows[i]["sumMonth"]))+X0;
    Y1=Y0-yScale*(Convert.ToSingle(dt.Rows[i]["AvgSum"])/yScaleValue);
    ptData[i]=new PointF(X1,Y1);
    g.FillEllipse(bsh,X1-2.5f,Y1-2.5f,5.0f,5.0f);
    if(i>0)
    {
    g.DrawLine(new Pen(new SolidBrush(clr),1),ptData[i-1],ptData[i]);
    }
    }
    }
    }
    private Color getColor(int year)
    {
    Color clr;
    if(year==DateTime.Now.Year)
    {
    clr=Color.Purple;
    }
    else if(year==DateTime.Now.Year-1)
    {
    clr=Color.Green;
    }
    else if(year==DateTime.Now.Year-2)
    {
    clr=Color.Orange;
    }
    else
    {
    clr=Color.White;
    }
    return clr;
    }
      

  4.   

    //绘制柱状图
    private void DrawBarChart()
    {
    if(rdCompany.Checked)
    {
    company=ddlCompany.SelectedItem.Text.Trim();
    companyGuid=ddlCompany.SelectedValue.Trim();
    }
    else
    {
    company="开发区";
    companyGuid="all";
    }

    try
    {
    year=int.Parse(ddlYear.SelectedValue.Trim());
    }
    catch
    {
    return;
    }

    try
    {
    month=int.Parse(ddlMonth.SelectedValue.Trim());
    }
    catch
    {
    return;
    }


    //g.FillRectangle ( new SolidBrush (Color.SeaShell),0 ,0, width,height);
    g.Clear(Color.SeaShell);
    //绘制x轴
    X1=(width-x_width)/2;
    X0=X1;
    Y1=(height-y_height)/2+y_height;
    Y0=Y1;
    X2=X1+x_width;
    Y2=Y1;
    PointF pt1;
    pt1=new PointF(X1,Y1);
    PointF pt2;
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(Color.Black,1.5f),pt1,pt2); //绘制x轴箭头
    PointF [] PolygonPoint=new PointF[3];
    PolygonPoint[0]=new PointF(X2,Y0-4);
    PolygonPoint[1]=new PointF(X2,Y0+4);
    PolygonPoint[2]=new PointF(X2+4,Y0);
    g.FillPolygon(new SolidBrush(Color.Black),PolygonPoint);
    // g.DrawString("0",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X1-5,Y0+5));


    //绘制y轴
    X1=X0;
    X2=X0;
    Y2=Y0-y_height;
    pt1=new PointF(X1,Y1);
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(Color.Black,1.5f),pt1,pt2); //绘制y轴箭头
    PolygonPoint[0]=new PointF(X0-4,Y2);
    PolygonPoint[1]=new PointF(X0+4,Y2);
    PolygonPoint[2]=new PointF(X0,Y2-4);
    g.FillPolygon(new SolidBrush(Color.Black),PolygonPoint);

    g.DrawString("0",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X1-15,Y0-7));

    if(companyGuid!="all") //企业
    {

    //绘制x轴刻度

    if(month>0)
    {
    //解方程:xScale*month+xScale/2+xScale/5=x_width 得:xScale=10*x_width/(10*month+7) 使x轴富余7/10(1/2+1/5)个刻度
    xScale=10*x_width/(10*month+7);
    }
    Y2=Y0-5;

    for(int i=1;i<=month;i++)
    {
    X1=X0+i*xScale;
    pt1=new PointF(X1,Y1);
    X2=X1;
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(Color.Black,1),pt1,pt2);
    g.DrawString((i).ToString(),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X2-5,Y0+5));
    }
    //绘制y轴刻度

    //解方程:yScale*ny+yScale/3=y_height,得:yScale=3*y_height/(3*ny+1) 使y轴富余1/3个刻度
    yScale=3*y_height/(3*ny+1);

    X2=X1+x_width;

    decimal maxSum=0;
    maxSum=WJESCtl.getMaxMarketSum("companyGuid='"+companyGuid+"' and sumYear>="+(DateTime.Now.Year-year+1)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    maxSum+=10000;
    yScaleValue=Convert.ToSingle(maxSum/ny);
    float scv=0;
    for(int i=1;i<=ny;i++)
    {
    X1=X0;
    Y1=Y0-i*yScale;
    X2=X0+5;
    Y2=Y1;
    pt1=new PointF(X1,Y1);
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(Color.Black,1),pt1,pt2);
    scv=yScaleValue*i;
    g.DrawString(Convert.ToString(scv),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X0-Convert.ToString(scv).Length*7,Y1-7));
    }

    //绘制企业数据
    DrawBarCompanyData();

    PointF pf3;
    //绘制y轴标题
    pf3=new PointF(X0-35,Y0-y_height-25);
    g.DrawString("营业收入:元",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制x轴标题
    pf3=new PointF(X0+x_width+5,Y0-5);
    g.DrawString("月份",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制图表标题
    pf3=new PointF(X0+x_width/2-70,Y0-y_height-20);
    string companyName="";
    companyName=Convert.ToString(DataBase.GetSingle("select companyName from CompanySummaryData_V where companyGuid='"+companyGuid+"'"));
    // StringFormat sf=new StringFormat();
    // sf.Alignment=StringAlignment.Center;
    g.DrawString(companyName+"年度月营业状况",new Font("黑体",14,FontStyle.Bold,GraphicsUnit.Pixel),Brushes.Black,pf3);
    }
    else //开发区
    {
    //绘制x轴刻度
    if(month>0)
    {
    //解方程:xScale*month+xScale/2+xScale/5=x_width 得:xScale=10*x_width/(10*month+7) 使x轴富余7/10(1/2+1/5)个刻度
    xScale=10*x_width/(10*month+7);
    }

    Y2=Y0-5;

    for(int i=1;i<=month;i++)
    {
    X1=X0+i*xScale;
    pt1=new PointF(X1,Y1);
    X2=X1;
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(Color.Black,1),pt1,pt2);
    g.DrawString((i).ToString(),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X2-5,Y0+5));
    }

    //绘制y轴刻度

    //解方程:yScale*ny+yScale/3=y_height,得:yScale=3*y_height/(3*ny+1) 使y轴富余1/3个刻度
    yScale=3*y_height/(3*ny+1);

    X2=X1+x_width;

    decimal maxSum=0;
    maxSum=WJESCtl.getMaxDistrictMarketSum("sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth<="+month);
    maxSum+=10000;
    yScaleValue=Convert.ToSingle(maxSum/ny);
    float scv=0;
    for(int i=1;i<=ny;i++)
    {
    X1=X0;
    Y1=Y0-i*yScale;
    X2=X0+5;
    Y2=Y1;
    pt1=new PointF(X1,Y1);
    pt2=new PointF(X2,Y2);
    g.DrawLine(new Pen(Color.Black,1),pt1,pt2);
    scv=yScaleValue*i;
    g.DrawString(Convert.ToString(scv),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,new PointF(X0-Convert.ToString(scv).Length*7,Y1-7));
    }
    //绘制开发区数据
    DrawBarDistrictData();
    PointF pf3;
    //绘制y轴标题
    pf3=new PointF(X0-35,Y0-y_height-25);
    g.DrawString("月平均营业收入:元",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制x轴标题
    pf3=new PointF(X0+x_width+5,Y0-5);
    g.DrawString("月份",new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,pf3); //绘制图表标题
    // StringFormat sf=new StringFormat();
    // sf.Alignment=StringAlignment.Center;
    pf3=new PointF(X0+x_width/2-70,Y0-y_height-20);
    g.DrawString("吴江开发区企业年度月营业状况",new Font("黑体",14,FontStyle.Bold,GraphicsUnit.Pixel),Brushes.Black,pf3);
    }

    string path="DataSummary";
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    path="DataSummary/images";
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }

    path="DataSummary/images/"+companyGuid;
    if(!Directory.Exists(Server.MapPath(path)))
    {
    Directory.CreateDirectory(Server.MapPath(path));
    }
    string fileName=companyGuid+"_"+DateTime.Now.ToString("yyyyMMddHHmmss")+"_bar.jpg";
    path+="/"+fileName.Trim();
    b.Save(Server.MapPath(path),System.Drawing.Imaging.ImageFormat.Jpeg);
    Image2.ImageUrl=path;
    Image2.Visible=true;
    }
      

  5.   

    //绘制企业数据(柱状图)
    private void DrawBarCompanyData()
    {
    DataTable dt;
    int recCount=0;

    float rectWidth=0;
    rectWidth=xScale/((2+year)*0.75f); //设置柱状图宽度:x轴刻度长度/(2+year)*0.75)
    float rectHeight=0;
    float rectX=0;
    float rectY=0;

    for(int i=1;i<=month;i++)
    {
    ds=WJESCtl.GetQueryListForHistogram("companyGuid='"+companyGuid+"' and sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth="+i);
    dt=ds.Tables[0];
    recCount=dt.Rows.Count;
    for(int j=0;j<recCount;j++)
    {
    X1=xScale*(Convert.ToInt32(dt.Rows[j]["sumMonth"]))+X0;
    rectX=X1-recCount*rectWidth/2+j*rectWidth;
    Y1=Y0-yScale*(Convert.ToSingle(dt.Rows[j]["etSum"])/yScaleValue);
    rectY=Y1;
    rectHeight=yScale*(Convert.ToSingle(dt.Rows[j]["etSum"])/yScaleValue);
    g.FillRectangle(new SolidBrush(getColor(Convert.ToInt32(dt.Rows[j]["sumYear"]))),rectX,rectY,rectWidth,rectHeight-0.5f); //rectHeight-0.5f:避免柱状图遮挡x轴
    }

    }
    //绘制图例
    rectX=X0+x_width+5;
    rectWidth=20;
    rectHeight=10;
    for(int i=0;i<year;i++)
    {
    rectY=Y0-y_height+(10+rectHeight)*i;
    g.FillRectangle(new SolidBrush(getColor(DateTime.Now.Year-i)),rectX,rectY,rectWidth,rectHeight);
    PointF ptf=new PointF(rectX+rectWidth+5,rectY);
    g.DrawString(Convert.ToString(DateTime.Now.Year-i),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,ptf);
    }
    }
    //绘制开发区企业平均数据(柱状图)
    private void DrawBarDistrictData()
    {
    DataTable dt;
    int recCount=0;

    float rectWidth=0;
    rectWidth=xScale/((2+year)*0.75f); //设置柱状图宽度:x轴刻度长度/(2+year)*0.75)
    float rectHeight=0;
    float rectX=0;
    float rectY=0;

    for(int i=1;i<=month;i++)
    {
    ds=WJESCtl.GetDistrictQueryListForHistogram("sumYear>"+(DateTime.Now.Year-year)+" and sumYear<="+DateTime.Now.Year+" and sumMonth="+i);
    dt=ds.Tables[0];
    recCount=dt.Rows.Count;
    for(int j=0;j<recCount;j++)
    {
    X1=xScale*(Convert.ToInt32(dt.Rows[j]["sumMonth"]))+X0;
    rectX=X1-recCount*rectWidth/2+j*rectWidth;
    Y1=Y0-yScale*(Convert.ToSingle(dt.Rows[j]["AvgSum"])/yScaleValue);
    rectY=Y1;
    rectHeight=yScale*(Convert.ToSingle(dt.Rows[j]["AvgSum"])/yScaleValue);
    // g.DrawRectangle(new Pen(new SolidBrush(Color.Black)),rectX,rectY,rectWidth,rectHeight);
    g.FillRectangle(new SolidBrush(getColor(Convert.ToInt32(dt.Rows[j]["sumYear"]))),rectX,rectY,rectWidth,rectHeight-0.5f); //rectHeight-0.5f:避免柱状图遮挡x轴
    }

    }
    //绘制图例
    rectX=X0+x_width+5;
    rectWidth=20;
    rectHeight=10;
    for(int i=0;i<year;i++)
    {
    rectY=Y0-y_height+(10+rectHeight)*i;
    // g.DrawRectangle(new Pen(new SolidBrush(Color.Black)),rectX,rectY,rectWidth,rectHeight);
    g.FillRectangle(new SolidBrush(getColor(DateTime.Now.Year-i)),rectX,rectY,rectWidth,rectHeight);
    PointF ptf=new PointF(rectX+rectWidth+5,rectY);
    g.DrawString(Convert.ToString(DateTime.Now.Year-i),new Font("黑体",12,GraphicsUnit.Pixel),Brushes.Black,ptf);
    }
    }
      

  6.   

    不是画的不清
    是保存成jpg时失真
    b.Save(Server.MapPath(path),System.Drawing.Imaging.ImageFormat.Jpeg);
      

  7.   

    To blackant2(乔峰):
    保存成jpg时失真是何意,有办法解决吗?
      

  8.   

    这是我在网上找到一段代码,试试看看//处理JPG质量的函数  
      ImageCodecInfo[]   codecs=ImageCodecInfo.GetImageEncoders();    
      ImageCodecInfo   ici=null;  
      foreach(ImageCodecInfo   codec   in   codecs){if(codec.MimeType=="image/jpeg")ici=codec;}  
      EncoderParameters   ep=new   EncoderParameters();  
      ep.Param[0]=new   EncoderParameter(Encoder.Quality,(long)level);  
       
      bm.Save(@"D:\www\SRmis\UploadMail\"+level.ToString()+".jpg",ici,ep);
      

  9.   

    多谢blackant2(乔峰)
    不知level值如何获取?
      

  10.   

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Imaging;namespace SaveJpeg
    {
        class Program
        {
            static void Main(string[] args)
            {
                Bitmap bm = new Bitmap(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\photoimg86.qq.jpg");
                ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
                
                for (int i = 0; i <= 100; i+=10)
                {
                    EncoderParameters ep = new EncoderParameters();
                    ep.Param[0] = new EncoderParameter(Encoder.Quality, (long)i);
                    string fileName=string.Format(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\photoimg86.{0}.jpg",i);
                    bm.Save(fileName, ici, ep);
                }
            }        static ImageCodecInfo GetEncoderInfo(String mimeType)
            {
                int j;
                ImageCodecInfo[] encoders;
                encoders = ImageCodecInfo.GetImageEncoders();
                for (j = 0; j < encoders.Length; ++j)
                {
                    if (encoders[j].MimeType == mimeType)
                        return encoders[j];
                }
                return null;
            }    }
    }这是我刚试过的示例,从0-100精度越高越清晰
      

  11.   

    To:blackant2(乔峰)
    从0-100精度越高越清晰
    我加到500000000000效果还是不明显
    效果图:
    http://www38.websamba.com/hz891/images/line1.jpg
    http://www38.websamba.com/hz891/images/bar1.jpg
      

  12.   

    你不保存成jpg,先保存成bitmap看看
    如果还是模糊
    可能真是绘出的原图的确模糊(可能性比较小)如果是清晰的,可以以高保真方式保存为jpg/gif看看哪个更清晰
    我对图形没了解,好象JPG会造成线性失真,gif会会造成色彩失真
    所以你应该保存为gif可能会更好些ps:Encoder.Quality 取值超过100是没有意义的
      

  13.   

    我用GDI+的还行啊。不过建议一个好的开源软件给你。ZedGraph的最新版本,里面有web控件,那个作的图很清晰很漂亮。你可以借鉴
      

  14.   

    存为jpg一般会模糊,gif要好一些,bmp最好,但个头大了点。
      

  15.   

    Graphics objGraphics = Graphics.FromImage(objBitmap);
    objGraphics.SmoothingMode = SmoothingMode.AntiAlias;
    你试试把这个属性改过来试试,以前做饼图时用它来消除锯齿来着
    你这儿也没准管用。