[PHP]GDでアンチエイリアスのかかった綺麗な楕円を描く

Pocket

PHP で正円・楕円を描画する場合、通常は GD の imageellipse() で描くことになるのですが、imageantialias() を使ってもアンチエイリアスがかからないため、ジャギーのあるギザギザした線になってしまいます。

アンチエイリアスのかかった直線を描くアルゴリズムの一つに Xiaolin Wu Line Algorithm というものがあり、そちらを応用する形で楕円を描くという手法を用いるとかなり綺麗な円を描くことができます。

wu_ellipsewu_ellipse2

様々な方法による円の描画を比較した記事 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:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です