GDI+ 绘图紧急求助

hz890 2007-04-13 09:33:39
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();
}
...全文
364 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
最后一只恐龙 2007-04-16
  • 打赏
  • 举报
回复
存为jpg一般会模糊,gif要好一些,bmp最好,但个头大了点。
lilopeng 2007-04-16
  • 打赏
  • 举报
回复
试试做成png的呢。
自然框架 2007-04-16
  • 打赏
  • 举报
回复
up
berlin8600 2007-04-16
  • 打赏
  • 举报
回复
Graphics objGraphics = Graphics.FromImage(objBitmap);
objGraphics.SmoothingMode = SmoothingMode.AntiAlias;
你试试把这个属性改过来试试,以前做饼图时用它来消除锯齿来着
你这儿也没准管用。
blackant2 2007-04-13
  • 打赏
  • 举报
回复
你不保存成jpg,先保存成bitmap看看
如果还是模糊
可能真是绘出的原图的确模糊(可能性比较小)

如果是清晰的,可以以高保真方式保存为jpg/gif看看哪个更清晰
我对图形没了解,好象JPG会造成线性失真,gif会会造成色彩失真
所以你应该保存为gif可能会更好些

ps:Encoder.Quality 取值超过100是没有意义的
hz890 2007-04-13
  • 打赏
  • 举报
回复
To:blackant2(乔峰)
从0-100精度越高越清晰
我加到500000000000效果还是不明显
效果图:
http://www38.websamba.com/hz891/images/line1.jpg
http://www38.websamba.com/hz891/images/bar1.jpg
littlekeen 2007-04-13
  • 打赏
  • 举报
回复
gdi+很久没用了,学习一下
blackant2 2007-04-13
  • 打赏
  • 举报
回复
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精度越高越清晰
hz890 2007-04-13
  • 打赏
  • 举报
回复
多谢blackant2(乔峰)
不知level值如何获取?
blackant2 2007-04-13
  • 打赏
  • 举报
回复
这是我在网上找到一段代码,试试看看

//处理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);
hz890 2007-04-13
  • 打赏
  • 举报
回复
To blackant2(乔峰):
保存成jpg时失真是何意,有办法解决吗?
blackant2 2007-04-13
  • 打赏
  • 举报
回复
不是画的不清
是保存成jpg时失真
b.Save(Server.MapPath(path),System.Drawing.Imaging.ImageFormat.Jpeg);
hz890 2007-04-13
  • 打赏
  • 举报
回复
//绘制企业数据(柱状图)
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]["marketSum"])/yScaleValue);
rectY=Y1;
rectHeight=yScale*(Convert.ToSingle(dt.Rows[j]["marketSum"])/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);
}
}
GXY2005 2007-04-13
  • 打赏
  • 举报
回复
好长帮顶!
hz890 2007-04-13
  • 打赏
  • 举报
回复
//绘制柱状图
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;
}
littlekeen 2007-04-13
  • 打赏
  • 举报
回复
看着还行啊。
感觉字体可以换一下试试
hz890 2007-04-13
  • 打赏
  • 举报
回复
//绘制企业数据
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]["marketSum"])/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;
}
hz890 2007-04-13
  • 打赏
  • 举报
回复
//绘制折线图
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;
}
hz890 2007-04-13
  • 打赏
  • 举报
回复
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;
}
}
}
hz890 2007-04-13
  • 打赏
  • 举报
回复
看来只能将此问题暂时搁置!
虽然问题无法解决,还是多谢各位了!
加载更多回复(1)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧