欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-03-20 08:08:47
...
如何使用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();
 
怎么使用php的gd库画一条抗锯齿的粗斜线

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频