温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php打造智能化的柱状图程序的方法

发布时间:2021-06-30 16:01:12 阅读:164 作者:chen 栏目:开发技术
PHP开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

本篇内容主要讲解“php打造智能化的柱状图程序的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php打造智能化的柱状图程序的方法”吧!

php打造智能化的柱状图程序,用于报表等

<?php 
/*** 
 * @project Bar Graph Program 
 * @license GPL 
 * @package 
 * @file GrapBar.php 
 * @date 2007-4-3 
 * @version 1.0 
 * @last modified 
  
 * 定义 柱状图(柱形图) 类 
 * 
 * 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配置中的open_basedir项,如果没此路径请添加,或在程序中设置包含 
 * 
 * 智能化的柱状图程序,用于报表等 
 * 
 ***/ 
  
define("DEFAULT_FONT_PATH""c:/windows/fonts/simhei.ttf"); 
class SingleBar 
{ 
 private $_x; 
 private $_y; 
 private $_h; 
 public $_l 50; 
 private $_w null; 
 private $_srcPoints array(); 
 private $_points array(); 
  
 public function __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(); 
 } 
  
 public function getSrcPoints() 
 { 
 return array( 
  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)) 
 ); 
 } 
  
 public function getPoints() 
 { 
 $points array(); 
 foreach($this->_srcPoints as $key => $val) 
 { 
  $points[] = $val[0]; 
  $points[] = $val[1]; 
 } 
 return $points; 
 } 
  
 public function getTopPoints() 
 { 
 return array_slice($this->_points, 08); //顶坐标 
 } 
  
 public function getBelowPoints() 
 { 
 return array_merge(array_slice($this->_points, 02), array_slice($this->_points, 84), array_slice($this->_points, 22)); //下坐标 
 } 
  
 public function getRightSidePoints() 
 { 
 return array_merge(array_slice($this->_points, 22), array_slice($this->_points, 104), array_slice($this->_points, 42)); //右侧坐标 
 } 
  
 public function draw($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); //画侧面边线 
 }  
 } 
  
 public function getRGB($color) 
 { 
 $ar array(); 
 $color hexdec($color); 
 $ar['R'] = ($color>>16) & 0xff; 
 $ar['G'] = ($color>>8) & 0xff; 
 $ar['B'] = ($color) & 0xff; 
 return $ar; 
 } 
} 
  
class Bar 
{ 
 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; 
  
 public function __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); 
 } 
  
 public function stroke() 
 { 
 $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); 
 } 
  
 public function drawBg() 
 { 
 $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, 00$img_w$img_h$bg); 
 $side_bg imagecolorallocatealpha($this->image, 22022022075); 
 $side_bg2 imagecolorallocate($this->image, 220220220); 
 $border_color imagecolorallocate($this->image, 190190190); 
 $line_color imagecolorallocate($this->image, 236236236); 
 $dial_color imagecolorallocate($this->image, 131131131); 
   
 $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$value0x000000); 
 } 
 } 
  
  
 public function drawBars() 
 { 
 $counts count($this->_barHeights); 
 if (empty($this->_barColors)) 
 { 
  $color $this->setColor(); 
  $this->_barColors = array_slice($color0$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->_barHeights as $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 new SingleBar($x$y$h$barL); 
  $SingleBar->draw($this->image, $t_color$b_color$s_color); 
  $i++; 
 } 
 } 
  
 public function drawTitle() 
 { 
 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, 120$x$y0x000000, DEFAULT_FONT_PATH, $this->_title); 
 } 
  
 public function drawLables() 
 { 
 $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$y20x000000); 
 $space 5; 
 $x $x1 3; 
 $y $y1 3; 
 foreach ($this->_barTexts as $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+120x000000); //绘12*12的矩形框 
  imagettftext($this->image, 120$x+12+3$y+120x000000, 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; 
  } 
 } 
 } 
  
 public function resetPaddingBottom() 
 { 
 $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; 
 } 
  
 public function resetHeight() 
 { 
 $padding_bottom $this->resetPaddingBottom(); 
 if ($this->_H - $padding_bottom 222) 
 { 
  return 222 + $padding_bottom; 
 } 
 return $this->_H; 
 } 
  
  
 public function getLableTotalWidth() 
 { 
 $counts count($this->_barTexts); 
 $space 5; 
 $total_len 0; 
 foreach ($this->_barTexts as $val) 
 { 
  $total_len += strlen($val); 
 } 
   
 $tx_w = ($total_len 9) + ((12 + 3 + $space) * $counts); 
 return $tx_w; 
 } 
  
 public function setBg($color) 
 { 
 $this->_bgColor = $color; 
 } 
  
 public function setTitle($title) 
 { 
 $this->_title = $title; 
 } 
  
 public function setColor() 
 { 
 $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; 
 } 
  
 public function getRGB($color) 
 { 
 $ar array(); 
 $color hexdec($color); 
 $ar['R'] = ($color>>16) & 0xff; 
 $ar['G'] = ($color>>8) & 0xff; 
 $ar['B'] = ($color) & 0xff; 
 return $ar; 
 } 
} 
  
/***/ 
$bar new Bar(500300array(60030030500400250350360), array('AAAAA''BBBBB''CCCCC''DDDDD''EEEEEE''FFFFFF''GGGGGGG''HHHHHHHHH')); 
$bar->setTitle('打造完美柱状图!'); 
$bar->stroke(); 
/***/ 
?>

到此,相信大家对“php打造智能化的柱状图程序的方法”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI

开发者交流群×