PHPのgdライブラリを使ってアンチエイリアス付きの太い斜め線を描く方法は?
タイトルの通り、ポリゴンで描いた塗りつぶし画像がギザギザになってしまいます。 imageantialias 関数が無効です。
-----解決策--------------------------------
ビットマップ画像のエッジがギザギザになるのは避けられません
imageantialias のアンチエイリアスが有効です。オンとオフで効果を比較できます
効果に満足できない場合imageantialias の場合 (結局のところ、GD はプロ仕様の画像処理パッケージではありません)、それなら自分で行う必要があります。 プログラミングは解決しました
------解決策----------------------
彼は暗号化をスクランブルしています。時間が経ったら勉強してください。一回。
------解決策------------------
とても退屈なので、最終的には js を使用して実装されました
------解決策------------------
JS には、それを実現する既製のプラグインがあります。美しい 。 。 。 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>