当前位置:首页 > PHP教程 > php图像处理 > 列表

PHP生成饼图的示例代码

发布:smiling 来源: PHP粉丝网  添加日期:2023-06-23 15:51:12 浏览: 评论:0 

这篇文章主要为大家详细介绍了如何利用PHP实现饼图的绘制,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下。

首先要把php_iconv.dll和inconv.dll COPY到c:\winnt\system32下,直接上代码:

  1. <? 
  2. define("ANGLE_STEP", 5); //定义画椭圆弧时的角度步长 
  3.  
  4. function draw_getdarkcolor($img,$clr//求$clr对应的暗色 
  5. $rgb = imagecolorsforindex($img,$clr); 
  6. return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2); 
  7.  
  8. function draw_getexy($a$b$d//求角度$d对应的椭圆上的点坐标 
  9. $d = deg2rad($d); 
  10. return array(round($a*Cos($d)), round($b*Sin($d))); 
  11.  
  12. function draw_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr//椭圆弧函数 
  13. $n = ceil(($ed-$sd)/ANGLE_STEP); 
  14. $d = $sd
  15. list($x0,$y0) = draw_getexy($a,$b,$d); 
  16. for($i=0; $i<$n$i++) 
  17. $d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); 
  18. list($x$y) = draw_getexy($a$b$d); 
  19. imageline($img$x0+$ox$y0+$oy$x+$ox$y+$oy$clr); 
  20. $x0 = $x
  21. $y0 = $y
  22.  
  23. function draw_sector($img$ox$oy$a$b$sd$ed$clr//画扇面 
  24. $n = ceil(($ed-$sd)/ANGLE_STEP); 
  25. $d = $sd
  26. list($x0,$y0) = draw_getexy($a$b$d); 
  27. imageline($img$x0+$ox$y0+$oy$ox$oy$clr); 
  28. for($i=0; $i<$n$i++) 
  29. $d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); 
  30. list($x$y) = draw_getexy($a$b$d); 
  31. imageline($img$x0+$ox$y0+$oy$x+$ox$y+$oy$clr); 
  32. $x0 = $x
  33. $y0 = $y
  34. imageline($img$x0+$ox$y0+$oy$ox$oy$clr); 
  35. list($x$y) = draw_getexy($a/2, $b/2, ($d+$sd)/2); 
  36. imagefill($img$x+$ox$y+$oy$clr); 
  37.  
  38. function draw_sector3d($img$ox$oy$a$b$v$sd$ed$clr//3d扇面 
  39. draw_sector($img$ox$oy$a$b$sd$ed$clr); 
  40. if($sd<180) 
  41. list($R$G$B) = draw_getdarkcolor($img$clr); 
  42. $clr=imagecolorallocate($img$R$G$B); 
  43. if($ed>180) $ed = 180; 
  44. list($sx$sy) = draw_getexy($a,$b,$sd); 
  45. $sx += $ox
  46. $sy += $oy
  47. list($ex$ey) = draw_getexy($a$b$ed); 
  48. $ex += $ox
  49. $ey += $oy
  50. imageline($img$sx$sy$sx$sy+$v$clr); 
  51. imageline($img$ex$ey$ex$ey+$v$clr); 
  52. draw_arc($img$ox$oy+$v$a$b$sd$ed$clr); 
  53. list($sx$sy) = draw_getexy($a$b, ($sd+$ed)/2); 
  54. $sy += $oy+$v/2; 
  55. $sx += $ox
  56. imagefill($img$sx$sy$clr); 
  57. function draw_getindexcolor($img$clr//RBG转索引色 
  58.  
  59. $R = ($clr>>16) & 0xff; 
  60. $G = ($clr>>8)& 0xff; 
  61. $B = ($clr) & 0xff; 
  62. return imagecolorallocate($img$R$G$B); 
  63.  
  64. // 绘图主函数,并输出图片 
  65. // $datLst 为数据数组, $datLst 为标签数组, $datLst 为颜色数组 
  66. // 以上三个数组的维数应该相等 
  67. function draw_img($datLst,$labLst,$clrLst,$a=250,$b=120,$v=20,$font=10) 
  68. $ox = 5+$a
  69. $oy = 5+$b
  70. $fw = imagefontwidth($font); 
  71. $fh = imagefontheight($font); 
  72.  
  73. $n = count($datLst);//数据项个数 
  74.  
  75. $w = 10+$a*2; 
  76. $h = 10+$b*2+$v+($fh+2)*$n
  77.  
  78. $img = imagecreate($w$h); 
  79.  
  80. //转RGB为索引色 
  81. for($i=0; $i<$n$i++) 
  82. $clrLst[$i] = draw_getindexcolor($img,$clrLst[$i]); 
  83.  
  84. $clrbk = imagecolorallocate($img, 0xff, 0xff, 0xff); 
  85. $clrt = imagecolorallocate($img, 0x00, 0x00, 0x00); 
  86.  
  87. //填充背景色 
  88. imagefill($img, 0, 0, $clrbk); 
  89.  
  90. //求和 
  91. $tot = 0; 
  92. for($i=0; $i<$n$i++) 
  93. $tot += $datLst[$i]; 
  94. $sd = 0; 
  95. $ed = 0; 
  96. $ly = 10+$b*2+$v
  97. for($i=0; $i<$n$i++) 
  98. $sd = $ed
  99. $ed += $datLst[$i]/$tot*360; 
  100.  
  101. //画圆饼 
  102. draw_sector3d($img$ox$oy$a$b$v$sd$ed$clrLst[$i]); //$sd,$ed,$clrLst[$i]); 
  103.  
  104. //画标签 
  105. imagefilledrectangle($img, 5, $ly, 5+$fw$ly+$fh$clrLst[$i]); 
  106. imagerectangle($img, 5, $ly, 5+$fw$ly+$fh$clrt); 
  107. //imagestring($img, $font, 5+2*$fw, $ly, $labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)", $clrt); 
  108.  
  109. $str=iconv("GB2312""UTF-8"$labLst[$i]); 
  110. ImageTTFText($img$font, 0, 5+2*$fw$ly+13, $clrt"C:\WINNT\Fonts\simsun.ttc"$str.":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)"); 
  111. $ly += $fh+2; 
  112.  
  113. //输出图形 
  114. header("Content-type: image/png"); 
  115.  
  116. //输出生成的图片 
  117. $imgFileName = "../temp/".time().".png"
  118. imagepng($img,$imgFileName); 
  119.  
  120.  
  121. $datLst = array(30, 10, 20, 20, 10, 20, 10, 20); //数据 
  122. $labLst = array("中国科技大学""安徽理工大学""清华大学""北京大学""南京大学""上海大学""河海大学""中山大学"); //标签 
  123. $clrLst = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); 
  124.  
  125. //画图 
  126. draw_img($datLst,$labLst,$clrLst); 
  127. ?> 

要注意的是,ImageTTFText函数中的字体C:\WINNT\Fonts\simsun.ttc

Tags: PHP生成饼图

分享到:

相关文章