2010年9月15日
imageantialiasを使用せず画像の拡大・縮小でアンチエイリアス処理を行う
こんばんは。松田です。
最近はGDで画像処理を書いているので、今回はGDに関する小ネタです。
imageantialiasを使用せず、画像の拡大・縮小を利用してアンチエリアス処理を行ってみます。
GDで作成した画像にアンチエイリアス処理をかけて滑らかにする場合、通常はimageantialias()関数を使用します。
ですが、この関数には欠点があります。
GDで線を描画する際にimagesetthickness()で線の太さを変更しても、imageantialias()をかけると1ピクセルの線 に書き換えられてしまう、という問題です。
これを回避するためにいろいろな処理を試した結果、数倍に拡大して描画した画像を元の大きさに縮小して表示する、という方法にたどり着きました。
スーパーサンプリング処理という名前が付いているらしいです。
この方法を使用すれば、線の太さを保ったまま線を滑らかにすることができます。
下が検証に使用したコードです。
<?php
/*
* 円と線を描画したimage resourceを返す関数。
* 通常は400*400の画像を作成する
* 引数を指定すると、その倍率分だけ描画する範囲を広げる
*
* draw(3)の場合、400*3=1200ピクセルの 画像を描画した後、縮小処理を行う
*/
function draw($bai = 1) {
// 通常は400px * 400px の画像を描画
$width = 400 * $bai;
$height = 400 * $bai;
$im = ImageCreateTrueColor($width, $height);
$white = ImageColorAllocate($im, 255, 255, 255);
$black = ImageColorAllocate($im, 0, 0, 0);
$blue = ImageColorAllocate($im, 0, 0, 255);
// 背景を真っ白に
imagefilltoborder($im, 0, 0, $white, $white);
// 線の太さを5に設定
imagesetthickness($im, 5*$bai);
// 楕円描画
imagefilledellipse($im, $width/2, $height/2, 200*$bai, 250*$bai, $blue);
// 線を描画
imageline($im, 10*$bai, 10*$bai, 300*$bai, 400*$bai, $black);
if ($bai > 1) {
// 倍率が指定されていたら、400*400に縮小する
$dst =