- /***
- * @project 막대 그래프 프로그램
- * @license GPL
- * @package
- * @file GrapBar.php
- * @date 2007-4-3
- * @version 1.0
- * @last Modified
-
- * 히스토그램(컬럼차트) 클래스 정의
- *
- * 참고로 사용 전 폰트 경로가 존재하고 접근을 허용하는지 확인하고, error php.ini 구성의 open_basedir 항목에 해당 경로가 없으면 추가하거나 프로그램에 포함하도록 설정하세요.
- *
- * 보고서 등에 사용되는 지능형 히스토그램 프로그램
- *
- * **/
-
- 정의("DEFAULT_FONT_PATH", "c:/windows/fonts/simhei.ttf ");
- class SingleBar
- {
- private $_x;
- 비공개 $_y;
- 비공개 $_h;
- 공개 $_l = 50;
- 비공개 $_w = null;
- 비공개 $_srcPoints = 배열();
- 비공개 $_points = array();
-
- 공개 함수 __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();
- }
-
- 공용 함수 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 )),
- 배열($this->_x , $this->_y $this->_h),
- 배열($this->_x $this->_l , $this- >_y $this->_h),
- array($this->_x (1.35*$this->_l), $this->_y $this->_h-(0.35*$ this->_l))
- );
- }
-
- 공용 함수 getPoints()
- {
- $points = array();
- foreach($this->_srcPoints as $key => $val)
- {
- $points[] = $val[0];
- $포인트[] = $val[1];
- }
- $포인트를 반환합니다.
- }
-
- 공용 함수 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)); //右侧坐标
- }
-
- 공개 함수 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); //画侧면边线
- }
- }
-
- 공용 함수 getRGB($color)
- {
- $ar = array();
- $color = hexdec($color);
- $ar['R'] = ($color>>16) & 0xff;
- $ar['G'] = ($color>>8) & 0xff;
- $ar['B'] = ($color) & 0xff;
- $ar 반환;
- }
- }
-
- 클래스 바
- {
- private $_W;
- 비공개 $_H;
- 비공개 $_bgColor = "ffffff";
- 비공개 $_barHeights = array();
- 비공개 $_barTexts = array();
- 비공개 $_barColors = array();
- 공개 $_title;
- 공개 $_paddingTop = 30;
- 공개 $_paddingBottom = 100;
- 공개 $_paddingLeft = 45;
- 공개 $_paddingRight = 2;
- 공개 $_barL = 50;
- 공개 $이미지;
-
- 공개 함수 __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);
- }
-
- 공용 함수 스트로크()
- {
- $this->drawBg();
- $this->drawBars();
- $this->drawTitle();
- $this->drawLables();
- ob_start();
- //header("콘텐츠 유형: 이미지/png");
- //imagepng($this->image);
- header("콘텐츠 유형: " . image_type_to_mime_type(IMAGETYPE_JPEG));
- imagejpeg($this->image);
- imagedestroy($this->image);
- }
-
- 공개 함수 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']);
- imagefilled직사각형($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);
- }
- }
-
-
- 공개 함수 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->_padding하단 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? 데첵스($R) : '00';
- $c2 = $G > 0? 데첵($G) : '00';
- $c3 = $B > 0? 데첵($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 ;
- }
- }
-
- 공용 함수 drawTitle()
- {
- if (empty($this->_title))
- {
- return;
- }
- $font = 5;
- $font_w = 이미지폰트폭($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);
- }
-
- 공개 함수 drawLables()
- {
- $x1 = $this->_paddingLeft - 5;
- $y1 = $this->_H - $this->_paddingBottom 20;
- $x2 = $this->_W - $this->_paddingRight;
- $y2 = $this->_H - 10;
- //imagefilled직사각형($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']);
- imagefilled직사각형($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;
- }
- }
- }
-
- 공개 함수 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;
- $h를 반환합니다.
- }
-
- 공개 함수 ResetHeight()
- {
- $padding_bottom = $this->resetPaddingBottom();
- if ($this->_H - $padding_bottom < 222)
- {
- return 222 $padding_bottom;
- }
- return $this->_H;
- }
-
-
- 공개 함수 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);
- $tx_w 반환;
- }
-
- 공개 함수 setBg($color)
- {
- $this->_bgColor = $color;
- }
-
- 공개 함수 setTitle($title)
- {
- $this->_title = $title;
- }
-
- 공용 함수 setColor()
- {
- $ar = array('ff', '00', '33', '66', '99', 'cc' );
- $color = 배열();
- for ($i=0; $i {
- for ($j=0; $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;
- }
-
- 공개 함수 getRGB($color)
- {
- $ar = array();
- $color = hexdec($color);
- $ar['R'] = ($color>>16) & 0xff;
- $ar['G'] = ($color>>8) & 0xff;
- $ar['B'] = ($color) & 0xff;
- $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->스트로크();
- /***/
- ?>
제제대码
|