Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4997181
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2006-11-29 14:13:42

/**
 * 文件:cal_image.class.php
 * 功能:产生柱状、折线图、横柱图类
 * 作者:yemaosheng.com
 */

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; 
  } 
 } 

 /* 完成打印图形 */
 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(); 

 //参数(长,宽,背影色R,G,B,是否透明1或0)
 $report->setImage(2000, 300, 255, 255, 255, 1);

 //数值,用指定符号隔开 
 $temparray="50,25,100,250,180,200,2150,220,200,150,50,25,100,250,180,200,150,220,200,150";

 //参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图,距离) 
 $report->setItem(',',$temparray,3,20);

 //字体大小1-10 
 $report->setFont(1);

 //输出图片
 $report->PrintReport(); 

 //调式
// $report->debug();
?>

阅读(2234) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~