您的位置:首页技术文章

用GD图库生成横竖柱状图折线图的类

【字号: 日期:2023-09-20 16:13:42浏览:26作者:馨心

最近写的一个GD图库用以生成横竖柱状图和折线图的类库,算是一个教学例程吧; 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':; breakcase '1':; $this->imageColumnS()breakcase '2':; $this->imageColumnH()breakcase '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/10ImageLine($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->BORDERwhile($rulerY>$this->BORDER*2){; $rulerY=$rulerY-$this->BORDERImageLine($this->IMAGE,$this->BORDER,$rulerY,$this->BORDER-2,$rulerY,$color)}; //X轴上刻度; $rulerX=$rulerX+$this->BORDERwhile($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=0for ($i=0;$i<$num;$i++){ $item_max=Max($item_max,$item_array[$i]); } $xx=$this->BORDER*2//画柱形图; for ($i=0;$i<$num;$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=0for ($i=0;$i<$num;$i++){ $item_max=Max($item_max,$item_array[$i]); } $yy=$this->Y-$this->BORDER*2//画柱形图; for ($i=0;$i<$num;$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=0for ($i=0;$i<$num;$i++){ $item_max=Max($item_max,$item_array[$i]); } //$xx=$this->BORDER//画柱形图; for ($i=0;$i<$num;$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}; };

//--------------完成打印图形http://knowsky.com function printAll(){; ImageGIF($this->IMAGE)ImageDestroy($this->IMAGE)}; //--------------调试; function debug(){; echo 'X:'.$this->X.'Y:'.$this->Yecho 'BORDER:'.$this->BORDER$item_array=split($this->ARRAYSPLIT,$this->ITEMARRAY)$num=Count($item_array)echo '数值个数:'.$num.'数值:'for ($i=0;$i<$num;$i++){ echo ''.$item_array[$i]}; }; };

$report=new ImageReport$report->setImage(600,300,255,255,255,1);//参数(长,宽,背影色R,G,B,是否透明1或0); $temparray='50,25,100,250,180,200,150,220,200,150,50,25,100,250,180,200,150,220,200,150';//数值,用指定符号隔开; $report->setItem(',',$temparray,3,20);//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图,距离); $report->setFont(1);//字体大小1-10; $report->PrintReport()//$report->debug();//调式之用; ?>

标签: PHP