首页 > php图像处理 > php生成曲线图程序

php生成曲线图程序

<?php
/*******************用法*************************
    $gg=new build_graph(); 
     
    $d1=array(0,62,25,20,20,100,99);  //曲线一 
//$d1=array('15'=>5,'16'=>8,'17'=>7,'18'=>9,'19'=>10,'20'=>15,'21'=>9); 改成这个形式啦 
    $d2=array(0,80,75,65,100,56,79);  //曲线二 
    $d3=array(0,60,50,25,12,56,45);   //曲线三 一下可以继续以此类推 
     
    $gg->add_data($d1); 
    $gg->add_data($d2); 
    $gg->add_data($d3); 
     
    $gg->set_colors("ee00ff,dd8800,00ff00"); //对应曲线的颜色 
     
    //生成曲线图 
    $gg->build("line",0);          //参数0表示显示所有曲线,1为显示第一条,依次类推 
     
    //生成矩形图 
    //$gg->build("rectangle","2");    //参数0表示显示第一个矩形,1也为显示第一条,其余依次类推 
     
/////////////////////////////////////////////////////////// 
    //自定义图形显示,可任意图形叠加显示 
       header("Content-type: image/png"); 
       $gg->create_cloths();          //画布 
       $gg->create_frame();          //画个框先 
       //$gg->build_rectangle(2);       //画矩形 
       $gg->create_line();             //画线 
       $gg->build_line(0);             //画曲线 
       imagepng($gg->image); 
       imagedestroy($gg->image); 
*/
class build_graph {
    var $graphwidth = 300;
    var $graphheight = 300;
    var $width_num = 0; //宽分多少等分
    var $height_num = 10; //高分多少等分,默认为10
    var $height_var = 0; //高度增量(用户数据平均数)
    var $width_var = 0; //宽度增量(用户数据平均数)
    var $height_max = 0; //最大数据值
    var $array_data = array(); //用户待分析的数据的二维数组
    var $array_error = array(); //收集错误信息
    var $colorBg=array(255,255,255);    //图形背景-白色 
var $colorGrey=array(192,192,192);    //灰色画框 
var $colorBlue=array(0,0,255);       //蓝色 
var $colorRed=array(255,0,0);       //红色(点) 
var $colorDarkBlue=array(0,0,255);    //深色 
var $colorLightBlue=array(200,200,255);       //浅色 
    var $array_color; //曲线着色(存储十六进制数)
    var $image; //我们的图像
    //方法:接受用户数据
    function add_data($array_user_data) {
        if (!is_array($array_user_data) or emptyempty($array_user_data)) {
            $this->array_error['add_data'] = "没有可供分析的数据";
            return false;
            exit();
        }
        $i = count($this->array_data);
        $this->array_data[$i] = $array_user_data;
    }
    //方法:定义画布宽和长
    function set_img($img_width, $img_height) {
        $this->graphwidth = $img_width;
        $this->graphheight = $img_height;
    }
    //设定Y轴的增量等分,默认为10份
    function set_height_num($var_y) {
        $this->height_num = $var_y;
    }
    //定义各图形各部分色彩
    function get_RGB($color) { //得到十进制色彩
        $R = ($color >> 16) & 0xff;
        $G = ($color >> 8) & 0xff;
        $B = ($color) & 0xff;
        return (array($R,$G,$B));
    }
    //---------------------------------------------------------------
    //定义背景色
    function set_color_bg($c1, $c2, $c3) {
        $this->colorBg=array($c1,$c2,$c3);
    }
    //定义画框色
    function set_color_Grey($c1, $c2, $c3) {
        $this->colorGrey=array($c1,$c2,$c3);
    }
    //定义蓝色
    function set_color_Blue($c1, $c2, $c3) {
        $this->colorBlue=array($c1,$c2,$c3);
    }
    //定义色Red
    function set_color_Red($c1, $c2, $c3) {
        $this->colorRed=array($c1,$c2,$c3);
    }
    //定义深色
    function set_color_DarkBlue($c1, $c2, $c3) {
        $this->colorDarkBlue=array($c1,$c2,$c3);
    }
    //定义浅色
    function set_color_LightBlue($c1, $c2, $c3) {
        $this->colorLightBlue=array($c1,$c2,$c3);
    }
    //---------------------------------------------------------------
    //方法:由用户数据将画布分成若干等份宽
    //并计算出每份多少像素
    function get_width_num() {
        $this->width_num = count($this->array_data[0]);
    }
    function get_max_height() {
        //获得用户数据的最大值
        $tmpvar = array();
        foreach ($this->array_data as $tmp_value) {
            $tmpvar[] = max($tmp_value);
        }
        $this->height_max = max($tmpvar);
        return max($tmpvar);
    }
    function get_height_length() {
        //计算出每格的增量长度(用户数据,而不是图形的像素值)
        $max_var = $this->get_max_height();
        $max_var = round($max_var / $this->height_num);
        $first_num = substr($max_var, 0, 1);
        if (substr($max_var, 1, 1)) {
            if (substr($max_var, 1, 1) >= 5) $first_num+= 1;
        }
        for ($i = 1; $i < strlen($max_var); $i++) {
            $first_num.= "0";
        }
        return (int)$first_num;
    }
    function get_var_wh() //得到高和宽的增量
    {
        $this->get_width_num();
        //得到高度增量和宽度增量
        $this->height_var = $this->get_height_length();
        $this->width_var = round($this->graphwidth / $this->width_num);
    }
    function set_colors($str_colors) {
        //用于多条曲线的不同着色,如$str_colors="ee00ff,dd0000,cccccc"
        $this->array_color = split(",", $str_colors);
    }
    //#####################################################################################################
    function build_line($var_num) {
        if (!emptyempty($var_num)) { //如果用户只选择显示一条曲线
            $array_tmp[0] = $this->array_data[$var_num - 1];
            $this->array_data = $array_tmp;
        }
        //画线
        for ($j = 0; $j < count($this->array_data); $j++) {
            list($R, $G, $B) = $this->get_RGB(hexdec($this->array_color[$j]));
            $colorBlue = imagecolorallocate($this->image, $R, $G, $B);
            $i = 0;
            foreach ($this->array_data[$j] as $keys => $values) {
                $height_next_pix[] = round($this->array_data[$j][$keys] / $this->height_max * $this->graphheight);
            }
            foreach ($this->array_data[$j] as $key => $value) {
                $height_pix = round(($this->array_data[$j][$key] / $this->height_max) * $this->graphheight);
                if ($i != count($this->array_data[$j]) - 1) {
                    imageline($this->image, $this->width_var * $i, $this->graphheight - $height_pix, $this->width_var * ($i + 1) , $this->graphheight - $height_next_pix[$i + 1], $colorBlue);
                }
                $i++;
            }
            //print_r($height_next_pix);
            // exit;
            /*
            for($i=0;$i<$this->width_num-1;$i++)
            {
              $height_pix=round(($this->array_data[$j][$i]/$this->height_max)*$this->graphheight); 
              $height_next_pix=round($this->array_data[$j][$i+1]/$this->height_max*$this->graphheight); 
              imageline($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$this->width_var*($i+1),$this->graphheight-$height_next_pix,$colorBlue); 
            }*/
        }
        //画点
        $colorRed = imagecolorallocate($this->image, $this->colorRed[0], $this->colorRed[1], $this->colorRed[2]);
        for ($j = 0; $j < count($this->array_data); $j++) {
            $i = 0;
            foreach ($this->array_data[$j] as $key => $value) {
                $height_pix = round(($this->array_data[$j][$key] / $this->height_max) * $this->graphheight);
                imagearc($this->image, $this->width_var * $i, $this->graphheight - $height_pix, 6, 5, 0, 360, $colorRed);
                imagefilltoborder($this->image, $this->width_var * $i, $this->graphheight - $height_pix, $colorRed, $colorRed);
                $i++;
            }
            /*
            for($i=0;$i<$this->width_num;$i++)
            {
              $height_pix=round(($this->array_data[$j][$i]/$this->height_max)*$this->graphheight); 
              imagearc($this->image,$this->width_var*$i,$this->graphheight-$height_pix,6,5,0,360,$colorRed); 
              imagefilltoborder($this->image,$this->width_var*$i,$this->graphheight-$height_pix,$colorRed,$colorRed); 
            }
            */
        }
    }
    //#####################################################################################################
    function build_rectangle($select_gra) {
        if (!emptyempty($select_gra)) { //用户选择显示一个矩形
            $select_gra-= 1;
        }
        //画矩形
        //配色
        $colorDarkBlue = imagecolorallocate($this->image, $this->colorDarkBlue[0], $this->colorDarkBlue[1], $this->colorDarkBlue[2]);
        $colorLightBlue = imagecolorallocate($this->image, $this->colorLightBlue[0], $this->colorLightBlue[1], $this->colorLightBlue[2]);
        if (emptyempty($select_gra)) $select_gra = 0;
        for ($i = 0; $i < $this->width_num; $i++) {
            $height_pix = round(($this->array_data[$select_gra][$i] / $this->height_max) * $this->graphheight);
            imagefilledrectangle($this->image, $this->width_var * $i, $this->graphheight - $height_pix, $this->width_var * ($i + 1) , $this->graphheight, $colorDarkBlue);
            imagefilledrectangle($this->image, ($i * $this->width_var) + 1, ($this->graphheight - $height_pix) + 1, $this->width_var * ($i + 1) - 5, $this->graphheight - 2, $colorLightBlue);
        }
    }
    //#####################################################################################################
    function create_cloths() {
        //创建画布
        $this->image = imagecreate($this->graphwidth + 20, $this->graphheight + 20);
    }
    function create_frame() {
        //创建画框
        $this->get_var_wh();
        //配色
        $colorBg = imagecolorallocate($this->image, $this->colorBg[0], $this->colorBg[1], $this->colorBg[2]);
        $colorGrey = imagecolorallocate($this->image, $this->colorGrey[0], $this->colorGrey[1], $this->colorGrey[2]);
        //创建图像周围的框
        imageline($this->image, 0, 0, 0, $this->graphheight, $colorGrey);
        imageline($this->image, 0, 0, $this->graphwidth, 0, $colorGrey);
        imageline($this->image, ($this->graphwidth - 1) , 0, ($this->graphwidth - 1) , ($this->graphheight - 1) , $colorGrey);
        imageline($this->image, 0, ($this->graphheight - 1) , ($this->graphwidth - 1) , ($this->graphheight - 1) , $colorGrey);
    }
    function create_line() { //开源代码phprm.com
        //创建网格。
        $this->get_var_wh();
        $colorBg = imagecolorallocate($this->image, $this->colorBg[0], $this->colorBg[1], $this->colorBg[2]);
        $colorGrey = imagecolorallocate($this->image, $this->colorGrey[0], $this->colorGrey[1], $this->colorGrey[2]);
        $colorRed = imagecolorallocate($this->image, $this->colorRed[0], $this->colorRed[1], $this->colorRed[2]);
        for ($i = 1; $i <= $this->height_num; $i++) {
            //画横线
            $y1 = ($this->graphheight - ($this->height_var / $this->height_max * $this->graphheight) * $i);
            $y2 = ($this->graphheight - ($this->height_var / $this->height_max * $this->graphheight) * $i);
            imageline($this->image, 0, $y1, $this->graphwidth, $y2, $colorGrey);
            //标出数字
            imagestring($this->image, 2, 0, $this->graphheight - ($this->height_var / $this->height_max * $this->graphheight) * $i, $this->height_var * $i, $colorRed);
        }
        unset($i);
        foreach ($this->array_data[0] as $key => $value) {
            //画竖线
            imageline($this->image, $this->width_var * $i, 0, $this->width_var * $i, $this->graphwidth, $colorGrey);
            //标出数字
            imagestring($this->image, 2, $this->width_var * $i, $this->graphheight - 15, $key, $colorRed);
            $i++;
        }
        /*
        for($i=1;$i<=$this->width_num;$i++) 
        { 
           //画竖线 
           imageline($this->image,$this->width_var*$i,0,$this->width_var*$i,$this->graphwidth,$colorGrey); 
           //标出数字 
           imagestring($this->image,2,$this->width_var*$i,$this->graphheight-15,$i,$colorRed); 
        } 
        */
    }
    function build($graph, $str_var) {
        //$graph是用户指定的图形种类,$str_var是生成哪个数据的图
        header("Content-type: image/jpeg");
        $this->create_cloths(); //先要有画布啊~~
        switch ($graph) {
            case "line":
                $this->create_frame(); //画个框先:)
                $this->create_line(); //打上底格线
                $this->build_line($str_var); //画曲线
                break;
            case "rectangle":
                $this->create_frame(); //画个框先:)
                $this->build_rectangle($str_var); //画矩形
                $this->create_line(); //打上底格线
                break;
        }
        //输出图形并清除内存
        imagepng($this->image);
        imagedestroy($this->image);
    }
}


文章网址:http://www.phprm.com/tuxiang/fs4503.html

随意转载^^但请附上教程地址。

标签:php生成曲线图 php生成图形

发表留言