[PHP]GDで図形を描画する際のジャギーを軽減する(アンチエイリアス)

Pocket

通常 GD を用いて円や直線を描画した場合、全くアンチエイリアス処理がなされないため、縁がギザギザしているように見えてしまいます。(ジャギー)

1

精度の高い軽量なアンチエイリアス処理(ジャギーを軽減する処理)を求めるなら何らかのアルゴリズムを使った計算を行うべきですが、今回は単純に、あらかじめ大きな画像として描画しておいて、それを表示サイズまで縮小する方法でジャギーを軽減してみます。

2
2倍

3
3倍

二倍サイズで描画したものを表示サイズに縮小するだけでかなりジャギーは目立たなくなります。
三倍ならほとんど気になりません。

GD のリサイズではピクセルの補間が行われるため拡大・縮小時には滑らかに処理されます。
今回の方法はその性質を利用したものです。

本来 GD には imageantialias() という専用の関数があるのですが、環境や対象によっては機能しないことが多いので、現時点ではこの手法も役に立つと思います。

・検証用サンプル

<?php
$canvas_size = 120;
$circle_size = 100;
$scale = 3;

$image	 = imagecreatetruecolor($canvas_size, $canvas_size);
$circle	 = imagecreatetruecolor($canvas_size * $scale, $canvas_size * $scale);

$color = imagecolorallocate( $circle, 255, 255, 255 );
imagefilledellipse($circle, $canvas_size * $scale / 2, $canvas_size * $scale / 2, $circle_size * $scale, $circle_size * $scale, $color);
imagecopyresampled($image, $circle, 0, 0, 0, 0, $canvas_size, $canvas_size, $canvas_size * $scale, $canvas_size * $scale);

header("Content-type: image/png");
imagepng($image);

imagedestroy($image);
imagedestroy($circle);

Similar Posts:




コメントを残す

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