PHPのgdライブラリを使用してアンチエイリアス付きの太いスラッシュを描画する方法

WBOY
リリース: 2016-06-13 13:32:42
オリジナル
2233 人が閲覧しました

PHPのgdライブラリを使ってアンチエイリアス付きの太い斜め線を描く方法は?
タイトルの通り、ポリゴンで描いた塗りつぶし画像がギザギザになってしまいます。 imageantialias 関数が無効です。

-----解決策--------------------------------
ビットマップ画像のエッジがギザギザになるのは避けられません
imageantialias のアンチエイリアスが有効です。オンとオフで効果を比較できます
効果に満足できない場合imageantialias の場合 (結局のところ、GD はプロ仕様の画像処理パッケージではありません)、それなら自分で行う必要があります。 プログラミングは解決しました

------解決策----------------------
彼は暗号化をスクランブルしています。時間が経ったら勉強してください。一回。
------解決策------------------
とても退屈なので、最終的には js を使用して実装されました
------解決策------------------
JS には、それを実現する既製のプラグインがあります。美しい 。 。 。 PHP を使用する理由
------解決策------------------
给你一早年写本的代码、提供参考

PHP コード
<?php
//error_reporting(E_ALL ^ E_NOTICE);

クラスグラフ{
  /*** 疑似3D描画クラス*/
  変数$im;
  var $type = "gif"; // png,gif,jpeg,wbmp
  var $xo;
  var $yo;
  var $color;
  var $fillcolor;
  var $filldarkcolor;
  var $filltype = true;
  var $orgx;
  var $orgy;
  var $viewx;
  var $viewy;
  var $winx;
  var $winy;
  var $extx = 1;
  var $exty = -1;
  var $ksin;
  var $kcos;

  関数グラフ() {
    if(func_num_args() == 2)
        $this->create(func_get_arc(0),func_get_arc(1));
    それ以外
        $this->create(400,300);
  }
  /*** ($x,$y) に点を描画します*/
  関数ピクセル($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) に移動*/
  関数 moveto($x,$y) {
    $p = $this->get_view($x,$y);
    $this->xo = $p['x'];
    $this->yo = $p['y'];
  }
  /*** ($x1,$y1) から ($x2,$y2) まで線を描きます。*/
  関数行($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)まで線を描きます*/
  関数 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'];
  }
  /*** 現在の色を設定します*/
  関数 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);
    $this->色を返します;
  }
  /*** 現在の塗りつぶしの色を設定します*/
  関数 fillcolor($clr) {
    $r = ($clr>>16) & 0xff; 
    $g = ($clr>>8) & 0xff; 
    $b = ($clr) & 0xff; 
    $this->fillcolor = ImageColorAllocate($this->im, $r,$g,$b);
    $this->fillcolor; を返します。
  }
  /**※GDハンドルの作成と座標系の設定*/
  関数作成($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));
  }
  /***座標マッピング*/
  関数 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;
    $p を返します。
  }
  /*** 制限を設定する*/
  関数 set_ext($x,$y=0) {
    $this->winx = $x;
    if($y == 0) {
        $this->winy = - $x * $this->viewy / $this->viewx;
    }それ以外 {
        $this->winy = $y;
    }
  }
  /*** 回転角度を設定します*/
  関数 set_r($p) {
    $this->ksin = sin(deg2rad($p));
    $this->kcos = cos(deg2rad($p));
  }
  /*** グラフィックスを構築するには、このメソッドを派生クラスでオーバーロードする必要があります*/
  関数ペイント() {
    /*** 派生クラスによってオーバーロードする必要があります
     * ステートメント $this->create(width, height); を含める必要があります。*/
    die("ペイント方法必須由派生类重ダウンロード!");
  }
  /*** 出力グラフィックス*/
  関数 run() {
    $this->paint();
    $func = "画像".$this->type;
    if(! function_exists($func)) {
        $this->type = "png";
        $func = "画像".$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 = 配列();
    $i = $start;
    for($i=$start;$iget_view($ox+$x,$oy+$y);
        $rs[] = $p['x'];
        $rs[] = $p['y'];
        if($i == $end) ブレーク;
        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];
    $rs を返します。
  }
  /***アーチ型*/
  関数コード($left,$top,$w,$h,$start,$end,$z=0) {
    $ar = $this->get_point($left,$top,$w,$h,$start,$end,$p);
    for($i=0;$i<count>get_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);
  }
  /***扇形*/
  関数 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;$j<count if>filltype)
            imagefilledpolygon($this->im,$t,4,$this->filldarkcolor);
        それ以外
            imagepolygon($this->im,$t,4,$this->color);
    }
    if($this->filltype)
        imagefilledpolygon($this->im,$ar,count($ar)/2-1,$this->fillcolor);
  }
  /*** アーク*/
  関数 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;$i<count>lineto($ar[$i],$ar[$i+1]);
  }
}

/*** 基本クラスのペイントメソッドをオーバーロードします。*/
クラス myGraph extends Graph {
  関数ペイント() {
// $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;    //中心
    $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 = 新しい myGraph;
$g->run();
 <div class="clear"></div></count></count></count>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート