php实现报表类_[PHP教程] 原创内容....实现曲线图,饼图,柱形图. 转贴请注明出处, http://blog.csdn.net/liq330 效果图: 原代码如下: class ImageReport { var Image;//图片对像 var ImageName;//报表名称 var ImageType;//报表类型 var ImageWidth;//图片宽 var ImageHeight;//图片高 var BgImage;//背景图片 var BgR;//背景颜色R值 var BgG;//背景颜色G值 var BgB;//背景颜色B值 var FontSize;//字体大小 var FontColor;//字体颜色 var ItemArray;//数据数组 var ItemInterval;//两项间的间隔 var XName;//x轴的名称 var YName;//y轴的名称 var isScale;//是否显示刻度值 var margin;//边距 //字体 var font = 'arial.ttf'; function ImageReport() { return ; } //设置图片基本信息 function setImage(ImageName,ImageType,ImageWidth=500,ImageHeight=400) { this->ImageName =ImageName; this->ImageType =ImageType; this->ImageWidth =ImageWidth; this->ImageHeight=ImageHeight; } //设置坐标 function setItem(ItemArray,ItemInterval="20",XName="",YName="",isScale=true) { this->ItemArray =ItemArray; this->ItemInterval =ItemInterval; this->XName =XName; this->YName =YName; this->isScale =isScale; } //设置图片背景 function setBg(BgR="235",BgG="255",BgB="255",BgImage="") { this->BgR =BgR; this->BgG =BgG; this->BgB =BgG; this->BgImage =BgImage; } //设置字体 function setFont(FontSize) { this->FontSize =FontSize; this->margin =FontSize*2+5; //this->FontColor =FontColor; } //画主体 function drawReport() { //建立画布 this->Image=imagecreatetruecolor(this->ImageWidth,this->ImageHeight); //填充背景色 background=ImageColorAllocate(this->Image,this->BgR,this->BgG,this->BgB); //画背景颜色 ImageFilledRectangle(this->Image,0,0,this->ImageWidth,this->ImageHeight,background); //画背景图片 if(!empty(this->BgImage)) { this->drawLogo(); } //跟距参数,画不同的图片 switch(this->ImageType) { case "1": this->drawColumn(); break; case "2": this->drawCurve(); break; case "3": this->drawCircle(); break; default: break; } } //画柱状图 function drawColumn() { //调用画标题 this->drawTitle(); //调用画坐标 this->drawXY(); //获取数组的量 num=count(this->ItemArray); //获取数组中的最大值 //最大值 max=this->getArrayMax(this->ItemArray); for(i=0;i ItemArray);i++) { //随机颜色 srand((double)microtime()*1000000); R=Rand(50,200); G=Rand(50,200); B=Rand(50,200); color=ImageColorAllocate(this->Image,R,G,B); yColor=ImageColorAllocate(this->Image,R-10,G-10,B-10); //柱体高度 height=((this->ImageHeight-this->margin*2-this->FontSize-5)*this->ItemArray[i]["value"])/max;
//画柱体 ImageFilledRectangle(this->Image,this->margin+this->ItemInterval*(2*i+1),this->ImageHeight-height+this->FontSize-5-this->margin,this->margin+this->ItemInterval*(2*i+2),this->ImageHeight-this->margin,color); //画柱体上的阴影 imagefilledarc(this->Image, this->margin+this->ItemInterval*(2*i+3/2), this->ImageHeight-height+this->FontSize-5-this->margin,this->ItemInterval, this->margin/2, 0, 360, yColor, img_ARC_PIE); //写柱体上面的数值 imagestring(this->Image,this->FontSize,this->margin+this->ItemInterval*(2*i+1),this->ImageHeight-height+this->FontSize-5-this->margin-this->FontSize-10,this->ItemArray[i]["value"],color); //颜色 color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB);
//写柱体的键值 imagettftext(this->Image,7,0,this->margin+this->ItemInterval*(2*i+1)-3,this->ImageHeight-this->margin+this->FontSize+2,color,this->font,this->ItemArray[i]["key"]); } //调用画LOGO // this->drawLogo();
} //画曲线图 function drawCurve() { //调用画标题 this->drawTitle(); //调用画坐标 this->drawXY(true); //最大值 max=this->getArrayMax(this->ItemArray); //颜色 color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB); //背景刻度的颜色 bgSColor=ImageColorAllocate(this->Image,this->BgR-10,this->BgG-10,this->BgB-10); //线条颜色
linkColor=ImageColorAllocate(this->Image,51,51,153);
//画右X轴 ImageLine(this->Image,this->margin,this->margin+this->FontSize+5,this->ImageWidth-this->margin,this->margin+this->FontSize+5,color); //画右Y轴 ImageLine(this->Image,this->ImageWidth-this->margin,this->margin+this->FontSize+5,this->ImageWidth-this->margin,this->ImageHeight-this->margin+2,color); tdCount=count(this->ItemArray); tdWidth=(this->ImageWidth-this->margin*2)/tdCount; for(i=0;i { //线条高度 startHeight=((this->ImageHeight-this->margin*2-this->FontSize-5)*this->ItemArray[i]["value"])/max; //结束线线条高度 endHeight =((this->ImageHeight-this->margin*2-this->FontSize-5)*this->ItemArray[i+1]["value"])/max; //画背景X轴刻度 ImageLine(this->Image,(i+1)*tdWidth+this->margin,this->margin+this->FontSize+6,(i+1)*tdWidth+this->margin,this->ImageHeight-this->margin,bgSColor); //画线条 ImageLine(this->Image,i*tdWidth+this->margin,this->ImageHeight-startHeight+this->FontSize-5-this->margin,(i+1)*tdWidth+this->margin,this->ImageHeight-endHeight+this->FontSize-5-this->margin,linkColor); }
//画刻度的值 for(i=0;i { //显示值 //ImageString(this->Image,5,i*tdWidth+this->margin,this->ImageHeight-this->margin+1,this->ItemArray[i]["key"],color); //画标题的字 imagettftext(this->Image,7,0,i*tdWidth+this->margin,this->ImageHeight-this->margin+1+10,color,this->font,this->ItemArray[i]["key"]); }
}
//画饼图 function drawCircle() { //一个扇区的角度 degree=0; //开始的角度 e=0; //用于保存颜色的数组 colorArray; //用于保存开始角度的数组 startDegree; //用于保存结束角度的数组 endDegree; //扇形的宽 width=(this->ImageWidth-this->margin*2)-200;
//获取数组的量 num=count(this->ItemArray); //调用画标题 this->drawTitle(); //各项之和 total=0; //计算各项之和 for(i=0;i { total+=this->ItemArray[i]["value"]; }
//保扇区的各项值保存到数组 for(i=0;iItemArray);i++) { //随机颜色 srand((double)microtime()*1000000);
R=Rand(50,200); G=Rand(50,200); B=Rand(50,200); //把颜色保存进数组 colorArray[i]["R"]=R; colorArray[i]["G"]=G; colorArray[i]["B"]=B; //计算一个区块的角度 //echo this->ItemArray[i]["value"]; //exit; degree=this->ItemArray[i]["value"]/total*360; startDegree[i]=e; endDegree[i]=e+degree; e+=degree; }
j=width/4+this->margin+35; mJ=j-15; //画阴影 for (j;j >mJ; j--) { for(i=0;i { color=ImageColorAllocate(this->Image,colorArray[i]["R"]-10,colorArray[i]["G"]-10,colorArray[i]["B"]-10); imagefilledarc(this->Image, width/2+this->margin, j, width, width/2, startDegree[i], endDegree[i], color, img_ARC_PIE); } } //画区面和右边的标识字 for(i=0;i { //获取颜色 color=ImageColorAllocate(this->Image,colorArray[i]["R"],colorArray[i]["G"],colorArray[i]["B"]); //画区面 imagefilledarc(this->Image, width/2+this->margin, width/4+this->margin+20, width, width/2, startDegree[i], endDegree[i], color, img_ARC_PIE);
//说明方块的上边距 top=this->margin+20+i*10; //画右边的距形 ImageFilledRectangle(this->Image,width+this->margin+20,top+(i*10),width+this->margin+30,top+(i*10)+10,color); //字体颜色为黑色 fontColor=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB); //画右边的说明文字 rightStr=this->ItemArray[i]["key"].":".this->ItemArray[i]["value"]."(".round(this->ItemArray[i]["value"]*100/total,2)."%)"; //ImageString(this->Image,10,width+this->margin+35,top+(i*10)-3,rightStr,fontColor); imagettftext(this->Image, 9,0,width+this->margin+35,top+(i*10)+8,fontColor,this->font,rightStr); } //清空各数组 unset(colorArray,startDegree,endDegree);
}
//显示图片 function showImage(ImageSavePath="") { // echo ImageSavePath; //exit; if(empty(ImageSavePath)) { ImagePNG(this->Image); } else { ImagePNG(this->Image,ImageSavePath); } ImageDestroy(this->Image); }
//画标题 function drawTitle() { //颜色 color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB); //阴影色 black = imagecolorallocate(this->Image, 0, 0, 0); //计算标题字体的宽度 fontWidth=strlen(this->ImageName)*(this->FontSize)-strlen(this->ImageName)*2;
//画标题字的阴影 imagettftext(this->Image, this->FontSize+3,0,this->ImageWidth/2-fontWidth/2+1,this->FontSize+11,black,this->font,this->ImageName); //画标题的字 imagettftext(this->Image, this->FontSize+3,0,this->ImageWidth/2-fontWidth/2,this->FontSize+10,color,this->font,this->ImageName); //画标题下面的线条 imageline(this->Image,this->ImageWidth/2-fontWidth/2-20,this->FontSize+12,this->ImageWidth/2-fontWidth/2+1+fontWidth+20,this->FontSize+12,color); } //画LOGO function drawLogo() {
list(w,h,type) = getimagesize(this->BgImage); source; switch(type) { //图片是GIF case 1: source=imagecreatefromgif(this->BgImage); break; //图片是jPG case 2: source = imagecreatefromjpeg(this->BgImage); break; //图片是PNG case 3: source = imagecreatefrompng(this->BgImage); } imagecopymerge(this->Image,source,0,0,0,0,w,h,20); }
//画坐标 function drawXY(bgScale=false) { //最大值 max=this->getArrayMax(this->ItemArray); //颜色 color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB); //背景刻度的颜色 bgSColor=ImageColorAllocate(this->Image,this->BgR-10,this->BgG-10,this->BgB-10);
//画X轴 ImageLine(this->Image,this->margin,this->ImageHeight-this->margin+2,this->ImageWidth-this->margin,this->ImageHeight-this->margin+2,color); //画Y轴 ImageLine(this->Image,this->margin,this->margin+this->FontSize+5,this->margin,this->ImageHeight-this->margin+2,color); //阴影色 black = imagecolorallocate(this->Image, 0, 0, 0); //画Y轴字的阴影 imagettftext(this->Image, this->FontSize, 90, this->FontSize+2, intval(this->ImageHeight/2)-1, black, this->font, this->YName); //画Y轴的字 imagettftext(this->Image, this->FontSize, 90, this->FontSize+2, intval(this->ImageHeight/2), color, this->font, this->YName); //画X轴字的阴影 imagettftext(this->Image, this->FontSize,0,intval(this->ImageWidth/2)-1,this->ImageHeight-this->FontSize+5,black,this->font,this->XName); //画X轴的字 imagettftext(this->Image, this->FontSize,0,intval(this->ImageWidth/2),this->ImageHeight-this->FontSize+5,color,this->font,this->XName); //画0点坐标 imagettftext(this->Image,8,90,this->margin/2+this->FontSize,this->ImageHeight-this->margin,color,this->font,"0"); //画最大值数据 // imagettftext(this->Image, this->FontSize,90,this->margin/2+7,this->margin+20,black,font,max); //画内容的实际高度 height=this->ImageHeight-this->margin*2-(this->FontSize+5); //每一刻度的值 scale=intval(height/10);
for(i=0;i<10;i++) { //画刻度,如果设置了背景刻度 if(bgScale) { ImageLine(this->Image,this->margin+1,this->margin+i*scale+this->FontSize+5+i,this->ImageWidth-this->margin,this->margin+i*scale+this->FontSize+5+i,bgSColor); } else { ImageLine(this->Image,this->margin-2,this->margin+i*scale+this->FontSize+5+i,this->margin,this->margin+i*scale+this->FontSize+5+i,color); } //画刻度上的值 if(this->isScale) { num=round(max-max/10*i,1); imagettftext(this->Image, 7,90,this->margin/2+this->FontSize,this->margin+i*scale+15+this->FontSize,color,this->font,num); } } //如果未画刻度值,则画最大值 if(!this->isScale) { imagettftext(this->Image, 7,90,this->margin/2+this->FontSize,this->margin+15+this->FontSize,color,this->font,max); }
} //获取数组中的最大值 function getArrayMax(Array) { temp=0; for(i=0;i { if(temp { temp=Array[i]["value"]; } } return temp; }
?>
调用方法 require_once ("ImageReport.inc.php"); report=new ImageReport; report->setImage(title,type,imgW,imgH);//参数(标题,类型(1(柱图),2(曲线图),3(饼图)),图片宽,图片高) //这个我用数据库查出来的,要改一下.格式是多维数据.key=>value temparray=this->db->GetArray("select report_key as 'key',report_value as value from cms_r_report_data where report_id=id order by report_dataId ASC");
report->setItem(temparray,interval,XName,YName,isScale);//参数(数组,间隔,X轴文字,Y轴文字,背景图片) report->setBg(BgR,BgG,BgB,"logo.jpg");//参数(背景颜色) report->setFont(10);//字体大小1-10 report->drawReport(); report->showImage("../images/report/".id.".png");//参数为保存的路径
来源:http://blog.csdn.net/liq330
|