最近写的一个GD图库用以生成横竖柱状图和折线图的类库,算是一个教学例程吧;
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(){;
Header( "Content-type: image/gif")
//建立画布大小;
$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
};
$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
};
};
//--------------完成打印图形http://knowsky.com
function printAll(){;
ImageGIF($this->IMAGE)
ImageDestroy($this->IMAGE)
};
//--------------调试;
function debug(){;
echo "X:".$this->X."
Y:".$this->Y
echo "
BORDER:".$this->BORDER
$item_array=split($this->ARRAYSPLIT,$this->ITEMARRAY)
$num=Count($item_array)
echo "
数值个数:".$num."
数值:"
for ($i=0;$i<$num;$i++){
echo "
".$item_array[$i]
};
};
};
$report=new ImageReport
$report->setImage(600,300,255,255,255,1);//参数(长,宽,背影色R,G,B,是否透明1或0);
$temparray="50,25,100,250,180,200,150,220,200,150,50,25,100,250,180,200,150,220,200,150";//数值,用指定符号隔开;
$report->setItem(',',$temparray,3,20);//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图,距离);
$report->setFont(1);//字体大小1-10;
$report->PrintReport()
//$report->debug();//调式之用;
?>
标签: