php打造智能化的柱状图程序,用于报表等

   这篇文章主要介绍了php打造智能化的柱状图程序,用于报表等的相关资料,需要的朋友可以参考下

  php打造智能化的柱状图程序,用于报表等

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379

<?php
/***
* @project Bar Graph Program
* @license GPL
* @package
* @file GrapBar.php
* @date 2007-4-3
* @version 1.0
* @last modified
 
* 定义 柱状图(柱形图) 类
*
* 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配置中的open_basedir项,如果没此路径请添加,或在程序中设置包含
*
* 智能化的柱状图程序,用于报表等
*
***/
 
define("DEFAULT_FONT_PATH", "c:/windows/fonts/simhei.ttf");
class SingleBar
{
private $_x;
private $_y;
private $_h;
public $_l = 50;
private $_w = null;
private $_srcPoints = array();
private $_points = array();
 
public function __construct($x, $y, $h, $l = 50, $w = null)
{
$this->_x = $x;
$this->_y = $y;
$this->_h = $h;
$this->_l = $l;
$this->_w = $w;
$this->_srcPoints = $this->getSrcPoints();
$this->_points = $this->getPoints();
}
 
public function getSrcPoints()
{
return array(
array($this->_x , $this->_y),
array($this->_x+$this->_l , $this->_y),
array($this->_x+(1.35*$this->_l), $this->_y-(0.35*$this->_l)),
array($this->_x+(0.35*$this->_l), $this->_y-(0.35*$this->_l)),
array($this->_x , $this->_y+$this->_h),
array($this->_x+$this->_l , $this->_y+$this->_h),
array($this->_x+(1.35*$this->_l), $this->_y+$this->_h-(0.35*$this->_l))
);
}
 
public function getPoints()
{
$points = array();
foreach($this->_srcPoints as $key => $val)
{
$points[] = $val[0];
$points[] = $val[1];
}
return $points;
}
 
public function getTopPoints()
{
return array_slice($this->_points, 0, 8); //顶坐标
}
 
public function getBelowPoints()
{
return array_merge(array_slice($this->_points, 0, 2), array_slice($this->_points, 8, 4), array_slice($this->_points, 2, 2)); //下坐标
}
 
public function getRightSidePoints()
{
return array_merge(array_slice($this->_points, 2, 2), array_slice($this->_points, 10, 4), array_slice($this->_points, 4, 2)); //右侧坐标
}
 
public function draw($image, $topColor, $belowColor, $sideColor, $borderColor = null, $type = 'LEFT')
{
if (is_null($borderColor))
{
$borderColor = 0xcccccc;
}
 
$top_rgb = $this->getRGB($topColor);
$below_rgb = $this->getRGB($belowColor);
$side_rgb = $this->getRGB($sideColor);
$top_color = imagecolorallocate($image, $top_rgb['R'], $top_rgb['G'], $top_rgb['B']);
$below_color = imagecolorallocate($image, $below_rgb['R'], $below_rgb['G'], $below_rgb['B']);
$side_color = imagecolorallocate($image, $side_rgb['R'], $side_rgb['G'], $side_rgb['B']);
 
imagefilledpolygon($image, $this->getTopPoints(), 4, $top_color); //画顶面
imagepolygon($image, $this->getTopPoints(), 4, $borderColor); //画顶面边线
 
imagefilledpolygon($image, $this->getBelowPoints(), 4, $below_color); //画下面
imagepolygon($image, $this->getBelowPoints(), 4, $borderColor); //画下面边线
 
if ($type == 'LEFT')
{
imagefilledpolygon($image, $this->getRightSidePoints(), 4, $side_color); //画右侧面
imagepolygon($image, $this->getRightSidePoints(), 4, $borderColor); //画侧面边线
}
}
 
public function getRGB($color)
{
$ar = array();
$color = hexdec($color);
$ar['R'] = ($color>>16) & 0xff;
$ar['G'] = ($color>>8) & 0xff;
$ar['B'] = ($color) & 0xff;
return $ar;
}
}
 
class Bar
{
private $_W;
private $_H;
private $_bgColor = "ffffff";
private $_barHeights = array();
private $_barTexts = array();
private $_barColors = array();
public $_title;
public $_paddingTop = 30;
public $_paddingBottom = 100;
public $_paddingLeft = 45;
public $_paddingRight = 2;
public $_barL = 50;
public $image;
 
public function __construct($imgW, $imgH, $barHeights, $barTexts = null, $barColors = null)
{
$this->_W = $imgW;
$this->_H = $imgH;
$this->_barHeights = $barHeights;
$this->_barTexts = $barTexts;
$this->_barColors = $barColors;
$this->_paddingBottom = $this->resetPaddingBottom();
$this->_H = $this->resetHeight();
$this->image = imagecreatetruecolor($this->_W, $this->_H);
}
 
public function stroke()
{
$this->drawBg();
$this->drawBars();
$this->drawTitle();
$this->drawLables();
ob_start();
//header("Content-type: image/png");
//imagepng($this->image);
header("Content-type: " . image_type_to_mime_type(IMAGETYPE_JPEG));
imagejpeg($this->image);
imagedestroy($this->image);
}
 
public function drawBg()
{
$img_w = $this->_W;
$img_h = $this->_H;
$paddingTop = $this->_paddingTop;
$paddingBottom = $this->_paddingBottom;
$paddingLeft = $this->_paddingLeft;
$paddingRight = $this->_paddingRight;
$rgb = $this->getRGB($this->_bgColor);
$bg = imagecolorallocate($this->image,$rgb['R'], $rgb['G'], $rgb['B']);
imagefilledrectangle($this->image, 0, 0, $img_w, $img_h, $bg);
$side_bg = imagecolorallocatealpha($this->image, 220, 220, 220, 75);
$side_bg2 = imagecolorallocate($this->image, 220, 220, 220);
$border_color = imagecolorallocate($this->image, 190, 190, 190);
$line_color = imagecolorallocate($this->image, 236, 236, 236);
$dial_color = imagecolorallocate($this->image, 131, 131, 131);
 
$x1 = $paddingLeft;
$y1 = $paddingTop;
$x2 = $img_w - $paddingRight;
$y2 = $img_h - $paddingBottom;
imagerectangle($this->image, $x1, $y1, $x2, $y2, $border_color);
imagefilledpolygon($this->image, array($x1-5,$y1+10, $x1-5,$y2+10, $x1,$y2, $x1,$y1), 4, $side_bg);
imagepolygon($this->image, array($x1-5,$y1+10, $x1-5,$y2+10, $x1,$y2, $x1,$y1), 4, $border_color);
imagefilledpolygon($this->image, array($x1-5,$y2+10, $x2-5,$y2+10, $x2,$y2, $x1,$y2), 4, $side_bg);
imagepolygon($this->image, array($x1-5,$y2+10, $x2-5,$y2+10, $x2,$y2, $x1,$y2), 4, $border_color);
imageline($this->image, $x1, $y2, $x2, $y2, $side_bg2);
 
$total_h = $img_h - $paddingTop - $paddingBottom;
$every_h = $total_h/11;
for($i=1; $i<=10; $i++)
{
imageline($this->image, $x1, $y1+($every_h*$i), $x2, $y1+($every_h*$i), $line_color); //画网线
}
 
$max_h = max($this->_barHeights);
for($i=1; $i<=10; $i++)
{
$value = $max_h - (($max_h/10)*($i-1));
$value = strval($value);
$str_w = strlen($value)*5;
imageline($this->image, $x1-5-3, $y1+10+($every_h*$i), $x1-3+1, $y1+10+($every_h*$i), $dial_color); //画刻度线
imagestring($this->image, 3, $x1-5-3-$str_w-1, $y1+10+($every_h*$i)-5, $value, 0x000000);
}
}
 
 
public function drawBars()
{
$counts = count($this->_barHeights);
if (empty($this->_barColors))
{
$color = $this->setColor();
$this->_barColors = array_slice($color, 0, $counts);
//shuffle($this->_barColors);
}
$every_w = ($this->_W - $this->_paddingLeft - $this->_paddingRight)/$counts; //每一段宽
$barL = $every_w;
$barL = ($barL > $this->_barL*1.35+6) ? $this->_barL : $barL/1.35 - 6;
$max_h = max($this->_barHeights);
$ruler_h = $this->_H - $this->_paddingTop - $this->_paddingBottom; //标尺总高度
$stander_h = $ruler_h - ($ruler_h/11); //标尺10等分的高度
$i = 0;
foreach ($this->_barHeights as $val)
{
$h = ($stander_h/$max_h)*$val;
$x = $this->_paddingLeft + ($every_w*$i) + (($every_w - ($barL*1.35))/2);;
$y = $this->_H - $this->_paddingBottom + 10 - $h;
//$t_color = $this->_barColors[$i];
$b_color = $this->_barColors[$i];
//$s_color = $this->_barColors[$i];
 
 
$rgb = $this->getRGB($this->_barColors[$i]);
$R = $rgb['R'] * 0.7;
$G = $rgb['G'] * 0.7;
$B = $rgb['B'] * 0.7;
 
$c1 = $R > 0 ? dechex($R) : '00';
$c2 = $G > 0 ? dechex($G) : '00';
$c3 = $B > 0 ? dechex($B) : '00';
 
$t_color = $b_color;
$s_color = $c1. $c2 . $c3;
 
$SingleBar = new SingleBar($x, $y, $h, $barL);
$SingleBar->draw($this->image, $t_color, $b_color, $s_color);
$i++;
}
}
 
public function drawTitle()
{
if (empty($this->_title))
{
return;
}
$font = 5;
$font_w = imagefontwidth($font);
$len = strlen($this->_title);
$x = ($this->_W + $this->_paddingLeft - $this->_paddingRight)/2;
$x -= ($len*$font_w)/2;
$y = ($this->_paddingTop - $font_w)/2 + 12;
//imagestring($this->image, $font, $x, $y, $title, 0x000000);
imagettftext($this->image, 12, 0, $x, $y, 0x000000, DEFAULT_FONT_PATH, $this->_title);
}
 
public function drawLables()
{
$x1 = $this->_paddingLeft - 5;
$y1 = $this->_H - $this->_paddingBottom + 20;
$x2 = $this->_W - $this->_paddingRight;
$y2 = $this->_H - 10;
//imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, 0xffffff);
imagerectangle($this->image, $x1, $y1, $x2, $y2, 0x000000);
$space = 5;
$x = $x1 + 3;
$y = $y1 + 3;
foreach ($this->_barTexts as $key => $val)
{
$color = $this->_barColors[$key];
$rgb = $this->getRGB($color);
$bg = imagecolorallocate($this->image,$rgb['R'], $rgb['G'], $rgb['B']);
imagefilledrectangle($this->image, $x, $y, $x+12, $y+12, $bg); //绘12*12的矩形
imagerectangle($this->image, $x, $y, $x+12, $y+12, 0x000000); //绘12*12的矩形框
imagettftext($this->image, 12, 0, $x+12+3, $y+12, 0x000000, DEFAULT_FONT_PATH, $val);
$x += 12 + $space + (strlen($val)*8) + $space;
if ($x + (strlen($val)*8) >= $this->_W - $this->_paddingLeft - $this->_paddingRight)
{
$x = $x1 + 3;
$y = $y + 12 + 3;
}
}
}
 
public function resetPaddingBottom()
{
$ruler_w = $this->_W - $this->_paddingLeft - $this->_paddingRight;
$label_w = $this->getLableTotalWidth();
$lines = ceil($label_w / $ruler_w);
$h = 12 * $lines + (3 * ($lines + 1)) + 30;
return $h;
}
 
public function resetHeight()
{
$padding_bottom = $this->resetPaddingBottom();
if ($this->_H - $padding_bottom < 222)
{
return 222 + $padding_bottom;
}
return $this->_H;
}
 
 
public function getLableTotalWidth()
{
$counts = count($this->_barTexts);
$space = 5;
$total_len = 0;
foreach ($this->_barTexts as $val)
{
$total_len += strlen($val);
}
 
$tx_w = ($total_len * 9) + ((12 + 3 + $space) * $counts);
return $tx_w;
}
 
public function setBg($color)
{
$this->_bgColor = $color;
}
 
public function setTitle($title)
{
$this->_title = $title;
}
 
public function setColor()
{
$ar = array('ff', '00', '33', '66', '99', 'cc');
$color = array();
for ($i=0; $i<6; $i++)
{
for ($j=0; $j<6; $j++)
{
for($k=0; $k<6; $k++)
{
$color[] = $ar[$i] . $ar[$j] . $ar[$k];
}
}
}
 
$color2 = array();
for ($i=1; $i<216; $i += 4)
{
$color2[] = $color[$i];
}
 
return $color2;
}
 
public function getRGB($color)
{
$ar = array();
$color = hexdec($color);
$ar['R'] = ($color>>16) & 0xff;
$ar['G'] = ($color>>8) & 0xff;
$ar['B'] = ($color) & 0xff;
return $ar;
}
}
 
/***/
$bar = new Bar(500, 300, array(600, 300, 30, 500, 400, 250, 350, 360), array('AAAAA', 'BBBBB', 'CCCCC', 'DDDDD', 'EEEEEE', 'FFFFFF', 'GGGGGGG', 'HHHHHHHHH'));
$bar->setTitle('打造完美柱状图!');
$bar->stroke();
/***/
?>

  以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-10-31 19:33:37

php打造智能化的柱状图程序,用于报表等的相关文章

php打造智能化的柱状图程序,用于报表等_php实例

php打造智能化的柱状图程序,用于报表等 <?php /*** * @project Bar Graph Program * @license GPL * @package * @file GrapBar.php * @date 2007-4-3 * @version 1.0 * @last modified * 定义 柱状图(柱形图) 类 * * 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配置中的open_basedir项,如果没此路径请添加,或在程序中设置包

PHP和MYSQL联合打造简单留言本程序

数据库结构:(库名:lyb)表一: admin字段: id(int11)   name(varchvr)   password(varchvr) 表二: lo字段: id(int11)   username(varchvr)  sex(varchvr)  qq(varchvr)  email(varchvr)  info(text)  ip(varchvr)  submit_time(datetime) 1 conn.php(连接数据库文件) <?phpmysql_connect("loc

苹果携手SAP为iPhone打造企业原生应用程序

5月5日消息,苹果同IBM的合作加快了苹果企业技术的前进脚步,打造企业应用程序,现在,苹果同SAP也建立了类似的合作关系. SAP和苹果推出计划,使用SAP HANA平台为iPhone和iPad打造原生企业应用程序.此外,SAP表示将提供一个iOS软件开发工具包和培训教程,目的是让企业能够开发iOS业务应用程序. 这一消息是在大家对苹果的担心日益增长的时候传来的.在iPhone 6升级周期中,iPhone销售量下滑,而智能手机行业已经成熟.对于苹果来说,摆脱这种增长困难局面的一种方法是更好地瞄准

SAP 创始人:打造“一连串的应用程序”

5月20日晨消息,到目前为止,Digital Boardroom.Financial Statement Insights.RealSpend和Knowledge Workspace都还处于原型阶段,它们都是SAP在其HANA云计算平台上构建的应用程序. 但是,SAP董事长及联合创始人Hasso Plattner表示,SAP计划打造"一连串的应用程序". 在佛罗里达州奥兰多举办的2016 SAP Sapphire Now活动中,Plattner在主题演讲中表示:"由于S/4

微软推出全新工具和服务,帮助各平台开发者打造智能的应用程序

2017年5月10日,美国,西雅图 -- 微软年度开发者盛会Build 2017在美国西雅图开幕,微软公司首席执行官萨提亚 ∙ 纳德拉.微软全球执行副总裁兼云计算与企业事业部负责人Scott Guthrie.微软全球执行副总裁兼人工智能及微软研究事业部负责人沈向洋,与数千名来自全球各地的开发者齐聚一堂.纳德拉在开幕演讲中宣布Windows 10的月活跃设备数已经达到5亿,并明确指出Windows.Microsoft Office与Microsoft Azure将共同创造超过10亿个机会,让开发者

打造你自己的程序员品牌

John Sonmez是Simple Programmer的 创始人.作者与程序员,关注于如何让复杂的事情变得简单.他是一位专业的软件开发者.架构师与讲师,感兴趣的领域包括测试驱动开发.如何编写整洁的代码. 敏捷方法学等.John坚信可以通过简单的方式来解决复杂的问题.大多数优雅的解决方案都是很简单的.近日,John撰写了一篇文章,谈到了如何打造程序员自己的品牌,在社区中引起了不小的反响. 你的职业是一位软件开发者,但这并不意味着你不用关注于品牌问题.事实上,如果你想让自己的职业生涯更上一层楼,

DNN中的本地化——打造全球通用的程序

经常看到一些关于DNN的网站上有相应的语言包下载.通过下载语言包并安装可以可以起到对DNN应用程序本地化的效果(我们通常叫汉化).现在就让我们看看DNN是如何进行本地化的.(想把整个本地化的来龙去脉说清楚实在太难,我组织了几天的语言也没能表达清楚,只能是列举几个概念希望能对大家看这方面的内容有帮助) 原理: DNN中的页面全部是由用户控件组成的.本地化应用程序只需对每一个用户控件进行本地化就行了.对控件进行本地化的资源都在相应的资源文件中. 几个相关名词(DNN程序本地化中常用的几个名词自己根据

一个图片地址分解程序(用于PHP小偷程序)_php技巧

如题,返回一个数组,可以获得图片地址的base url,相对地址,名称等,具体见下例: <? error_reporting(E_ALL ^ E_NOTICE); $imgurl='yun_qi_img/201408232212306.png'; $imgurl_dir='/img/2014/07/02/14520384.gif'; //echo getimg($imgurl,'./img'); var_dump(url_set_value($imgurl)); var_dump(url_set

Php绘制柱状图

先来看看效果图吧: 下面我们来看看php怎么样实现绘图这个功能的. <?php /***   * @project Bar Graph Program   * @license GPL   * @package   * @file GrapBar.php   * @date 2007-4-3   * @version 1.0   * @last modified     * 定义 柱状图(柱形图) 类   *   * 注意,使用前请确保字体路径存在并允许访问,如果出错,还要检查在php.ini配