Home  >  Article  >  Backend Development  >  怎么使用php的gd库画一条抗锯齿的粗斜线

怎么使用php的gd库画一条抗锯齿的粗斜线

WBOY
WBOYOriginal
2016-06-13 13:32:422109browse

如何使用php的gd库画一条抗锯齿的粗斜线?
如题,使用多边形画的填充图是有锯齿的。imageantialias函数是无效的。

------解决方案--------------------
点阵图有锯齿是必然的
imageantialias 的抗锯齿是有作用的,你可以对比他打开和关闭时的效果
如果你对 imageantialias 的效果不满意(毕竟GD不是专业的图像处理包),那就要你自己编程解决了

------解决方案--------------------
他是扰码加密的,有空研究一下
------解决方案--------------------
好无聊啊,最终是用 js 实现的
------解决方案--------------------
JS有现成的插件 做出来的很漂亮。。。用PHP干嘛
------解决方案--------------------
给你一个早年写的代码,供参考

PHP code
create(func_get_arc(0),func_get_arc(1));
    else
        $this->create(400,300);
  }
  /**
   * 在($x,$y)处画点
   */
  function pixel($x,$y) {
    $p = $this->get_view($x,$y);
    imagesetpixel($this->im,$p['x'],$p['y'],$this->color);
    $this->xo = $p['x'];
    $this->yo = $p['y'];
  }
  /**
   * 移动到($x,$y)处
   */
  function moveto($x,$y) {
    $p = $this->get_view($x,$y);
    $this->xo = $p['x'];
    $this->yo = $p['y'];
  }
  /**
   * 从($x1,$y1)到($x2,$y2)处画线
   */
  function line($x1,$y1,$x2,$y2) {
    $p1 = $this->get_view($x1,$y1);
    $p2 = $this->get_view($x2,$y2);
    imageline($this->im,$p1['x'],$p1['y'],$p2['x'],$p2['y'],$this->color);
  }
  /**
   * 从当前位置到($x,$y)处画线
   */
  function lineto($x,$y) {
    $p = $this->get_view($x,$y);
    imageline($this->im, $this->xo, $this->yo, $p['x'], $p['y'], $this->color);
    $this->xo = $p['x'];
    $this->yo = $p['y'];
  }
  /**
   * 设置当前颜色
   */
  function color($clr) {
    $r = ($clr>>16) & 0xff; 
    $g = ($clr>>8) & 0xff; 
    $b = ($clr) & 0xff; 
    $this->color = ImageColorAllocate($this->im, $r,$g,$b);
    $this->fillcolor = ImageColorAllocate($this->im, $r,$g,$b);
    $this->filldarkcolor = ImageColorAllocate($this->im, $r/2,$g/2,$b/2);
    return $this->color;
  }
  /**
   * 设置当前充填颜色
   */
  function fillcolor($clr) {
    $r = ($clr>>16) & 0xff; 
    $g = ($clr>>8) & 0xff; 
    $b = ($clr) & 0xff; 
    $this->fillcolor = ImageColorAllocate($this->im, $r,$g,$b);
    return $this->fillcolor;
  }
  /**
   * 创建GD句柄并设置坐标系
   */
  function create($x,$y) {
    $this->im = imagecreatetruecolor($x,$y);
imageantialias($this->im, 1);
imagefill($this->im, 0, 0, $this->color(0xffffff));
    $this->viewx = $x-1;
    $this->viewy = -($y-1);
    $this->winx = $x;
    $this->winy = $y;
    $this->orgx = 0;
    $this->orgy = 0;//$y;
    $this->colors = $this->color(0xffffff);

    settype($this->ksin,"double");
    settype($this->kcos,"double");
    $this->ksin = sin(deg2rad(0));
    $this->kcos = cos(deg2rad(0));
  }
  /**
   * 坐标映射
   */
  function get_view($x,$y) {
    $this->xo = $x*$this->kcos - $y*$this->ksin;
    $this->yo = $x*$this->ksin + $y*$this->kcos;
    $p['x'] = ($this->xo + $this->orgx)*($this->viewx/$this->winx);
    $p['y'] = ($this->yo + $this->orgy)*($this->viewy/$this->winy)-$this->viewy;
    return $p;
  }
  /**
   * 设置限度
   */
  function set_ext($x,$y=0) {
    $this->winx = $x;
    if($y == 0) {
        $this->winy = - $x * $this->viewy / $this->viewx;
    }else {
        $this->winy = $y;
    }
  }
  /**
   * 设置旋转角
   */
  function set_r($p) {
    $this->ksin = sin(deg2rad($p));
    $this->kcos = cos(deg2rad($p));
  }
  /**
   * 构造图形,必需在派生类中重载本方法
   */
  function paint() {
    /**
     * 必需由派生类重载
     * 必需包含语句 $this->create(宽度,高度);
     */
    die("paint 方法必需由派生类重载!");
  }
  /**
   * 输出图形
   */
  function run() {
    $this->paint();
    $func = "Image".$this->type;
    if(! function_exists($func)) {
        $this->type = "png";
        $func = "Image".$this->type;
    }
    Header("Content-type: image/{$this->type}");
    $func($this->im);
    imageDestroy($this->im);
  }

  /**
   * 圆类图形数据生成,参数$p为坐标旋转角
   */
  function get_point($ox,$oy,$w,$h,$start,$end) {
    $a = $w/2;
    $b = $h/2;
    $rs = array();
    $i = $start;
    for($i=$start;$iget_view($ox+$x,$oy+$y);
        $rs[] = $p['x'];
        $rs[] = $p['y'];
        if($i == $end) break;
        if($i+5 > $end) $i = $end - 5;
    }
    $p = $this->get_view($ox,$oy);
    $rs[] = $p['x'];
    $rs[] = $p['y'];
    $rs[] = $rs[0];
    $rs[] = $rs[1];
    return $rs;
  }
  /**
   * 弓形
   */
  function chord($left,$top,$w,$h,$start,$end,$z=0) {
    $ar = $this->get_point($left,$top,$w,$h,$start,$end,$p);
    for($i=0;$iget_view($ar[$i],$ar[$i+1]);
        $ar[$i] = $p['x'];
        $ar[$i+1] = $p['y'];
    }
    imagefilledpolygon($this->im,$ar,count($ar)/2-1,$this->fillcolor);
    imagepolygon($this->im,$ar,count($ar)/2-1,$this->color);
  }
  /**
   * 扇形
   */
  function pie($left,$top,$w,$h,$start,$end,$z=0) {
    $this->get_view($left,$top+$z);
    $ar = $this->get_point($left,$top+$z,$w,$h,$start,$end);
    $this->get_view($left,$top);
    $arh = $this->get_point($left,$top,$w,$h,$start,$end);
    for($j=0;$jfilltype)
            imagefilledpolygon($this->im,$t,4,$this->filldarkcolor);
        else
            imagepolygon($this->im,$t,4,$this->color);
    }
    if($this->filltype)
        imagefilledpolygon($this->im,$ar,count($ar)/2-1,$this->fillcolor);
  }
  /**
   * 弧形
   */
  function arc($left,$top,$w,$h,$start,$end,$z=0) {
    $ar = $this->get_point($left,$top,$w,$h,$start,$end,$p);
    $this->moveto($ar[0],$ar[1]);
    for($i=2;$ilineto($ar[$i],$ar[$i+1]);
  }
}

/**
 * 重载基类的paint方法
 */
class myGraph extends Graph {
  function paint() {
//    $this->create(400,300);
    $this->create(200,150);
$this->set_ext(400);
    $this->set_r(10); // 旋转
    $this->filltype = false; //充填
    $k = 40;    //高
    $a =200;    //中心x
    $b = 150;    //中心y
    $c = 200;    //长轴
    $d = 100;    //短轴

    $this->color(0x000000);
    $this->color(0xff0000);
    $this->pie($a,$b,$c,$d,0,100,$k);
    $this->color(0x00ff00);
    $this->pie($a,$b,$c,$d,120,240,$k);
    $this->color(0x0000ff);
    $this->pie($a+10,$b-10,$c,$d,240,360,$k);
    $this->color(0x8080ff);
    $this->pie(50,80,40,20,0,360,50);
    $this->line($a,0,$a,$b*2);
    $this->line(0,$b,$a*2,$b);
  }
}

$g = new myGraph;
$g->run();
 
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn