php打造智能化的柱状图程序,用于报表等
php打造智能化的柱状图程序,用于报表等
<?php /*** *@projectBarGraphProgram *@licenseGPL *@package *@fileGrapBar.php *@date2007-4-3 *@version1.0 *@lastmodified *定义柱状图(柱形图)类 * *注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配置中的open_basedir项,如果没此路径请添加,或在程序中设置包含 * *智能化的柱状图程序,用于报表等 * ***/ define("DEFAULT_FONT_PATH","c:/windows/fonts/simhei.ttf"); classSingleBar { private$_x; private$_y; private$_h; public$_l=50; private$_w=null; private$_srcPoints=array(); private$_points=array(); publicfunction__construct($x,$y,$h,$l=50,$w=null) { $this->_x=$x; $this->_y=$y; $this->_h=$h; $this->_l=$l; $this->_w=$w; $this->_srcPoints=$this->getSrcPoints(); $this->_points=$this->getPoints(); } publicfunctiongetSrcPoints() { returnarray( array($this->_x,$this->_y), array($this->_x+$this->_l,$this->_y), array($this->_x+(1.35*$this->_l),$this->_y-(0.35*$this->_l)), array($this->_x+(0.35*$this->_l),$this->_y-(0.35*$this->_l)), array($this->_x,$this->_y+$this->_h), array($this->_x+$this->_l,$this->_y+$this->_h), array($this->_x+(1.35*$this->_l),$this->_y+$this->_h-(0.35*$this->_l)) ); } publicfunctiongetPoints() { $points=array(); foreach($this->_srcPointsas$key=>$val) { $points[]=$val[0]; $points[]=$val[1]; } return$points; } publicfunctiongetTopPoints() { returnarray_slice($this->_points,0,8);//顶坐标 } publicfunctiongetBelowPoints() { returnarray_merge(array_slice($this->_points,0,2),array_slice($this->_points,8,4),array_slice($this->_points,2,2));//下坐标 } publicfunctiongetRightSidePoints() { returnarray_merge(array_slice($this->_points,2,2),array_slice($this->_points,10,4),array_slice($this->_points,4,2));//右侧坐标 } publicfunctiondraw($image,$topColor,$belowColor,$sideColor,$borderColor=null,$type='LEFT') { if(is_null($borderColor)) { $borderColor=0xcccccc; } $top_rgb=$this->getRGB($topColor); $below_rgb=$this->getRGB($belowColor); $side_rgb=$this->getRGB($sideColor); $top_color=imagecolorallocate($image,$top_rgb['R'],$top_rgb['G'],$top_rgb['B']); $below_color=imagecolorallocate($image,$below_rgb['R'],$below_rgb['G'],$below_rgb['B']); $side_color=imagecolorallocate($image,$side_rgb['R'],$side_rgb['G'],$side_rgb['B']); imagefilledpolygon($image,$this->getTopPoints(),4,$top_color);//画顶面 imagepolygon($image,$this->getTopPoints(),4,$borderColor);//画顶面边线 imagefilledpolygon($image,$this->getBelowPoints(),4,$below_color);//画下面 imagepolygon($image,$this->getBelowPoints(),4,$borderColor);//画下面边线 if($type=='LEFT') { imagefilledpolygon($image,$this->getRightSidePoints(),4,$side_color);//画右侧面 imagepolygon($image,$this->getRightSidePoints(),4,$borderColor);//画侧面边线 } } publicfunctiongetRGB($color) { $ar=array(); $color=hexdec($color); $ar['R']=($color>>16)&0xff; $ar['G']=($color>>8)&0xff; $ar['B']=($color)&0xff; return$ar; } } classBar { private$_W; private$_H; private$_bgColor="ffffff"; private$_barHeights=array(); private$_barTexts=array(); private$_barColors=array(); public$_title; public$_paddingTop=30; public$_paddingBottom=100; public$_paddingLeft=45; public$_paddingRight=2; public$_barL=50; public$image; publicfunction__construct($imgW,$imgH,$barHeights,$barTexts=null,$barColors=null) { $this->_W=$imgW; $this->_H=$imgH; $this->_barHeights=$barHeights; $this->_barTexts=$barTexts; $this->_barColors=$barColors; $this->_paddingBottom=$this->resetPaddingBottom(); $this->_H=$this->resetHeight(); $this->image=imagecreatetruecolor($this->_W,$this->_H); } publicfunctionstroke() { $this->drawBg(); $this->drawBars(); $this->drawTitle(); $this->drawLables(); ob_start(); //header("Content-type:image/png"); //imagepng($this->image); header("Content-type:".image_type_to_mime_type(IMAGETYPE_JPEG)); imagejpeg($this->image); imagedestroy($this->image); } publicfunctiondrawBg() { $img_w=$this->_W; $img_h=$this->_H; $paddingTop=$this->_paddingTop; $paddingBottom=$this->_paddingBottom; $paddingLeft=$this->_paddingLeft; $paddingRight=$this->_paddingRight; $rgb=$this->getRGB($this->_bgColor); $bg=imagecolorallocate($this->image,$rgb['R'],$rgb['G'],$rgb['B']); imagefilledrectangle($this->image,0,0,$img_w,$img_h,$bg); $side_bg=imagecolorallocatealpha($this->image,220,220,220,75); $side_bg2=imagecolorallocate($this->image,220,220,220); $border_color=imagecolorallocate($this->image,190,190,190); $line_color=imagecolorallocate($this->image,236,236,236); $dial_color=imagecolorallocate($this->image,131,131,131); $x1=$paddingLeft; $y1=$paddingTop; $x2=$img_w-$paddingRight; $y2=$img_h-$paddingBottom; imagerectangle($this->image,$x1,$y1,$x2,$y2,$border_color); imagefilledpolygon($this->image,array($x1-5,$y1+10,$x1-5,$y2+10,$x1,$y2,$x1,$y1),4,$side_bg); imagepolygon($this->image,array($x1-5,$y1+10,$x1-5,$y2+10,$x1,$y2,$x1,$y1),4,$border_color); imagefilledpolygon($this->image,array($x1-5,$y2+10,$x2-5,$y2+10,$x2,$y2,$x1,$y2),4,$side_bg); imagepolygon($this->image,array($x1-5,$y2+10,$x2-5,$y2+10,$x2,$y2,$x1,$y2),4,$border_color); imageline($this->image,$x1,$y2,$x2,$y2,$side_bg2); $total_h=$img_h-$paddingTop-$paddingBottom; $every_h=$total_h/11; for($i=1;$i<=10;$i++) { imageline($this->image,$x1,$y1+($every_h*$i),$x2,$y1+($every_h*$i),$line_color);//画网线 } $max_h=max($this->_barHeights); for($i=1;$i<=10;$i++) { $value=$max_h-(($max_h/10)*($i-1)); $value=strval($value); $str_w=strlen($value)*5; imageline($this->image,$x1-5-3,$y1+10+($every_h*$i),$x1-3+1,$y1+10+($every_h*$i),$dial_color);//画刻度线 imagestring($this->image,3,$x1-5-3-$str_w-1,$y1+10+($every_h*$i)-5,$value,0x000000); } } publicfunctiondrawBars() { $counts=count($this->_barHeights); if(empty($this->_barColors)) { $color=$this->setColor(); $this->_barColors=array_slice($color,0,$counts); //shuffle($this->_barColors); } $every_w=($this->_W-$this->_paddingLeft-$this->_paddingRight)/$counts;//每一段宽 $barL=$every_w; $barL=($barL>$this->_barL*1.35+6)?$this->_barL:$barL/1.35-6; $max_h=max($this->_barHeights); $ruler_h=$this->_H-$this->_paddingTop-$this->_paddingBottom;//标尺总高度 $stander_h=$ruler_h-($ruler_h/11);//标尺10等分的高度 $i=0; foreach($this->_barHeightsas$val) { $h=($stander_h/$max_h)*$val; $x=$this->_paddingLeft+($every_w*$i)+(($every_w-($barL*1.35))/2);; $y=$this->_H-$this->_paddingBottom+10-$h; //$t_color=$this->_barColors[$i]; $b_color=$this->_barColors[$i]; //$s_color=$this->_barColors[$i]; $rgb=$this->getRGB($this->_barColors[$i]); $R=$rgb['R']*0.7; $G=$rgb['G']*0.7; $B=$rgb['B']*0.7; $c1=$R>0?dechex($R):'00'; $c2=$G>0?dechex($G):'00'; $c3=$B>0?dechex($B):'00'; $t_color=$b_color; $s_color=$c1.$c2.$c3; $SingleBar=newSingleBar($x,$y,$h,$barL); $SingleBar->draw($this->image,$t_color,$b_color,$s_color); $i++; } } publicfunctiondrawTitle() { if(empty($this->_title)) { return; } $font=5; $font_w=imagefontwidth($font); $len=strlen($this->_title); $x=($this->_W+$this->_paddingLeft-$this->_paddingRight)/2; $x-=($len*$font_w)/2; $y=($this->_paddingTop-$font_w)/2+12; //imagestring($this->image,$font,$x,$y,$title,0x000000); imagettftext($this->image,12,0,$x,$y,0x000000,DEFAULT_FONT_PATH,$this->_title); } publicfunctiondrawLables() { $x1=$this->_paddingLeft-5; $y1=$this->_H-$this->_paddingBottom+20; $x2=$this->_W-$this->_paddingRight; $y2=$this->_H-10; //imagefilledrectangle($this->image,$x1,$y1,$x2,$y2,0xffffff); imagerectangle($this->image,$x1,$y1,$x2,$y2,0x000000); $space=5; $x=$x1+3; $y=$y1+3; foreach($this->_barTextsas$key=>$val) { $color=$this->_barColors[$key]; $rgb=$this->getRGB($color); $bg=imagecolorallocate($this->image,$rgb['R'],$rgb['G'],$rgb['B']); imagefilledrectangle($this->image,$x,$y,$x+12,$y+12,$bg);//绘12*12的矩形 imagerectangle($this->image,$x,$y,$x+12,$y+12,0x000000);//绘12*12的矩形框 imagettftext($this->image,12,0,$x+12+3,$y+12,0x000000,DEFAULT_FONT_PATH,$val); $x+=12+$space+(strlen($val)*8)+$space; if($x+(strlen($val)*8)>=$this->_W-$this->_paddingLeft-$this->_paddingRight) { $x=$x1+3; $y=$y+12+3; } } } publicfunctionresetPaddingBottom() { $ruler_w=$this->_W-$this->_paddingLeft-$this->_paddingRight; $label_w=$this->getLableTotalWidth(); $lines=ceil($label_w/$ruler_w); $h=12*$lines+(3*($lines+1))+30; return$h; } publicfunctionresetHeight() { $padding_bottom=$this->resetPaddingBottom(); if($this->_H-$padding_bottom<222) { return222+$padding_bottom; } return$this->_H; } publicfunctiongetLableTotalWidth() { $counts=count($this->_barTexts); $space=5; $total_len=0; foreach($this->_barTextsas$val) { $total_len+=strlen($val); } $tx_w=($total_len*9)+((12+3+$space)*$counts); return$tx_w; } publicfunctionsetBg($color) { $this->_bgColor=$color; } publicfunctionsetTitle($title) { $this->_title=$title; } publicfunctionsetColor() { $ar=array('ff','00','33','66','99','cc'); $color=array(); for($i=0;$i<6;$i++) { for($j=0;$j<6;$j++) { for($k=0;$k<6;$k++) { $color[]=$ar[$i].$ar[$j].$ar[$k]; } } } $color2=array(); for($i=1;$i<216;$i+=4) { $color2[]=$color[$i]; } return$color2; } publicfunctiongetRGB($color) { $ar=array(); $color=hexdec($color); $ar['R']=($color>>16)&0xff; $ar['G']=($color>>8)&0xff; $ar['B']=($color)&0xff; return$ar; } } /***/ $bar=newBar(500,300,array(600,300,30,500,400,250,350,360),array('AAAAA','BBBBB','CCCCC','DDDDD','EEEEEE','FFFFFF','GGGGGGG','HHHHHHHHH')); $bar->setTitle('打造完美柱状图!'); $bar->stroke(); /***/ ?>
以上所述就是本文的全部内容了,希望大家能够喜欢。