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

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php打造智能化的柱状图程序,用于报表等脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

<PRe class="brush:PHP;">
  • 定义 柱状图(柱形图) 类
  • 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在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,array($this->_x+(1.35$this->_l),$this->_y-(0.35$this->_l)),array($this->_x+(0.35$this->_l),array($this->_x,$this->_y+$this->_h),$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,8); //顶坐标
}

public function getBelowPoints()
{
return array_merge(array_slice($this->_points,2),array_slice($this->_points,8,4),2,2)); //下坐标
}

public function getRightSidePoints()
{
return array_merge(array_slice($this->_points,10,4,2)); //右侧坐标
}

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(),$top_color); //画顶面
imagepolygon($image,$borderColor); //画顶面边线

imagefilledpolygon($image,$this->getBelowPoints(),$below_color); //画下面
imagepolygon($image,$borderColor); //画下面边线

if ($type == 'LEFT')
{
imagefilledpolygon($image,$this->getRightSidePoints(),$side_color); //画右侧面
imagepolygon($image,$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,$img_w,$img_h,$bg);
$side_bg = imagecolorallocatealpha($this->image,220,75);
$side_bg2 = imagecolorallocate($this->image,220);
$border_color = imagecolorallocate($this->image,190,190);
$line_color = imagecolorallocate($this->image,236,236);
$dial_color = imagecolorallocate($this->image,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,$y1),$side_bg);
imagepolygon($this->image,$x2-5,$y2),$border_color);
imageline($this->image,$side_bg2);

$total_h = $img_h - $paddingTop - $paddingBottom;
$every_h = $total_h/11;
for($i=1; $i<=10; $i++)
{
imageline($this->image,$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,$dial_color); //画刻度线
imagestring($this->image,3,$x1-5-3-$str_w-1,$y1+10+($every_h
$i)-5,$value,0x000000);
}
}

public function drawBars()
{
$counts = count($this->_barHeights);
if (empty($this->_barColors))
{
$color = $this->setColor();
$this->_barColors = array_slice($color,$counts);
//shuffle($this->_barColors);
}
$every_w = ($this->_W - $this->_paddingLeft - $this->_paddingRight)/$counts; //每一段
$barL = $every_w;
$barL = ($barL > $this->_barL1.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 - ($barL1.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,$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,$title,0x000000);
imagettftext($this->image,12,0x000000,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,0xffffff);
imagerectangle($this->image,0x000000);
$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['B']);
imagefilledrectangle($this->image,$x+12,$y+12,$bg); //绘1212的矩形
imagerectangle($this->image,0x000000); //绘12
12的矩形框
imagettftext($this->image,$x+12+3,$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) &amp; 0xff;
$ar['G'] = ($color>>8) & 0xff;
$ar['B'] = ($color) & 0xff;
return $ar;
}
}

//
$bar = new Bar(500,300,array(600,30,500,400,250,350,360),array('AAAAA','BBBBB','CCCCC','DDDDD','EEEEEE','FFFFFF','GGGGGGG','HHHHHHHHH'));
$bar->setTitle('打造完美柱状图!');
$bar->stroke();
/
/
?>

脚本宝典总结

以上是脚本宝典为你收集整理的php打造智能化的柱状图程序,用于报表等全部内容,希望文章能够帮你解决php打造智能化的柱状图程序,用于报表等所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。