php实现报表类-图形报表-转载

widuu 2012-11-26 PHP技术 4,631 0 喜欢 (0)

原创内容....实现曲线图,饼图,柱形图.

转贴请注明出处,

http://blog.csdn.net/liq330

效果图:


原代码如下:
[php]
<?php

class ImageReport
{
var $Image;//图片对像

var $ImageName;//报表名称
var $ImageType;//报表类型

var $ImageWidth;//图片宽
var $ImageHeight;//图片高

var $BgImage;//背景图片
var $BgR;//背景颜色R值
var $BgG;//背景颜色G值
var $BgB;//背景颜色B值

var $FontSize;//字体大小
var $FontColor;//字体颜色

var $ItemArray;//数据数组
var $ItemInterval;//两项间的间隔
var $XName;//x轴的名称
var $YName;//y轴的名称
var $isScale;//是否显示刻度值
var $margin;//边距

//字体
var $font = 'arial.ttf';

function ImageReport()
{
return ;
}

//设置图片基本信息
function setImage($ImageName,$ImageType,$ImageWidth=500,$ImageHeight=400)
{
$this->ImageName =$ImageName;
$this->ImageType =$ImageType;
$this->ImageWidth =$ImageWidth;
$this->ImageHeight=$ImageHeight;
}

//设置坐标
function setItem($ItemArray,$ItemInterval="20",$XName="",$YName="",$isScale=true)
{
$this->ItemArray =$ItemArray;
$this->ItemInterval =$ItemInterval;
$this->XName =$XName;
$this->YName =$YName;
$this->isScale =$isScale;
}

//设置图片背景
function setBg($BgR="235",$BgG="255",$BgB="255",$BgImage="")
{
$this->BgR =$BgR;
$this->BgG =$BgG;
$this->BgB =$BgG;
$this->BgImage =$BgImage;
}

//设置字体
function setFont($FontSize)
{
$this->FontSize =$FontSize;
$this->margin =$FontSize*2+5;
//$this->FontColor =$FontColor;
}

//画主体
function drawReport()
{
//建立画布
$this->Image=imagecreatetruecolor($this->ImageWidth,$this->ImageHeight);
//填充背景色
$background=ImageColorAllocate($this->Image,$this->BgR,$this->BgG,$this->BgB);

//画背景颜色
ImageFilledRectangle($this->Image,0,0,$this->ImageWidth,$this->ImageHeight,$background);

//画背景图片
if(!empty($this->BgImage))
{
$this->drawLogo();
}
//跟距参数,画不同的图片
switch($this->ImageType)
{
case "1":
$this->drawColumn();
break;
case "2":
$this->drawCurve();
break;
case "3":
$this->drawCircle();
break;
default:
break;
}

}

//画柱状图
function drawColumn()
{
//调用画标题
$this->drawTitle();
//调用画坐标
$this->drawXY();

//获取数组的量
$num=count($this->ItemArray);
//获取数组中的最大值
//最大值
$max=$this->getArrayMax($this->ItemArray);

for($i=0;$i<count($this->ItemArray);$i++)
{
//随机颜色
srand((double)microtime()*1000000);
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);

$color=ImageColorAllocate($this->Image,$R,$G,$B);

$yColor=ImageColorAllocate($this->Image,$R-10,$G-10,$B-10);
//柱体高度

$height=(($this->ImageHeight-$this->margin*2-$this->FontSize-5)*$this->ItemArray[$i]["value"])/$max;

//画柱体
ImageFilledRectangle($this->Image,$this->margin+$this->ItemInterval*(2*$i+1),$this->ImageHeight-$height+$this->FontSize-5-$this->margin,$this->margin+$this->ItemInterval*(2*$i+2),$this->ImageHeight-$this->margin,$color);
//画柱体上的阴影
imagefilledarc($this->Image, $this->margin+$this->ItemInterval*(2*$i+3/2), $this->ImageHeight-$height+$this->FontSize-5-$this->margin,$this->ItemInterval, $this->margin/2, 0, 360, $yColor, IMG_ARC_PIE);

//写柱体上面的数值
imagestring($this->Image,$this->FontSize,$this->margin+$this->ItemInterval*(2*$i+1),$this->ImageHeight-$height+$this->FontSize-5-$this->margin-$this->FontSize-10,$this->ItemArray[$i]["value"],$color);
//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);

//写柱体的键值
imagettftext($this->Image,7,0,$this->margin+$this->ItemInterval*(2*$i+1)-3,$this->ImageHeight-$this->margin+$this->FontSize+2,$color,$this->font,$this->ItemArray[$i]["key"]);

}
//调用画LOGO
// $this->drawLogo();

}
//画曲线图
function drawCurve()
{
//调用画标题
$this->drawTitle();
//调用画坐标
$this->drawXY(true);

//最大值
$max=$this->getArrayMax($this->ItemArray);

//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//背景刻度的颜色
$bgSColor=ImageColorAllocate($this->Image,$this->BgR-10,$this->BgG-10,$this->BgB-10);
//线条颜色

$linkColor=ImageColorAllocate($this->Image,51,51,153);

//画右X轴
ImageLine($this->Image,$this->margin,$this->margin+$this->FontSize+5,$this->ImageWidth-$this->margin,$this->margin+$this->FontSize+5,$color);
//画右Y轴
ImageLine($this->Image,$this->ImageWidth-$this->margin,$this->margin+$this->FontSize+5,$this->ImageWidth-$this->margin,$this->ImageHeight-$this->margin+2,$color);

$tdCount=count($this->ItemArray);
$tdWidth=($this->ImageWidth-$this->margin*2)/$tdCount;

for($i=0;$i<$tdCount-1;$i++)
{
//线条高度
$startHeight=(($this->ImageHeight-$this->margin*2-$this->FontSize-5)*$this->ItemArray[$i]["value"])/$max;
//结束线线条高度
$endHeight =(($this->ImageHeight-$this->margin*2-$this->FontSize-5)*$this->ItemArray[$i+1]["value"])/$max;
//画背景X轴刻度
ImageLine($this->Image,($i+1)*$tdWidth+$this->margin,$this->margin+$this->FontSize+6,($i+1)*$tdWidth+$this->margin,$this->ImageHeight-$this->margin,$bgSColor);
//画线条
ImageLine($this->Image,$i*$tdWidth+$this->margin,$this->ImageHeight-$startHeight+$this->FontSize-5-$this->margin,($i+1)*$tdWidth+$this->margin,$this->ImageHeight-$endHeight+$this->FontSize-5-$this->margin,$linkColor);
}

//画刻度的值
for($i=0;$i<$tdCount;$i++)
{
//显示值
//ImageString($this->Image,5,$i*$tdWidth+$this->margin,$this->ImageHeight-$this->margin+1,$this->ItemArray[$i]["key"],$color);
//画标题的字
imagettftext($this->Image,7,0,$i*$tdWidth+$this->margin,$this->ImageHeight-$this->margin+1+10,$color,$this->font,$this->ItemArray[$i]["key"]);
}

}

//画饼图
function drawCircle()
{
//一个扇区的角度
$degree=0;
//开始的角度
$e=0;
//用于保存颜色的数组
$colorArray;
//用于保存开始角度的数组
$startDegree;
//用于保存结束角度的数组
$endDegree;

//扇形的宽
$width=($this->ImageWidth-$this->margin*2)-200;

//获取数组的量
$num=count($this->ItemArray);
//调用画标题
$this->drawTitle();
//各项之和
$total=0;

//计算各项之和
for($i=0;$i<$num;$i++)
{
$total+=$this->ItemArray[$i]["value"];
}

//保扇区的各项值保存到数组
for($i=0;$i<count($this->ItemArray);$i++)
{
//随机颜色
srand((double)microtime()*1000000);

$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);

//把颜色保存进数组
$colorArray[$i]["R"]=$R;
$colorArray[$i]["G"]=$G;
$colorArray[$i]["B"]=$B;

//计算一个区块的角度
//echo $this->ItemArray[$i]["value"];
//exit;
$degree=$this->ItemArray[$i]["value"]/$total*360;
$startDegree[$i]=$e;
$endDegree[$i]=$e+$degree;
$e+=$degree;
}

$j=$width/4+$this->margin+35;
$mJ=$j-15;
//画阴影
for ($j;$j >$mJ; $j--)
{
for($i=0;$i<$num;$i++)
{
$color=ImageColorAllocate($this->Image,$colorArray[$i]["R"]-10,$colorArray[$i]["G"]-10,$colorArray[$i]["B"]-10);
imagefilledarc($this->Image, $width/2+$this->margin, $j, $width, $width/2, $startDegree[$i], $endDegree[$i], $color, IMG_ARC_PIE);
}
}
//画区面和右边的标识字
for($i=0;$i<$num;$i++)
{
//获取颜色
$color=ImageColorAllocate($this->Image,$colorArray[$i]["R"],$colorArray[$i]["G"],$colorArray[$i]["B"]);

//画区面
imagefilledarc($this->Image, $width/2+$this->margin, $width/4+$this->margin+20, $width, $width/2, $startDegree[$i], $endDegree[$i], $color, IMG_ARC_PIE);

//说明方块的上边距
$top=$this->margin+20+$i*10;
//画右边的距形
ImageFilledRectangle($this->Image,$width+$this->margin+20,$top+($i*10),$width+$this->margin+30,$top+($i*10)+10,$color);
//字体颜色为黑色
$fontColor=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);

//画右边的说明文字
$rightStr=$this->ItemArray[$i]["key"].":".$this->ItemArray[$i]["value"]."(".round($this->ItemArray[$i]["value"]*100/$total,2)."%)";
//ImageString($this->Image,10,$width+$this->margin+35,$top+($i*10)-3,$rightStr,$fontColor);
imagettftext($this->Image, 9,0,$width+$this->margin+35,$top+($i*10)+8,$fontColor,$this->font,$rightStr);

}
//清空各数组
unset($colorArray,$startDegree,$endDegree);

}

//显示图片
function showImage($ImageSavePath="")
{
// echo $ImageSavePath;
//exit;
if(empty($ImageSavePath))
{
ImagePNG($this->Image);
}
else
{
ImagePNG($this->Image,$ImageSavePath);
}

ImageDestroy($this->Image);
}

//画标题
function drawTitle()
{
//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);

//阴影色
$black = imagecolorallocate($this->Image, 0, 0, 0);

//计算标题字体的宽度
$fontWidth=strlen($this->ImageName)*($this->FontSize)-strlen($this->ImageName)*2;

//画标题字的阴影
imagettftext($this->Image, $this->FontSize+3,0,$this->ImageWidth/2-$fontWidth/2+1,$this->FontSize+11,$black,$this->font,$this->ImageName);
//画标题的字
imagettftext($this->Image, $this->FontSize+3,0,$this->ImageWidth/2-$fontWidth/2,$this->FontSize+10,$color,$this->font,$this->ImageName);

//画标题下面的线条
imageline($this->Image,$this->ImageWidth/2-$fontWidth/2-20,$this->FontSize+12,$this->ImageWidth/2-$fontWidth/2+1+$fontWidth+20,$this->FontSize+12,$color);
}

//画LOGO
function drawLogo()
{

list($w,$h,$type) = getimagesize($this->BgImage);

$source;
switch($type)
{
//图片是GIF
case 1:
$source=imagecreatefromgif($this->BgImage);
break;
//图片是jPG
case 2:
$source = imagecreatefromjpeg($this->BgImage);
break;
//图片是PNG
case 3:
$source = imagecreatefrompng($this->BgImage);
}

imagecopymerge($this->Image,$source,0,0,0,0,$w,$h,20);
}

//画坐标
function drawXY($bgScale=false)
{
//最大值
$max=$this->getArrayMax($this->ItemArray);

//颜色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//背景刻度的颜色
$bgSColor=ImageColorAllocate($this->Image,$this->BgR-10,$this->BgG-10,$this->BgB-10);

//画X轴
ImageLine($this->Image,$this->margin,$this->ImageHeight-$this->margin+2,$this->ImageWidth-$this->margin,$this->ImageHeight-$this->margin+2,$color);
//画Y轴
ImageLine($this->Image,$this->margin,$this->margin+$this->FontSize+5,$this->margin,$this->ImageHeight-$this->margin+2,$color);

//阴影色
$black = imagecolorallocate($this->Image, 0, 0, 0);

//画Y轴字的阴影
imagettftext($this->Image, $this->FontSize, 90, $this->FontSize+2, intval($this->ImageHeight/2)-1, $black, $this->font, $this->YName);
//画Y轴的字
imagettftext($this->Image, $this->FontSize, 90, $this->FontSize+2, intval($this->ImageHeight/2), $color, $this->font, $this->YName);

//画X轴字的阴影
imagettftext($this->Image, $this->FontSize,0,intval($this->ImageWidth/2)-1,$this->ImageHeight-$this->FontSize+5,$black,$this->font,$this->XName);
//画X轴的字
imagettftext($this->Image, $this->FontSize,0,intval($this->ImageWidth/2),$this->ImageHeight-$this->FontSize+5,$color,$this->font,$this->XName);

//画0点坐标
imagettftext($this->Image,8,90,$this->margin/2+$this->FontSize,$this->ImageHeight-$this->margin,$color,$this->font,"0");
//画最大值数据
// imagettftext($this->Image, $this->FontSize,90,$this->margin/2+7,$this->margin+20,$black,$font,$max);

//画内容的实际高度
$height=$this->ImageHeight-$this->margin*2-($this->FontSize+5);
//每一刻度的值
$scale=intval($height/10);

for($i=0;$i<10;$i++)
{
//画刻度,如果设置了背景刻度
if($bgScale)
{
ImageLine($this->Image,$this->margin+1,$this->margin+$i*$scale+$this->FontSize+5+$i,$this->ImageWidth-$this->margin,$this->margin+$i*$scale+$this->FontSize+5+$i,$bgSColor);
}
else
{
ImageLine($this->Image,$this->margin-2,$this->margin+$i*$scale+$this->FontSize+5+$i,$this->margin,$this->margin+$i*$scale+$this->FontSize+5+$i,$color);
}
//画刻度上的值
if($this->isScale)
{
$num=round($max-$max/10*$i,1);
imagettftext($this->Image, 7,90,$this->margin/2+$this->FontSize,$this->margin+$i*$scale+15+$this->FontSize,$color,$this->font,$num);
}
}
//如果未画刻度值,则画最大值
if(!$this->isScale)
{
imagettftext($this->Image, 7,90,$this->margin/2+$this->FontSize,$this->margin+15+$this->FontSize,$color,$this->font,$max);
}

}

//获取数组中的最大值
function getArrayMax($Array)
{
$temp=0;
for($i=0;$i<count($Array);$i++)
{
if($temp<$Array[$i]["value"])
{
$temp=$Array[$i]["value"];
}
}
return $temp;

}

?>
[/php]
调用方法
[php]

require_once ("ImageReport.inc.php");
$report=new ImageReport;
$report->setImage($title,$type,$imgW,$imgH);//参数(标题,类型(1(柱图),2(曲线图),3(饼图)),图片宽,图片高)

//这个我用数据库查出来的,要改一下.格式是多维数据.key=>value
$temparray=$this->db->GetArray("select report_key as 'key',report_value as value from cms_r_report_data where report_id=$id order by report_dataId ASC");

$report->setItem($temparray,$interval,$XName,$YName,$isScale);//参数(数组,间隔,X轴文字,Y轴文字,背景图片)
$report->setBg($BgR,$BgG,$BgB,"logo.jpg");//参数(背景颜色)
$report->setFont(10);//字体大小1-10
$report->drawReport();
$report->showImage("../images/report/".$id.".png");//参数为保存的路径
[/php]

转载请注明来自微度网络,本文标题:《php实现报表类-图形报表-转载》

喜欢 0 发布评论
Top