Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)归海一刀published in(发表于) 2014/2/10 6:46:27 PHP一生成柱状图、横柱图、折线图的类_[PHP教程]
/** * 文件:cal_image.class.php * 功能:产生柱状、折线图、横柱图类 * 作者:yemaosheng.com */
Class ImageReport{ /* 图片数属性 */ var X; //图片大小X轴 var Y; //图片大小Y轴 var R; //背影色R值 var G; //背影色G值 var B; //背影色B值 var TRANSPARENT; //是否透明1或0 var IMAGE; //图片对像 /* 附加属性 */ var ARRAYSPLIT; //指定用于分隔数值的符号 var ITEMARRAY; //数值 var REPORTTYPE; //图表类型,1为竖柱形2为横柱形3为折线形 var BORDER; //距离 /* 字体属性*/ var FONTSIZE; //字体大小 var FONTCOLOR; //字体颜色 /* 设置图片 */ function setImage(SizeX,SizeY,R,G,B,Transparent) { this->X=SizeX; this->Y=SizeY; this->R=R; this->G=G; this->B=B; this->TRANSPARENT=Transparent; }
/* 设置获取数字 */ function setItem(ArraySplit,ItemArray,ReportType,Border) { this->ARRAYSPLIT=ArraySplit; this->ITEMARRAY=ItemArray; this->REPORTTYPE=ReportType; this->BORDER=Border; } /* 设置字体 */ function setFont(FontSize) { this->FONTSIZE=FontSize; }
/* 主体 */ function PrintReport() { Header( "Content-type: image/gif"); //建立画布大小 this->IMAGE=ImageCreate(this->X,this->Y); //设定画布背景色 background=ImageColorAllocate(this->IMAGE,this->R,this->G,this->B); if(this->TRANSPARENT=="1") { //背影透明 Imagecolortransparent(this->IMAGE,background); } else { //如不要透明时可填充背景色 ImageFilledRectangle(this->IMAGE,0,0,this->X,this->Y,background); } //参数字体文小及颜色 this->FONTCOLOR=ImageColorAllocate(this->IMAGE,255-this->R,255-this->G,255-this->B); Switch (this->REPORTTYPE) { case "0": break; case "1": this->imageColumnS(); break; case "2": this->imageColumnH(); break; case "3": this->imageLine(); break; } this->printXY(); this->printAll(); }
/* 打印XY坐标轴 */ function printXY() { //画XY坐标轴*/ color=ImageColorAllocate(this->IMAGE,255-this->R,255-this->G,255-this->B); xx=this->X/10; yy=this->Y-this->Y/10; ImageLine(this->IMAGE,this->BORDER,this->BORDER,this->BORDER,this->Y-this->BORDER,color);//X轴 ImageLine(this->IMAGE,this->BORDER,this->Y-this->BORDER,this->X-this->BORDER,this->Y-this->BORDER,color);//y轴 //Y轴上刻度 rulerY=this->Y-this->BORDER; while(rulerY>this->BORDER*2) { rulerY=rulerY-this->BORDER; ImageLine(this->IMAGE,this->BORDER,rulerY,this->BORDER-2,rulerY,color); } //X轴上刻度 rulerX=rulerX+this->BORDER; while(rulerX<(this->X-this->BORDER*2)) { rulerX=rulerX+this->BORDER; //ImageLine(this->IMAGE,this->BORDER,10,this->BORDER+10,10,color); ImageLine(this->IMAGE,rulerX,this->Y-this->BORDER,rulerX,this->Y-this->BORDER+2,color); } }
/* 竖柱形图 */ function imageColumnS() { item_array=Split(this->ARRAYSPLIT,this->ITEMARRAY); num=Count(item_array); item_max=0; for (i=0;i { item_max=Max(item_max,item_array[i]); } xx=this->BORDER*2; //画柱形图 for (i=0;i srand((double)microtime()*1000000); if(this->R!=255 && this->G!=255 && this->B!=255) { R=Rand(this->R,200); G=Rand(this->G,200); B=Rand(this->B,200); } else { R=Rand(50,200); G=Rand(50,200); B=Rand(50,200); } color=ImageColorAllocate(this->IMAGE,R,G,B); //柱形高度 height=(this->Y-this->BORDER)-(this->Y-this->BORDER*2)*(item_array[i]/item_max); ImageFilledRectangle(this->IMAGE,xx,height,xx+this->BORDER,this->Y-this->BORDER,color); ImageString(this->IMAGE,this->FONTSIZE,xx,height-this->BORDER,item_array[i],this->FONTCOLOR); //用于间隔 xx=xx+this->BORDER*2; } }
/* 横柱形图 */ function imageColumnH() { item_array=Split(this->ARRAYSPLIT,this->ITEMARRAY); num=Count(item_array); item_max=0; for (i=0;i { item_max=Max(item_max,item_array[i]); } yy=this->Y-this->BORDER*2; //画柱形图 for (i=0;i { srand((double)microtime()*1000000); if(this->R!=255 && this->G!=255 && this->B!=255) { R=Rand(this->R,200); G=Rand(this->G,200); B=Rand(this->B,200); } else { R=Rand(50,200); G=Rand(50,200); B=Rand(50,200); } color=ImageColorAllocate(this->IMAGE,R,G,B); //柱形长度 leight=(this->X-this->BORDER*2)*(item_array[i]/item_max); ImageFilledRectangle(this->IMAGE,this->BORDER,yy-this->BORDER,leight,yy,color); ImageString(this->IMAGE,this->FONTSIZE,leight+2,yy-this->BORDER,item_array[i],this->FONTCOLOR); //用于间隔 yy=yy-this->BORDER*2; } }
/* 折线图 */ function imageLine() { item_array=Split(this->ARRAYSPLIT,this->ITEMARRAY); num=Count(item_array); item_max=0; for (i=0;i { item_max=Max(item_max,item_array[i]); } //xx=this->BORDER; //画柱形图 for (i=0;i { srand((double)microtime()*1000000); if(this->R!=255 && this->G!=255 && this->B!=255) { R=Rand(this->R,200); G=Rand(this->G,200); B=Rand(this->B,200); } else { R=Rand(50,200); G=Rand(50,200); B=Rand(50,200); } color=ImageColorAllocate(this->IMAGE,R,G,B); //柱形高度 height_now=(this->Y-this->BORDER)-(this->Y-this->BORDER*2)*(item_array[i]/item_max); if(i!="0") { ImageLine(this->IMAGE,xx,height_next,xx+this->BORDER,height_now,color); } ImageString(this->IMAGE,this->FONTSIZE,xx+this->BORDER,height_now-this->BORDER/2,item_array[i],this->FONTCOLOR); height_next=height_now; //用于间隔 xx=xx+this->BORDER; } }
/* 完成打印图形 */ function printAll() { ImageGIF(this->IMAGE); ImageDestroy(this->IMAGE); }
/* 调试函数 */ function debug() { echo "X:".this->X."Y:".this->Y; echo "BORDER:".this->BORDER; item_array=split(this->ARRAYSPLIT,this->ITEMARRAY); num=Count(item_array); echo "数值个数:".num."数值:"; for (i=0;i { echo "".item_array[i]; } } } ?>
/* 使用实例代码 */
以下是引用片段:
//实例化对象 report = new ImageReport();
//参数(长,宽,背影色R,G,B,是否透明1或0) report->setImage(2000, 300, 255, 255, 255, 1);
//数值,用指定符号隔开 temparray="50,25,100,250,180,200,2150,220,200,150,50,25,100,250,180,200,150,220,200,150";
//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图,距离) report->setItem(',',temparray,3,20);
//字体大小1-10 report->setFont(1);
//输出图片 report->PrintReport();
//调式// report->debug();?>
赞