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
|