首页 > 语言 > PHP > 正文

php 图片处理函数实例教程

2024-09-04 11:44:26
字体:
来源:转载
供稿:网友
  1. <?php  
  2. //公用函数 
  3.  
  4. //把角度转换为弧度  
  5. function deg2Arc($degrees) {  
  6. return($degrees * (pi()/180.0));  
  7. //RGB  
  8. function getRGB($color){  
  9.   $R=($color>>16) & 0xff;  
  10.   $G=($color>>8) & 0xff;  
  11.   $B=($color) & 0xff;  
  12.   return (array($R,$G,$B));  
  13.  
  14. // 取得在椭圆心为(0,0)的椭圆上 x,y点的值  
  15. function pie_point($deg,$va,$vb){  
  16. $xcos(deg2Arc($deg)) * $va;  
  17. $y= sin(deg2Arc($deg)) * $vb;  
  18. return (array($x$y));  
  19.  
  20.  
  21. //3D饼图类 
  22.  
  23. class chart{ 
  24.  
  25. var $a//椭圆长半轴  
  26. var $b//椭圆短半轴  
  27. var $DataArray;  //每个扇形的数据  
  28. var $ColorArray//每个扇形的颜色 要求按照十六进制书写但前面不加0x  
  29. //为边缘及阴影为黑色 
  30.  
  31. function chart($pa=100,$pb=60,$sData="100,200,300,400,500,300"$sColor="ee00ff,dd0000,cccccc,ccff00,00ccff,ccff00")  
  32. {  
  33.     $this->a=$pa;  
  34.     $this->b=$pb;  
  35.     $this->DataArray=split(",",$sData);  
  36.     $this->ColorArray=split(",",$sColor);  
  37.  
  38. function setA($v){  
  39.     $this->a=$v;  
  40.  
  41. function getA(){  
  42.     return $this->a;  
  43.  
  44. function setB($v){  
  45.     $this->b=$v;   
  46.  
  47. function getB(){  
  48.     return $this->b;  
  49.  
  50. function setDataArray($v){  
  51.     $this->DataArray=split(",",$v);  
  52.  
  53. function getDataArray($v){  
  54.     return $this->DataArray;  
  55.  
  56. function setColorArray($v){  
  57.     $this->ColorArray=split(",",$v);  
  58.  
  59. function getColorArray(){  
  60.     return  $this->ColorArray;  
  61.  
  62.    
  63. function  DrawPie(){  
  64.     $image=imagecreate($this->a*2+40,$this->b*2+40);  
  65.     $PieCenterX=$this->a+10;  
  66.     $PieCenterY=$this->b+10;  
  67.     $DoubleA=$this->a*2;  
  68.     $DoubleB=$this->b*2;  
  69.     list($R,$G,$B)=getRGB(0);  
  70.     $colorBorder=imagecolorallocate($image,$R,$G,$B);  
  71.     $DataNumber=count($this->DataArray);  
  72.       
  73.     //$DataTotal  
  74.     for($i=0;$i<$DataNumber;$i++)      $DataTotal+=$this->DataArray[$i]; //算出数据和  
  75.       
  76.     //填充背境  
  77.     imagefill($image, 0, 0, imagecolorallocate($image, 0xFF, 0xFF, 0xFF)); 
  78.  
  79.     /*  
  80.     ** 画每一个扇形  
  81.     */  
  82.     $Degrees = 0;  
  83.     for($i = 0; $i < $DataNumber$i++){  
  84.         $StartDegrees = round($Degrees);  
  85.         $Degrees += (($this->DataArray[$i]/$DataTotal)*360);  
  86.         $EndDegrees = round($Degrees);  
  87.         $percent = number_format($this->DataArray[$i]/$DataTotal*100, 1);   
  88.         list($R,$G,$B)=getRGB(hexdec($this->ColorArray[$i]));  
  89.         $CurrentColor=imagecolorallocate($image,$R,$G,$B);  
  90.         if ($R>60 and $R<256)            $R=$R-60;  
  91.         if ($G>60 and $G<256)            $G=$G-60;  
  92.         if ($B>60 and $B<256)            $B=$B-60;  
  93.         $CurrentDarkColor=imagecolorallocate($image,$R,$G,$B);  
  94.         //画扇形弧  
  95.         imagearc($image,$PieCenterX,$PieCenterY,$DoubleA,$DoubleB,$StartDegrees,$EndDegrees,$CurrentColor);  
  96.         //画直线  
  97.         list($ArcX$ArcY) = pie_point($StartDegrees , $this->a , $this->b);  
  98.         imageline($image,$PieCenterX,$PieCenterY,floor($PieCenterX + $ArcX),floor($PieCenterY + $ArcY),$CurrentColor);  
  99.         //画直线  
  100.         list($ArcX$ArcY) = pie_point($EndDegrees,$this->a , $this->b);  
  101.         imageline($image,$PieCenterX,$PieCenterY,ceil($PieCenterX + $ArcX),ceil($PieCenterY + $ArcY),$CurrentColor);  
  102.         //填充扇形  
  103.         $MidPoint = round((($EndDegrees - $StartDegrees)/2) + $StartDegrees);  
  104.         list($ArcX$ArcY) = Pie_point($MidPoint$this->a*3/4 , $this->b*3/4);  
  105.           
  106.         imagefilltoborder($image,floor($PieCenterX + $ArcX),floor($PieCenterY + $ArcY), $CurrentColor,$CurrentColor);  
  107.         imagestring($image,2,floor($PieCenterX + $ArcX-5),floor($PieCenterY + $ArcY-5),$percent."%",$colorBorder); 
  108.  
  109.         //画阴影  
  110.         if ($StartDegrees>=0 and $StartDegrees<=180){  
  111.            if($EndDegrees<=180){      
  112.                for($k = 1; $k < 15; $k++)  
  113.                 imagearc($image,$PieCenterX$PieCenterY+$k,$DoubleA$DoubleB$StartDegrees$EndDegrees$CurrentDarkColor);  
  114.            }else{  
  115.                for($k = 1; $k < 15; $k++)  
  116.                 imagearc($image,$PieCenterX$PieCenterY+$k,$DoubleA$DoubleB$StartDegrees, 180, $CurrentDarkColor);  
  117.            } 
  118.  
  119.         }  
  120.    }  
  121.           
  122.     /*到此脚本已经生了一幅图像了  
  123.     **现在需要的是把它发到浏览器上,重要的一点是要将标头发给浏览器,让它知道是一个GIF文件。不然的话你只能看到一堆奇怪的乱码  
  124.     */   
  125.     //输出生成的图片      
  126.     header("Content-type: image/gif");  
  127.     imagegif($image);  
  128.     imagedestroy($image);  
  129. }//End drawPie()  
  130. }//End class
  131. //开源代码Vevb.com 
  132.  
  133. //实现 
  134. $objp = new chart();  
  135. $objp->DrawPie();  
  136. ?>  

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表