图类,可显示多种图形
<?//图类
Class ImageReport{
var $X;//图片大小X轴
var $Y;//图片大小Y轴
var $R;//背影色R值
var $G;//...G.
var $B;//...B.
var $TRANSPARENT;//是否透明1或0
var $IMAGE;//图片对像
//-------------------
var $ARRAYSPLIT;//指定用于分隔数值的符号
var $ITEMARRAY;//数值
var $REPORTTYPE;//图表类型,1为竖柱形2为横柱形3为折线形
var $BORDER;//距离
//-------------------
var $FONTSIZE;//字体大小
var $FONTCOLOR;//字体颜色
//--------参数设置函数
function setImage($SizeX,$SizeY,$R,$G,$B,$Transparent){
$this->X=$SizeX;
$this->Y=$SizeY;
$this->R=$R;
$this->G=$G;
$this->B=$B;
$this->TRANSPARENT=$Transparent;
}
function setItem($ArraySplit,$ItemArray,$ReportType,$Border){
$this->ARRAYSPLIT=$ArraySplit;
$this->ITEMARRAY=$ItemArray;
$this->REPORTTYPE=$ReportType;
$this->BORDER=$Border;
}
function setFont($FontSize){
$this->FONTSIZE=$FontSize;
}
//----------------主体
function PrintReport(){
//建立画布大小
$this->IMAGE=ImageCreate($this->X,$this->Y);
//设定画布背景色
$background=ImageColorAllocate($this->IMAGE,$this->R,$this->G,$this->B);
if($this->TRANSPARENT=="1"){
//背影透明
Imagecolortransparent($this->IMAGE,$background);
}else{
//如不要透明时可填充背景色
ImageFilledRectangle($this->IMAGE,0,0,$this->X,$this->Y,$background);
}
//参数字体文小及颜色
$this->FONTCOLOR=ImageColorAllocate($this->IMAGE,255-$this->R,255-$this->G,255-$this->B);
Switch ($this->REPORTTYPE){
case "0":
break;
case "1":
$this->imageColumnS();
break;
case "2":
$this->imageColumnH();
break;
case "3":
$this->imageLine();
break;
case "4":
$this->imageCircle();
break;
}
$this->printXY();
$this->printAll();
}
//-----------打印XY坐标轴
function printXY(){
//画XY坐标轴*/
$color=ImageColorAllocate($this->IMAGE,255-$this->R,255-$this->G,255-$this->B);
$xx=$this->X/10;
$yy=$this->Y-$this->Y/10;
ImageLine($this->IMAGE,$this->BORDER,$this->BORDER,$this->BORDER,$this->Y-$this->BORDER,$color);//X轴
ImageLine($this->IMAGE,$this->BORDER,$this->Y-$this->BORDER,$this->X-$this->BORDER,$this->Y-$this->BORDER,$color);//y轴
//Y轴上刻度
$rulerY=$this->Y-$this->BORDER;
while($rulerY>$this->BORDER*2){
$rulerY=$rulerY-$this->BORDER;
ImageLine($this->IMAGE,$this->BORDER,$rulerY,$this->BORDER-2,$rulerY,$color);
}
//X轴上刻度
$rulerX=$rulerX+$this->BORDER;
while($rulerX<($this->X-$this->BORDER*2)){
$rulerX=$rulerX+$this->BORDER;
//ImageLine($this->IMAGE,$this->BORDER,10,$this->BORDER+10,10,$color);
ImageLine($this->IMAGE,$rulerX,$this->Y-$this->BORDER,$rulerX,$this->Y-$this->BORDER+2,$color);
}
} //--------------竖柱形图
function imageColumnS(){
$item_array=Split($this->ARRAYSPLIT,$this->ITEMARRAY);
$num=Count($item_array);
$item_max=0;
for ($i=0;$i<$num;$i++){
$item_max=Max($item_max,$item_array[$i]);
}
$xx=$this->BORDER*2;
//画柱形图
for ($i=0;$i<$num;$i++){
srand((double)microtime()*1000000);
if($this->R!=255 && $this->G!=255 && $this->B!=255){
$R=Rand($this->R,200);
$G=Rand($this->G,200);
$B=Rand($this->B,200);
}else{
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
}
$color=ImageColorAllocate($this->IMAGE,$R,$G,$B);
//柱形高度
$height=($this->Y-$this->BORDER)-($this->Y-$this->BORDER*2)*($item_array[$i]/$item_max);
ImageFilledRectangle($this->IMAGE,$xx,$height,$xx+$this->BORDER,$this->Y-$this->BORDER,$color);
ImageString($this->IMAGE,$this->FONTSIZE,$xx,$height-$this->BORDER,$item_array[$i],$this->FONTCOLOR);
//用于间隔
$xx=$xx+$this->BORDER*2;
}
}
//-----------横柱形图
function imageColumnH(){
$item_array=Split($this->ARRAYSPLIT,$this->ITEMARRAY);
$num=Count($item_array);
$item_max=0;
for ($i=0;$i<$num;$i++){
$item_max=Max($item_max,$item_array[$i]);
}
$yy=$this->Y-$this->BORDER*2;
//画柱形图
for ($i=0;$i<$num;$i++){
srand((double)microtime()*1000000);
if($this->R!=255 && $this->G!=255 && $this->B!=255){
$R=Rand($this->R,200);
$G=Rand($this->G,200);
$B=Rand($this->B,200);
}else{
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
}
$color=ImageColorAllocate($this->IMAGE,$R,$G,$B);
//柱形长度
$leight=($this->X-$this->BORDER*2)*($item_array[$i]/$item_max);
ImageFilledRectangle($this->IMAGE,$this->BORDER,$yy-$this->BORDER,$leight,$yy,$color);
ImageString($this->IMAGE,$this->FONTSIZE,$leight+2,$yy-$this->BORDER,$item_array[$i],$this->FONTCOLOR);
//用于间隔
$yy=$yy-$this->BORDER*2;
}
}
//--------------折线图
function imageLine(){
$item_array=Split($this->ARRAYSPLIT,$this->ITEMARRAY);
$num=Count($item_array);
$item_max=0;
for ($i=0;$i<$num;$i++){
$item_max=Max($item_max,$item_array[$i]);
}
//$xx=$this->BORDER;
//画柱形图
for ($i=0;$i<$num;$i++){
srand((double)microtime()*1000000);
if($this->R!=255 && $this->G!=255 && $this->B!=255){
$R=Rand($this->R,200);
$G=Rand($this->G,200);
$B=Rand($this->B,200);
}else{
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
}
$color=ImageColorAllocate($this->IMAGE,$R,$G,$B);
//柱形高度
$height_now=($this->Y-$this->BORDER)-($this->Y-$this->BORDER*2)*($item_array[$i]/$item_max);
if($i!="0"){
ImageLine($this->IMAGE,$xx,$height_next,$xx+$this->BORDER,$height_now,$color);
}
ImageString($this->IMAGE,$this->FONTSIZE,$xx+$this->BORDER,$height_now-$this->BORDER/2,$item_array[$i],$this->FONTCOLOR);
$height_next=$height_now;
//用于间隔
$xx=$xx+$this->BORDER;
}
}
//--------------饼状图
function imageCircle(){
$item_array=Split($this->ARRAYSPLIT,$this->ITEMARRAY);
$num=Count($item_array);
$item_max=0;
for ($i=0;$i<$num;$i++){
$item_max=Max($item_max,$item_array[$i]);
$total += $item_array[$i];
}
$yy=$this->Y-$this->BORDER*2;
//画饼状图的阴影部分
$e=0;
for ($i=0;$i<$num;$i++){
srand((double)microtime()*1000000);
if($this->R!=255 && $this->G!=255 && $this->B!=255){
$R=Rand($this->R,200);
$G=Rand($this->G,200);
$B=Rand($this->B,200);
}else{
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
}
$s=$e;
$leight=$item_array[$i]/$total*360;
$e=$s+$leight;
$color=ImageColorAllocate($this->IMAGE,$R,$G,$B);
$colorarray[$i]=$color;
//画圆
for ($j = 90; $j > 70; $j--) imagefilledarc($this->IMAGE, 110, $j, 200, 100, $s, $e, $color, IMG_ARC_PIE);
//imagefilledarc($this->IMAGE, 110, 70, 200, 100, $s, $e, $color, IMG_ARC_PIE);
//ImageFilledRectangle($this->IMAGE,$this->BORDER,$yy-$this->BORDER,$leight,$yy,$color);
//ImageString($this->IMAGE,$this->FONTSIZE,$leight+2,$yy-$this->BORDER,$item_array[$i],$this->FONTCOLOR);
//用于间隔
$yy=$yy-$this->BORDER*2;
}
//画饼状图的表面部分
$e=0;
for ($i=0;$i<$num;$i++){
srand((double)microtime()*1000000);
if($this->R!=255 && $this->G!=255 && $this->B!=255){
$R=Rand($this->R,200);
$G=Rand($this->G,200);
$B=Rand($this->B,200);
}else{
$R=Rand(50,200);
$G=Rand(50,200);
$B=Rand(50,200);
}
$s=$e;
$leight=$item_array[$i]/$total*360;
$e=$s+$leight;
//$color=$colorarray[$i];
$color=ImageColorAllocate($this->IMAGE,$R,$G,$B);
//画圆
//for ($j = 90; $j > 70; $j--) imagefilledarc($this->IMAGE, 110, $j, 200, 100, $s, $e, $color, IMG_ARC_PIE);
imagefilledarc($this->IMAGE, 110, 70, 200, 100, $s, $e, $color, IMG_ARC_PIE);
}
}
//--------------完成打印图形
function printAll(){
ImagePNG($this->IMAGE);
ImageDestroy($this->IMAGE);
}
//--------------调试
function debug(){
echo "X:".$this->X."<br/>Y:".$this->Y;
echo "<br/>BORDER:".$this->BORDER;
$item_array=split($this->ARRAYSPLIT,$this->ITEMARRAY);
$num=Count($item_array);
echo "<br/>数值个数:".$num."<br/>数值:";
for ($i=0;$i<$num;$i++){
echo "<br/>".$item_array[$i];
}
}
}
//$report->debug();//调式之用Header( "Content-type:image/png");
$report=new ImageReport;
$report->setImage(600,300,255,255,255,1);//参数(长,宽,背影色R,G,B,是否透明1或0)
$temparray="100,260,400,320,260,120";//数值,用指定符号隔开
$report->setItem(',',$temparray,4,20);//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图4为饼图,距离)
$report->setFont(1);//字体大小1-10
$report->PrintReport();
?>
// load gd library
if (!extension_loaded('gd')) {
if (!dl('php_gd2.dll')) {
echo "cannot load the gd_extensions! please contact the manager"
exit;
}
}Class DrawImageReportClass{
var $mPath="D:\\www.in2english.com\\webroot\\";
//var $mName="test.png";
var $mShow="/";
var $mX;
var $mY;
var $mXGradCnt; // graduation of x-axis
var $mYGradCnt; // graduation of y-axis
var $mXZero;
var $mYZero;
var $mTotalY;//X-axis
var $mTotalX;//Y-axis
var $mGradX;
var $mGradY;
var $mGWidth = 5; // width for graduation
var $mBackground; // background color
var $mR;//R for background
var $mG;//G for background
var $mB;//B for background
var $mTransparent;// 1 or 0
var $mImage; // handle of image
//-------------------
var $mXRecords; // value of x axis
var $mYRecords; // value of y axis
var $mRs; // value of records
var $mColors; // color for each group
var $mType; //Image Report Type 1-horizontal column 2-vertical column(not realize) 3-line
var $mBorder;
//-------------------
var $mFontSize;// font size
var $mFontColor;// font color
var $mCase;
//--------set parameters for image
function DrawImageReportClass()
{
}
function SetImage($x,$y,$r,$g,$b,$tran){
$this->mX=$x;
$this->mY=$y;
$this->mR=$r;
$this->mG=$g;
$this->mB=$b;
$this->mTransparent=$tran;
} function SetFont($size,$color){
$this->mFontSize=$size;
$this->mFontColor=$color;
} function SetRecords($rs,$rsx,$rsy,$case,$colors,$path,$name="test.png",$rt=1,$border=4){
$this->mXRecords = $rsx;
$this->mYRecords = $rsy;
$this->mRs=$rs;
$this->mType=$rt;
$this->mBorder=$border;
$this->mColors = $colors;
$this->mXGradCnt = count($rsx);
$this->mYGradCnt = count($rsy);
$this->mCase=$case;
$this->mName=$name;
$this->imPath=$path;
}
function DrawReport(){
header( "Content-type: image/png");
//create image
$this->mImage=@imagecreate($this->mX, $this->mY)
or die ("Cannot Initialize new GD image stream");
//set backcolor
$this->mBackground=imagecolorallocate($this->mImage,$this->mR,$this->mG,$this->mB);
// if you want to set it transparent
if("1"==$this->mTransparent){
imagecolortransparent($this->mImage,$this->mBackground);
}else{
imagefilledrectangle($this->mImage,0,0,$this->mX,$this->mY,$this->mBackground);
}
$this->mFontColor=imagecolorallocate($this->mImage,hexdec(substr($this->mFontColor,0,2)),hexdec(substr($this->mFontColor,2,2)),hexdec(substr($this->mFontColor,4,2)));
$this->PrintXY();
Switch ($this->mType){
case "1":
$this->DrawVerticalColumn();
break;
case "2":
$this->DrawLine();
break;
default:
break;
}
$this->PrintAll();
}
//-----------Draw XY axis
function PrintXY(){
// color for axis
$color=imagecolorallocate($this->mImage,255-$this->mR,255-$this->mG,255-$this->mB);
$this->mXZero = $this->mBorder + $this->mFontSize + 10;
$this->mYZero = $this->mY - $this->mBorder - $this->mFontSize - 10;
// draw x,y axis
imageline($this->mImage,$this->mXZero,$this->mYZero,$this->mX-$this->mBorder,$this->mYZero,$color);//X-axis
//draw arrow
imageline($this->mImage,$this->mX-$this->mBorder,$this->mYZero,$this->mX-$this->mBorder-5,$this->mYZero-3,$color);//X-axis
imageline($this->mImage,$this->mX-$this->mBorder,$this->mYZero,$this->mX-$this->mBorder-5,$this->mYZero+3,$color);//X-axis
imageline($this->mImage,$this->mXZero,$this->mYZero,$this->mXZero,$this->mBorder,$color);//y-axis
//draw arrow
imageline($this->mImage,$this->mXZero,$this->mBorder,$this->mXZero-3,$this->mBorder+5,$color);//y-axis
imageline($this->mImage,$this->mXZero,$this->mBorder,$this->mXZero+3,$this->mBorder+5,$color);//y-axis
// total length of Y - axis
$this->mTotalY = $this->mY - $this->mBorder*2 - $this->mFontSize - 10 - 78;// 8px is for arrow
$this->mTotalX = $this->mX - $this->mBorder*2 - $this->mFontSize - 10 - 78;
//
$this->mGradX = intval($this->mTotalX / $this->mXGradCnt);
$this->mGradY = intval($this->mTotalY / $this->mYGradCnt);
//draw gradutions
for($i=1;$i <= $this->mYGradCnt;$i++)
{
// for Y
imageline($this->mImage,$this->mXZero,$this->mYZero - $this->mGradY*$i,$this->mXZero+$this->mGWidth,$this->mYZero - $this->mGradY*$i,$color);
imagestring($this->mImage,$this->mFontSize,$this->mXZero-20,$this->mYZero - $this->mGradY*$i,$this->mYRecords[$i-1],$this->mFontColor);
}
for($i=1;$i <= $this->mXGradCnt;$i++)
{
// for X
imageline($this->mImage,$this->mXZero + $this->mGradX*$i,$this->mYZero,$this->mXZero + $this->mGradX*$i ,$this->mYZero-$this->mGWidth,$color);
imagestring($this->mImage,$this->mFontSize,$this->mXZero + $this->mGradX*$i,$this->mYZero+5,$this->mXRecords[$i-1],$this->mFontColor);
}
}
//--------------
function DrawVerticalColumn(){
//$colorcase=imagecolorallocate($this->mImage,250,0,0);
//imagerectangle($this->mImage,$this->mX-10,0,$this->mX-70,60,$colorcase);
$num_for_single_grad = count($this->mRs[0]);
$value_grad = $this->mYRecords[0];
$single_width = intval($this->mGradX / $num_for_single_grad);
if($single_width>40){//为了避免太宽,而不好看,所以把每条柱的最宽限为40
$single_width=40;
}
for($i=0;$i < $this->mXGradCnt; $i ++ ) // the first loop for group
{
for($j=0; $j < $num_for_single_grad;$j++ ) // the second loop for values in one group
{
if(is_numeric ($this->mRs[$i][$j])){
$value = $this->mRs[$i][$j] / $value_grad ;
if($value > $this->mYGradCnt)
{
$height = $this->mTotalY + 8;
}
else
{
$height = $this->mGradY * $value;
}
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
//$color=imagecolorallocate($this->mImage,substr($this->mColors[$i],0,2),substr($this->mColor[$i],2,2),substr($this->mColor[$i],4,2));
//$yy=20+$i*10;
imagefilledrectangle ($this->mImage,intval($this->mXZero + $this->mGradX * $i+$single_width*$j + $j*2),intval($this->mYZero - $height),intval($this->mXZero + $this->mGradX*$i+$single_width*($j+1)),intval($this->mYZero),$color);
//imagefilledrectangle ($this->mImage,intval($this->mXZero + $this->mGradX * $i+$single_width*$j + $j*2),intval($this->mYZero - $height),intval($this->mXZero + $this->mGradX*$i+$single_width*$j+$width_single_grade),intval($this->mYZero),$color);
imagestring($this->mImage,$this->mFontSize,intval($this->mX-70),intval(10+($j)*30),$this->mCase[$j],$this->mFontColor);
imagefilledrectangle($this->mImage,intval($this->mX-60+10),intval(10+$j*30),intval($this->mX-60+40),intval(20+$j*30),$color);
}
else{
$height = 0;
for($k=0;$k<$this->mYGradCnt;$k++)
if($this->mRs[$i][$j] == $this->mYRecords[$k])
{
$height=$this->mGradY*$k+$this->mGradY;
break;
}
else
{
$height = $this->mTotalY + 8;
}
//imagestring($this->mImage,$this->mFontSize,intval($this->mX-200-30*$i),intval(10+($j)*30),$height,$this->mFontColor);
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
//$color=imagecolorallocate($this->mImage,substr($this->mColors[$i],0,2),substr($this->mColor[$i],2,2),substr($this->mColor[$i],4,2));
//$yy=20+$i*10;
imagefilledrectangle ($this->mImage,intval($this->mXZero + $this->mGradX * $i+$single_width*$j + 10),intval($this->mYZero - $height),intval($this->mXZero + $this->mGradX*$i+$single_width*($j+1)+10),intval($this->mYZero),$color);
//imagestring($this->mImage,$this->mFontSize,intval($this->mX-200-30*$i),intval(10+($j)*30),$this->mRs[$i][$j] == $this->mYRecords[$k],$this->mFontColor);
imagestring($this->mImage,$this->mFontSize,intval($this->mX-80),intval(10+($j)*30),$this->mCase[$j],$this->mFontColor);
imagefilledrectangle($this->mImage,intval($this->mX-40+10),intval(10+$j*30),intval($this->mX-40+40),intval(20+$j*30),$color);
}
}
}
}
//--------------
function DrawLine(){
$num_for_single_grad = count($this->mRs[0]);
$value_grad = $this->mYRecords[0];
$single_width = intval($this->mGradX / $num_for_single_grad);
for($j=0; $j < $num_for_single_grad;$j++ )// the first loop for group
{
for($i=0;$i < $this->mXGradCnt-1; $i ++ ) // the second loop for values in one group
{ if(is_numeric ($this->mRs[$i][$j])){
$valuenow = $this->mRs[$i][$j] / $value_grad ;
if($valuenow > $this->mYGradCnt)
{
$heightnow = $this->mTotalY + 8;
}
else
{
$heightnow = $this->mGradY * $valuenow;
}
$valuenext = $this->mRs[$i+1][$j] / $value_grad ;
if($valuenext > $this->mYGradCnt)
{
$heightnext = $this->mTotalY + 8;
}
else
{
$heightnext = $this->mGradY * $valuenext;
}
if($i== $this->mXGradCnt-1)
{
$heightnext=$heightnow;
}
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
imageline($this->mImage,intval($this->mXZero+$this->mGradX*($i+1)),intval($this->mYZero - $heightnow),intval($this->mXZero+$this->mGradX*($i+2)),intval($this->mYZero - $heightnext),$color);
}
else{
for($k=0;$k<$this->mYGradCnt;$k++)
if($this->mRs[$i][$j] ==$this->mYRecords[$k])
{
$heightnow=$this->mGradY*$k+$this->mGradY;
break;
}
else{
$heightnow = $this->mTotalY + 8;
}
for($k=0;$k<$this->mYGradCnt;$k++)
if($this->mRs[$i+1][$j] ==$this->mYRecords[$k])
{
$heightnext=$this->mGradY*$k+$this->mGradY;
break;
}
else{
$heightnext = $this->mTotalY + 8;
}
if($i== $this->mXGradCnt-1)
{
$heightnext=$heightnow;
}
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
imageline($this->mImage,intval($this->mXZero+$this->mGradX*($i+1)),intval($this->mYZero - $heightnow),intval($this->mXZero+$this->mGradX*($i+2)),intval($this->mYZero - $heightnext),$color);
}
}
imagestring($this->mImage,$this->mFontSize,intval($this->mX-70),intval(10+($j)*30),$this->mCase[$j],$this->mFontColor);
imagefilledrectangle($this->mImage,intval($this->mX-60),intval(10+$j*30),intval($this->mX-60+40),intval(12+$j*30),$color);
}
}
//--------------
function printAll(){
imagepng($this->mImage,$this->mPath.$this->imPath.$this->mName);
imagedestroy($this->mImage);
}
//--------------调试
function debug(){
echo "X:".$this->mX."<br>Y:".$this->mY;
echo "<br>BORDER:".$this->mBorder;
echo "<br>";
print_r($this->mRs);
echo "<br>";
echo "<br>";
print_r($this->mYRecords);
echo "<br>";
echo "<br>";
print_r($this->mXRecords);
}
}
$report->SetImage(600,400,255,255,255,0);//参数(长,宽,背影色R,G,B,是否透明1或0)
//function SetFont($size,$color)
$report->SetFont(1);//字体大小1-10
$rs= array(0=> array(200,100),1=> array(300,100),2=> array(300,200));//数值,用指定符号隔开
//$case1 =array("a","b","c");
$case = array("My","Your");
$rsx= array(1,2,3);
$rsy= array(100,200,300,400,500);
$colors = array("FF0000","FFFF00");
//function SetRecords($rsx,$rsy,$colors,$rt=1,$border=4)
$report->SetRecords($rs,$rsx,$rsy,$case,$colors,1,20);
//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图,距离)
$report->DrawReport();
//$report->debug();//调式之用
*/
?>
function DrawVerticalColumn(){
//$colorcase=imagecolorallocate($this->mImage,250,0,0);
//imagerectangle($this->mImage,$this->mX-10,0,$this->mX-70,60,$colorcase);
$num_for_single_grad = count($this->mRs[0]);
$value_grad = $this->mYRecords[0];
$single_width = intval($this->mGradX / $num_for_single_grad);
if($single_width>40){//为了避免太宽,而不好看,所以把每条柱的最宽限为40
$single_width=40;
}
for($i=0;$i < $this->mXGradCnt; $i ++ ) // the first loop for group
{
for($j=0; $j < $num_for_single_grad;$j++ ) // the second loop for values in one group
{
if(is_numeric ($this->mRs[$i][$j])){
$value = $this->mRs[$i][$j] / $value_grad ;
if($value > $this->mYGradCnt)
{
$height = $this->mTotalY + 8;
}
else
{
$height = $this->mGradY * $value;
}
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
//$color=imagecolorallocate($this->mImage,substr($this->mColors[$i],0,2),substr($this->mColor[$i],2,2),substr($this->mColor[$i],4,2));
//$yy=20+$i*10;
imagefilledrectangle ($this->mImage,intval($this->mXZero + $this->mGradX * $i+$single_width*$j + $j*2),intval($this->mYZero - $height),intval($this->mXZero + $this->mGradX*$i+$single_width*($j+1)),intval($this->mYZero),$color);
//imagefilledrectangle ($this->mImage,intval($this->mXZero + $this->mGradX * $i+$single_width*$j + $j*2),intval($this->mYZero - $height),intval($this->mXZero + $this->mGradX*$i+$single_width*$j+$width_single_grade),intval($this->mYZero),$color);
imagestring($this->mImage,$this->mFontSize,intval($this->mX-70),intval(10+($j)*30),$this->mCase[$j],$this->mFontColor);
imagefilledrectangle($this->mImage,intval($this->mX-60+10),intval(10+$j*30),intval($this->mX-60+40),intval(20+$j*30),$color);
}
else{
$height = 0;
for($k=0;$k<$this->mYGradCnt;$k++)
if($this->mRs[$i][$j] == $this->mYRecords[$k])
{
$height=$this->mGradY*$k+$this->mGradY;
break;
}
else
{
$height = $this->mTotalY + 8;
}
//imagestring($this->mImage,$this->mFontSize,intval($this->mX-200-30*$i),intval(10+($j)*30),$height,$this->mFontColor);
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
//$color=imagecolorallocate($this->mImage,substr($this->mColors[$i],0,2),substr($this->mColor[$i],2,2),substr($this->mColor[$i],4,2));
//$yy=20+$i*10;
imagefilledrectangle ($this->mImage,intval($this->mXZero + $this->mGradX * $i+$single_width*$j + 10),intval($this->mYZero - $height),intval($this->mXZero + $this->mGradX*$i+$single_width*($j+1)+10),intval($this->mYZero),$color);
//imagestring($this->mImage,$this->mFontSize,intval($this->mX-200-30*$i),intval(10+($j)*30),$this->mRs[$i][$j] == $this->mYRecords[$k],$this->mFontColor);
imagestring($this->mImage,$this->mFontSize,intval($this->mX-80),intval(10+($j)*30),$this->mCase[$j],$this->mFontColor);
imagefilledrectangle($this->mImage,intval($this->mX-40+10),intval(10+$j*30),intval($this->mX-40+40),intval(20+$j*30),$color);
}
}
}
}
//--------------
function DrawLine(){
$num_for_single_grad = count($this->mRs[0]);
$value_grad = $this->mYRecords[0];
$single_width = intval($this->mGradX / $num_for_single_grad);
for($j=0; $j < $num_for_single_grad;$j++ )// the first loop for group
{
for($i=0;$i < $this->mXGradCnt-1; $i ++ ) // the second loop for values in one group
{ if(is_numeric ($this->mRs[$i][$j])){
$valuenow = $this->mRs[$i][$j] / $value_grad ;
if($valuenow > $this->mYGradCnt)
{
$heightnow = $this->mTotalY + 8;
}
else
{
$heightnow = $this->mGradY * $valuenow;
}
$valuenext = $this->mRs[$i+1][$j] / $value_grad ;
if($valuenext > $this->mYGradCnt)
{
$heightnext = $this->mTotalY + 8;
}
else
{
$heightnext = $this->mGradY * $valuenext;
}
if($i== $this->mXGradCnt-1)
{
$heightnext=$heightnow;
}
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
imageline($this->mImage,intval($this->mXZero+$this->mGradX*($i+1)),intval($this->mYZero - $heightnow),intval($this->mXZero+$this->mGradX*($i+2)),intval($this->mYZero - $heightnext),$color);
}
else{
for($k=0;$k<$this->mYGradCnt;$k++)
if($this->mRs[$i][$j] ==$this->mYRecords[$k])
{
$heightnow=$this->mGradY*$k+$this->mGradY;
break;
}
else{
$heightnow = $this->mTotalY + 8;
}
for($k=0;$k<$this->mYGradCnt;$k++)
if($this->mRs[$i+1][$j] ==$this->mYRecords[$k])
{
$heightnext=$this->mGradY*$k+$this->mGradY;
break;
}
else{
$heightnext = $this->mTotalY + 8;
}
if($i== $this->mXGradCnt-1)
{
$heightnext=$heightnow;
}
$color=imagecolorallocate($this->mImage,hexdec(substr($this->mColors[$j],0,2)),hexdec(substr($this->mColors[$j],2,2)),hexdec(substr($this->mColors[$j],4,2)));//颜色的组合
imageline($this->mImage,intval($this->mXZero+$this->mGradX*($i+1)),intval($this->mYZero - $heightnow),intval($this->mXZero+$this->mGradX*($i+2)),intval($this->mYZero - $heightnext),$color);
}
}
imagestring($this->mImage,$this->mFontSize,intval($this->mX-70),intval(10+($j)*30),$this->mCase[$j],$this->mFontColor);
imagefilledrectangle($this->mImage,intval($this->mX-60),intval(10+$j*30),intval($this->mX-60+40),intval(12+$j*30),$color);
}
}
//--------------
function printAll(){
imagepng($this->mImage,$this->mPath.$this->imPath.$this->mName);
imagedestroy($this->mImage);
}
//--------------调试
function debug(){
echo "X:".$this->mX."<br>Y:".$this->mY;
echo "<br>BORDER:".$this->mBorder;
echo "<br>";
print_r($this->mRs);
echo "<br>";
echo "<br>";
print_r($this->mYRecords);
echo "<br>";
echo "<br>";
print_r($this->mXRecords);
}
}
/*
$report=new DrawImageReportClass;
//function SetImage($x,$y,$r,$g,$b,$tran)
$report->SetImage(600,400,255,255,255,0);//参数(长,宽,背影色R,G,B,是否透明1或0)
//function SetFont($size,$color)
$report->SetFont(1);//字体大小1-10
$rs= array(0=> array(200,100),1=> array(300,100),2=> array(300,200));//数值,用指定符号隔开
//$case1 =array("a","b","c");
$case = array("My","Your");
$rsx= array(1,2,3);
$rsy= array(100,200,300,400,500);
$colors = array("FF0000","FFFF00");
//function SetRecords($rsx,$rsy,$colors,$rt=1,$border=4)
$report->SetRecords($rs,$rsx,$rsy,$case,$colors,2,20);
//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为折线图,距离)
$report->DrawReport();
//$report->debug();//调式之用
*/
?>