アンチエイリアスTweetこんばんは。最近はGDで画像処理を書いているので、今回はGDに関する小ネタです。imageantialiasを使用せず、画像の拡大・縮小を利用してアンチエリアス処理を行ってみます。GDで作成した画像にアンチエイリアス処理をかけて滑らかにする場合、通常はimageantialias()関数を使用します。この関数には欠点があります。GDで線を描画する際にimagesetthickness()で線の太さを変更しても、imageantialias()をかけると1ピクセルの線に書き換えられてしまう、という問題です。これを回避するためにいろいろな処理を試した結果、数倍に拡大して描画した画像を元の大きさに縮小して表示する、という方法にたどり着きました。スーパーサンプリング処理という名前が付いているらしいです。この方法を使用すれば、線の太さを保ったまま線を滑らかにすることができます。下が検証に使用したコードです。resourceを返す関数。image/png");imagepng($im);imagedestroy($im);exit;?>draw()は、線と円を描画するだけの関数ですが、引数を渡すことによって拡大時の画像の大きさを決定しています。何も渡さなければ400*400の画像を作成しリサイズも行ないません。draw(3)と指定した場合、1200*1200のキャンバスに拡大した線と円を描画し、その後400*400まで縮小します。これを試した結果が下の画像です。上から順に、1倍(未処理)、2倍、...、5倍、の結果となっています。画像の利サイズ用に、imagecopyresizedとimagecopyresampledという2つの関数が用意されていますが、imagecopyresizedでは画像がガックガクになってしまうため、imagecopyresampledを使います。画像を見てわかるとおり、下に行くほど線が滑らかになっています。線の太さもほぼ変わっていません。元画像が数千ピクセルにもなってしまうと、画像の作成に体感できる程度の時間がかかってしまいます。3倍以降からはほぼ見た目が変わっていないため、実際に使用する際は、作成コストを考えながらちょうどいい倍率を探していくのがいいかもしれません。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。