- 論壇徽章:
- 0
|
原創(chuàng)內(nèi)容....實(shí)現(xiàn)曲線圖,餅圖,柱形圖.
轉(zhuǎn)貼請注明出處,
http://blog.csdn.net/liq330
![]()
![]()
![]()
原代碼如下:
?php
class ImageReport
{
var $Image;//圖片對像
var $ImageName;//報(bào)表名稱
var $ImageType;//報(bào)表類型
var $ImageWidth;//圖片寬
var $ImageHeight;//圖片高
var $BgImage;//背景圖片
var $BgR;//背景顏色R值
var $BgG;//背景顏色G值
var $BgB;//背景顏色B值
var $FontSize;//字體大小
var $FontColor;//字體顏色
var $ItemArray;//數(shù)據(jù)數(shù)組
var $ItemInterval;//兩項(xiàng)間的間隔
var $XName;//x軸的名稱
var $YName;//y軸的名稱
var $isScale;//是否顯示刻度值
var $margin;//邊距
//字體
var $font = 'arial.ttf';
function ImageReport()
{
return ;
}
//設(shè)置圖片基本信息
function setImage($ImageName,$ImageType,$ImageWidth=500,$ImageHeight=400)
{
$this->ImageName =$ImageName;
$this->ImageType =$ImageType;
$this->ImageWidth =$ImageWidth;
$this->ImageHeight=$ImageHeight;
}
//設(shè)置坐標(biāo)
function setItem($ItemArray,$ItemInterval="20",$XName="",$YName="",$isScale=true)
{
$this->ItemArray =$ItemArray;
$this->ItemInterval =$ItemInterval;
$this->XName =$XName;
$this->YName =$YName;
$this->isScale =$isScale;
}
//設(shè)置圖片背景
function setBg($BgR="235",$BgG="255",$BgB="255",$BgImage="")
{
$this->BgR =$BgR;
$this->BgG =$BgG;
$this->BgB =$BgG;
$this->BgImage =$BgImage;
}
//設(shè)置字體
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();
}
//跟距參數(shù),畫不同的圖片
switch($this->ImageType)
{
case "1":
$this->drawColumn();
break;
case "2":
$this->drawCurve();
break;
case "3":
$this->drawCircle();
break;
default:
break;
}
}
//畫柱狀圖
function drawColumn()
{
//調(diào)用畫標(biāo)題
$this->drawTitle();
//調(diào)用畫坐標(biāo)
$this->drawXY();
//獲取數(shù)組的量
$num=count($this->ItemArray);
//獲取數(shù)組中的最大值
//最大值
$max=$this->getArrayMax($this->ItemArray);
for($i=0;$icount($this->ItemArray);$i++)
{
//隨機(jī)顏色
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);
//寫柱體上面的數(shù)值
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"]);
}
//調(diào)用畫LOGO
// $this->drawLogo();
}
//畫曲線圖
function drawCurve()
{
//調(diào)用畫標(biāo)題
$this->drawTitle();
//調(diào)用畫坐標(biāo)
$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;
//結(jié)束線線條高度
$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);
//畫標(biāo)題的字
imagettftext($this->Image,7,0,$i*$tdWidth+$this->margin,$this->ImageHeight-$this->margin+1+10,$color,$this->font,$this->ItemArray[$i]["key"]);
}
}
//畫餅圖
function drawCircle()
{
//一個(gè)扇區(qū)的角度
$degree=0;
//開始的角度
$e=0;
//用于保存顏色的數(shù)組
$colorArray;
//用于保存開始角度的數(shù)組
$startDegree;
//用于保存結(jié)束角度的數(shù)組
$endDegree;
//扇形的寬
$width=($this->ImageWidth-$this->margin*2)-200;
//獲取數(shù)組的量
$num=count($this->ItemArray);
//調(diào)用畫標(biāo)題
$this->drawTitle();
//各項(xiàng)之和
$total=0;
//計(jì)算各項(xiàng)之和
for($i=0;$i$num;$i++)
{
$total+=$this->ItemArray[$i]["value"];
}
//保扇區(qū)的各項(xiàng)值保存到數(shù)組
for($i=0;$icount($this->ItemArray);$i++)
{
//隨機(jī)顏色
srand((double)microtime()*1000000);
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
//把顏色保存進(jìn)數(shù)組
$colorArray[$i]["R"]=$R;
$colorArray[$i]["G"]=$G;
$colorArray[$i]["B"]=$B;
//計(jì)算一個(gè)區(qū)塊的角度
//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);
}
}
//畫區(qū)面和右邊的標(biāo)識字
for($i=0;$i$num;$i++)
{
//獲取顏色
$color=ImageColorAllocate($this->Image,$colorArray[$i]["R"],$colorArray[$i]["G"],$colorArray[$i]["B"]);
//畫區(qū)面
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);
}
//清空各數(shù)組
unset($colorArray,$startDegree,$endDegree);
}
//顯示圖片
function showImage($ImageSavePath="")
{
// echo $ImageSavePath;
//exit;
if(empty($ImageSavePath))
{
ImagePNG($this->Image);
}
else
{
ImagePNG($this->Image,$ImageSavePath);
}
ImageDestroy($this->Image);
}
//畫標(biāo)題
function drawTitle()
{
//顏色
$color=ImageColorAllocate($this->Image,255-$this->BgR,255-$this->BgG,255-$this->BgB);
//陰影色
$black = imagecolorallocate($this->Image, 0, 0, 0);
//計(jì)算標(biāo)題字體的寬度
$fontWidth=strlen($this->ImageName)*($this->FontSize)-strlen($this->ImageName)*2;
//畫標(biāo)題字的陰影
imagettftext($this->Image, $this->FontSize+3,0,$this->ImageWidth/2-$fontWidth/2+1,$this->FontSize+11,$black,$this->font,$this->ImageName);
//畫標(biāo)題的字
imagettftext($this->Image, $this->FontSize+3,0,$this->ImageWidth/2-$fontWidth/2,$this->FontSize+10,$color,$this->font,$this->ImageName);
//畫標(biāo)題下面的線條
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);
}
//畫坐標(biāo)
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點(diǎn)坐標(biāo)
imagettftext($this->Image,8,90,$this->margin/2+$this->FontSize,$this->ImageHeight-$this->margin,$color,$this->font,"0");
//畫最大值數(shù)據(jù)
// imagettftext($this->Image, $this->FontSize,90,$this->margin/2+7,$this->margin+20,$black,$font,$max);
//畫內(nèi)容的實(shí)際高度
$height=$this->ImageHeight-$this->margin*2-($this->FontSize+5);
//每一刻度的值
$scale=intval($height/10);
for($i=0;$i10;$i++)
{
//畫刻度,如果設(shè)置了背景刻度
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);
}
}
//獲取數(shù)組中的最大值
function getArrayMax($Array)
{
$temp=0;
for($i=0;$icount($Array);$i++)
{
if($temp$Array[$i]["value"])
{
$temp=$Array[$i]["value"];
}
}
return $temp;
}
?>
調(diào)用方法
require_once ("ImageReport.inc.php");
$report=new ImageReport;
$report->setImage($title,$type,$imgW,$imgH);//參數(shù)(標(biāo)題,類型(1(柱圖),2(曲線圖),3(餅圖)),圖片寬,圖片高)
//這個(gè)我用數(shù)據(jù)庫查出來的,要改一下.格式是多維數(shù)據(jù).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);//參數(shù)(數(shù)組,間隔,X軸文字,Y軸文字,背景圖片)
$report->setBg($BgR,$BgG,$BgB,"logo.jpg");//參數(shù)(背景顏色)
$report->setFont(10);//字體大小1-10
$report->drawReport();
$report->showImage("../images/report/".$id.".png");//參數(shù)為保存的路徑
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u/5743/showart_1270197.html |
|