PHP で正円・楕円を描画する場合、通常は GD の imageellipse() で描くことになるのですが、imageantialias() を使ってもアンチエイリアスがかからないため、ジャギーのあるギザギザした線になってしまいます。
アンチエイリアスのかかった直線を描くアルゴリズムの一つに Xiaolin Wu Line Algorithm というものがあり、そちらを応用する形で楕円を描くという手法を用いるとかなり綺麗な円を描くことができます。
様々な方法による円の描画を比較した記事 Drawing Antialiased Circles and Ellipses (by Stephan Brumme) を参考に imageellipse() と同じ使い方ができるように関数化してみました。
<?php function wu_ellipse($image, $cx, $cy, $width, $height, $color){ $rx = $width / 2; $ry = $height / 2; $rx2 = $rx * $rx; $ry2 = $ry * $ry; $quarter = round($rx2 / sqrt($rx2 + $ry2)); for ($x = 0; $x <= $quarter; $x++) { $y = $ry * sqrt(1 - $x*$x / $rx2); $error = $y - floor($y); $transparency = round($error * 0x7F); $alpha = $color | ($transparency << 24); $alpha2 = $color | ((0x7F - $transparency) << 24); plot4points($image, $cx, $cy, $x, floor($y), $alpha); plot4points($image, $cx, $cy, $x, floor($y)+1, $alpha2); } $quarter = round($ry2 / sqrt($rx2 + $ry2)); for ($y = 0; $y <= $quarter; $y++) { $x = $rx * sqrt(1 - $y*$y / $ry2); $error = $x - floor($x); $transparency = round($error * 0x7F); $alpha = $color | ($transparency << 24); $alpha2 = $color | ((0x7F - $transparency) << 24); plot4points($image, $cx, $cy, floor($x), $y, $alpha); plot4points($image, $cx, $cy, floor($x)+1, $y, $alpha2); } } function plot4points($image, $cx, $cy, $dx, $dy, $color) { imagesetpixel($image, $cx + $dx, $cy + $dy, $color); imagesetpixel($image, $cx - $dx, $cy + $dy, $color); imagesetpixel($image, $cx + $dx, $cy - $dy, $color); imagesetpixel($image, $cx - $dx, $cy - $dy, $color); } $image = imagecreatetruecolor(300, 300); $color = imagecolorallocate($image, 0x33, 0x33, 0x33); $bg = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); imagefill ($image, 0, 0, $bg); $width = 240; $height = 240; $cx = 150; $cy = 150; wu_ellipse($image, $cx, $cy, $width, $height, $color); header("Content-type: image/png"); imagepng($image);
【参考】
Fast, Antialiased Circles and Ellipses from Xiaolin Wu’s concepts
Drawing Antialiased Circles and Ellipses
Similar Posts:
- [PHP]3次スプライン曲線を使ったスプライン補間
- [PHP]マスク画像で写真を好きな形に切り抜く(クリッピングマスク)
- [PHP]レーダーチャート(クモの巣グラフ)をGDで描画する
- [PHP]GDを使った棒グラフの描画
- [PHP]GDで折れ線グラフを描画する(改訂版)
- [PHP]円グラフを表示する(GD)
- [PHP]中心から角度を指定して線を引く(座標の回転)
- [PHP]GDを使ってグラデーション画像をつくる